মতবাদ - কিভাবে প্রস্তুত বয়ান নয়, আসল স্ক্যুয়ালটি কীভাবে প্রিন্ট করা যায়?


167

আমরা ডক্ট্রাইন, একটি পিএইচপি ওআরএম ব্যবহার করছি। আমি এই জাতীয় একটি কোয়েরি তৈরি করছি:

$q = Doctrine_Query::create()->select('id')->from('MyTable');

এবং তারপরে ফাংশনটিতে আমি যুক্ত করছি যেখানে ক্লোজ এবং যথাযথ জিনিসগুলি এই জাতীয়

$q->where('normalisedname = ? OR name = ?', array($string, $originalString));

পরে, এই execute()ক্যোয়ারী অবজেক্টটি- করার আগে , আমি এটি পরীক্ষা করতে কাঁচা এসকিউএল মুদ্রণ করতে চাই এবং এটি করতে:

$q->getSQLQuery();

তবে এটি কেবল সম্পূর্ণ বিবরণ নয়, প্রস্তুত বিবৃতি মুদ্রণ করে। আমি এটি মাইএসকিউএল-এ কী পাঠাচ্ছে তা দেখতে চাই, তবে পরিবর্তে এটি একটি প্রস্তুত বিবৃতি মুদ্রণ করছে যার মধ্যে রয়েছে ?। 'পূর্ণ' কোয়েরি দেখার কোনও উপায় আছে কি?


আমি পুরো ক্যোয়ারীটি দেখতে সর্বোত্তম উপায়ে এই উত্তরে বর্ণিত হয়েছে: stackoverflow.com/a/678310/229077
মেরেক

আপনি ডক্ট্রাইন দ্বারা করা কাজের সুবিধা নিতে পারেন (প্রোফাইলার একটি চলমান কোয়েরি প্রদর্শন করছে)। বিস্তারিত জানার জন্য নীচে আমার উত্তর দেখুন
ভিনসেন্ট Pazeller

উত্তর:


164

মতবাদ ডাটাবেস সার্ভারে একটি "সত্যিকারের এসকিউএল কোয়েরি" পাঠাচ্ছে না: এটি আসলে প্রস্তুত বিবৃতি ব্যবহার করছে, যার অর্থ:

  • বিবৃতি প্রেরণ করা, এটি প্রস্তুত করার জন্য (এটি এটি দ্বারা প্রত্যাবর্তিত হয় $query->getSql())
  • এবং তারপরে, প্যারামিটারগুলি প্রেরণ করা (এর দ্বারা ফিরে $query->getParameters())
  • এবং প্রস্তুত বিবৃতি কার্যকর

এর অর্থ পিএইচপি সাইডে কখনও "আসল" এসকিউএল কোয়েরি নেই - সুতরাং, মতবাদ এটি প্রদর্শন করতে পারে না।


14
পাস্কাল: আপনি এটি "সত্যিকারের এসকিউএল ক্যোয়ারী" না বলবেন না কারণ প্রস্তুত বিবৃতিটি সত্যই এসকিউএল কোয়েরি, এটি কেবলমাত্র প্যারামিটারগুলি পৃথকভাবে প্রেরণ করে। এই শব্দটি লোকেদের বিভ্রান্ত করতে পারে (উদাঃ অলিভিয়ারপন্স.ফr / ২০১৪ / ২০১৩ / ২২ / সাইমফনি ২- সুবিধাগুলি-et- তথ্যসূচক )।
ম্যাথিউ নাপোলি

$query->getParameters();সঠিক ক্রমে প্যারামিটারগুলি ফিরবে না, কারণ তারা প্রস্তুত ক্যোয়ারী বিবৃতিতে উপস্থিত হওয়া উচিত
gondo

4
আমি মনে করি যে এখানে প্রশ্নের লেখক কোন মতবাদ পাঠায় বা না সেদিকে খেয়াল রাখেনি। কোন ব্যবহারকারী এবং আমি জানতে চেয়েছিলাম তা হল কীভাবে ক্যোয়ারী পাওয়া যায় যা আমরা প্যারামিটারগুলির সাথে ম্যানুয়ালি প্রশ্ন চিহ্নগুলি প্রতিস্থাপন না করেই পেস্ট অনুলিপি করতে পারি এবং চালাতে পারি। কোডিগিনিটারে পছন্দ করুন। আমি মনে করি এটি আমি সিমফনি ডিবাগারে পেয়েছি তবে কমান্ড লাইন থেকে স্ক্রিপ্ট চালানোর সময় আমি এখনও খুঁজে পাচ্ছি না।
দারিয়াস.ভি

104

একটি কার্যকরী উদাহরণ:

$qb = $this->createQueryBuilder('a');
$query=$qb->getQuery();
// SHOW SQL: 
echo $query->getSQL(); 
// Show Parameters: 
echo $query->getParameters();

5
এটি ভেরিয়েবল অ্যাসাইনমেন্ট হিসাবে কাজ করে, আপনি এটি বিবেচনা করতে চাইতে পারেন: মুদ্রণ $ ক্যোয়ারী-> getSQL (); foreach ($ ক্যুরি-> getParaters () $ পরম হিসাবে) {মুদ্রণ "{$ param-> getName ()} -> {m পরম-> getValue ()} \ n"; } যেহেতু আপনি আরও পঠনযোগ্য আউটপুট পাবেন
জাস্টিন ফিনকেলস্টাইন

এটি লিটল সুবিধা দেয়। আমি যখন বর্গলিপিটি অনুলিপি করি, তখনও আমার কাছে উইচির প্যারামিটারটি ম্যানুয়ালি sertোকানো উচিত, এতে অনেক সময় লাগে। আমরা sertedোকানো প্যারামিটারগুলির সাথে একটি প্রশ্ন চাই, কেন আমরা এটি এত দীর্ঘ খুঁজে পাচ্ছি না? এমনকি কোডিগিটার ফ্রেমওয়ার্কে যতদূর আমার মনে আছে, প্রোফাইলে আপনি কোয়েরিটি অনুলিপি করতে পারবেন এবং ম্যানুয়ালি ছাড়াই তাত্ক্ষণিকভাবে চলতে পারেন। সিমফোনিতেও আমাদের একই দরকার।
দারিয়াস.ভি

35

আপনি যদি মাইএসকিএলে সমস্ত প্রশ্নের লগইন করেন তবে আপনি আপনার অ্যাপ্লিকেশন দ্বারা সম্পাদিত ক্যোয়ারীটি পরীক্ষা করতে পারেন:

http://dev.mysql.com/doc/refman/5.1/en/query-log.html

আপনি যে সন্ধান করছেন কেবল এটিই নয় তবে আপনি এটির জন্য গ্রেপ করতে পারেন এমন আরও প্রশ্ন থাকবে।

তবে সাধারণত ->getSql();কাজ করে

সম্পাদনা:

আমি যে সমস্ত mysql জিজ্ঞাসা করি সেগুলি দেখার জন্য

sudo vim /etc/mysql/my.cnf 

এবং এই 2 লাইন যুক্ত করুন:

general_log = on
general_log_file = /tmp/mysql.log

এবং mysql পুনরায় আরম্ভ করুন


17

আমি একটি ডক্ট্রাইন 2 লগার তৈরি করেছি যা ঠিক এটি করে। এটি ডক্ট্রাইন 2 এর নিজস্ব ডেটা টাইপ কথোপকথন ব্যবহার করে মানগুলির সাথে প্যারামিট্রাইজড এসকিএল কোয়েরিটি "হাইড্রেটস" করে।

<?php


namespace Drsm\Doctrine\DBAL\Logging;
use Doctrine\DBAL\Logging\SQLLogger,
    Doctrine\DBAL\Types\Type,
    Doctrine\DBAL\Platforms\AbstractPlatform;
/**
 * A SQL logger that logs to the standard output and
 * subtitutes params to get a ready to execute SQL sentence

 * @author  dsamblas@gmail.com
 */
class EchoWriteSQLWithoutParamsLogger implements SQLLogger

{
    const QUERY_TYPE_SELECT="SELECT";
    const QUERY_TYPE_UPDATE="UPDATE";
    const QUERY_TYPE_INSERT="INSERT";
    const QUERY_TYPE_DELETE="DELETE";
    const QUERY_TYPE_CREATE="CREATE";
    const QUERY_TYPE_ALTER="ALTER";

    private $dbPlatform;
    private $loggedQueryTypes;
    public function __construct(AbstractPlatform $dbPlatform, array $loggedQueryTypes=array()){
        $this->dbPlatform=$dbPlatform;
        $this->loggedQueryTypes=$loggedQueryTypes;
    }
    /**
     * {@inheritdoc}
     */
    public function startQuery($sql, array $params = null, array $types = null)

    {
        if($this->isLoggable($sql)){
            if(!empty($params)){
                foreach ($params as $key=>$param) {
                    $type=Type::getType($types[$key]);
                    $value=$type->convertToDatabaseValue($param,$this->dbPlatform);
                    $sql = join(var_export($value, true), explode('?', $sql, 2));
                }

            }
            echo $sql . " ;".PHP_EOL;
        }
    }

    /**
     * {@inheritdoc}
     */
    public function stopQuery()
    {

    }
    private function isLoggable($sql){
        if (empty($this->loggedQueryTypes)) return true;
        foreach($this->loggedQueryTypes as $validType){
            if (strpos($sql, $validType) === 0) return true;
        }
        return false;
    }
}

ব্যবহারের উদাহরণ:; নিম্নলিখিত কোডের শান্তি মান আউটপুটে প্রতিধ্বনিত হবে যে কোনও INSERT, আপডেট, এসএমএল বাক্যগুলি মুছে ফেলবে Ent em সত্তা পরিচালক,

/**@var  \Doctrine\ORM\EntityManager $em */
$em->getConnection()
                ->getConfiguration()
                ->setSQLLogger(
                    new EchoWriteSQLWithoutParamsLogger(
                        $em->getConnection()->getDatabasePlatform(),
                        array(
                            EchoWriteSQLWithoutParamsLogger::QUERY_TYPE_UPDATE,
                            EchoWriteSQLWithoutParamsLogger::QUERY_TYPE_INSERT,
                            EchoWriteSQLWithoutParamsLogger::QUERY_TYPE_DELETE
                        )
                    )
                );

1
প্যারামিটারগুলি '2019-01-01'
ডারিয়াস.ভি

14

getSqlQuery() প্রযুক্তিগতভাবে পুরো এসকিউএল কমান্ডটি দেখায়, তবে আপনি প্যারামিটারগুলিও দেখতে পারলে এটি অনেক বেশি কার্যকর।

echo $q->getSqlQuery();
foreach ($q->getFlattenedParams() as $index => $param)
  echo "$index => $param";

এই প্যাটার্ন আরো পুনর্ব্যবহারযোগ্য তৈরি করতে হলে, সেখানে বর্ণিত একটা চমৎকার প্রবেশপথ মন্তব্যমতবাদ ক্যোয়ারী বস্তু থেকে কাঁচা এসকিউএল


আমি জানি এটি একটি পুরানো পোস্ট, তবে আপনার উভয় লিঙ্কই 404 পৃষ্ঠায় নিয়ে গেছে। আপনি আপনার উত্তর আপডেট করতে পারেন দয়া করে? আমি জিজ্ঞাসা করছি, কারণ আপনি কী বলতে চাইছেন তা আমি নিশ্চিত নই $q। এটি কোয়েরি বা ক্যোয়ারী নির্মাতা বলে মনে হচ্ছে না।
k00ni

1
আমি ভীত আমি আরও পুনরায় ব্যবহারযোগ্য কোডটি খুঁজে পাচ্ছি না। $qএক্ষেত্রে একটি মতবাদ 1 কোয়েরি। আপনি হয়ত মতবাদ 2 ব্যবহার করছেন, সেক্ষেত্রে আপনি $qb = $this->createQueryBuilder('a'); $q = $qb->getQuery(); $sql = $q->getSQL(); $params = $q->getParameters(); আশা মতো কিছু চাইবেন !
22:40

13

অন্য কোন আসল জিজ্ঞাসা নেই, প্রস্তুত বিবৃতিগুলি এভাবে কাজ করে। মানগুলি অ্যাপ্লিকেশন স্তরে নয়, ডাটাবেস সার্ভারে আবদ্ধ।

এই প্রশ্নের আমার উত্তর দেখুন: পিডিও সহ পিএইচপি-তে, কীভাবে চূড়ান্ত এসকিউএল প্যারাম্যাট্রাইজড কোয়েরি পরীক্ষা করবেন?

(সুবিধার জন্য এখানে পুনরাবৃত্তি :)

প্যারামেট্রিসড মান সহ প্রস্তুত বিবৃতি ব্যবহার করা গতিশীলভাবে এসকিউএল এর স্ট্রিং তৈরির অন্য উপায় নয়। আপনি ডাটাবেসে একটি প্রস্তুত বিবৃতি তৈরি করুন এবং তারপরে প্যারামিটারের মানগুলি একাই প্রেরণ করুন।

সুতরাং সম্ভবত যা ডাটাবেসে প্রেরণ করা হবে তা হ'ল এক PREPARE ..., SET ...শেষ পর্যন্তEXECUTE ....

আপনি কিছু এসকিউএল স্ট্রিং পেতে সক্ষম হবেন না SELECT * FROM ..., এমনকি যদি এটি সমমানের ফলাফলও অর্জন করে, কারণ এমন কোনও কোয়েরি আসলে ডেটাবেজে প্রেরণ করা হয়নি।


9

আমার সমাধান:

 /**
 * Get SQL from query
 * 
 * @author Yosef Kaminskyi 
 * @param QueryBilderDql $query
 * @return int
 */
public function getFullSQL($query)
{
    $sql = $query->getSql();
    $paramsList = $this->getListParamsByDql($query->getDql());
    $paramsArr =$this->getParamsArray($query->getParameters());
    $fullSql='';
    for($i=0;$i<strlen($sql);$i++){
        if($sql[$i]=='?'){
            $nameParam=array_shift($paramsList);

            if(is_string ($paramsArr[$nameParam])){
                $fullSql.= '"'.addslashes($paramsArr[$nameParam]).'"';
             }
            elseif(is_array($paramsArr[$nameParam])){
                $sqlArr='';
                foreach ($paramsArr[$nameParam] as $var){
                    if(!empty($sqlArr))
                        $sqlArr.=',';

                    if(is_string($var)){
                        $sqlArr.='"'.addslashes($var).'"';
                    }else
                        $sqlArr.=$var;
                }
                $fullSql.=$sqlArr;
            }elseif(is_object($paramsArr[$nameParam])){
                switch(get_class($paramsArr[$nameParam])){
                    case 'DateTime':
                             $fullSql.= "'".$paramsArr[$nameParam]->format('Y-m-d H:i:s')."'";
                          break;
                    default:
                        $fullSql.= $paramsArr[$nameParam]->getId();
                }

            }
            else                     
                $fullSql.= $paramsArr[$nameParam];

        }  else {
            $fullSql.=$sql[$i];
        }
    }
    return $fullSql;
}

 /**
 * Get query params list
 * 
 * @author Yosef Kaminskyi <yosefk@spotoption.com>
 * @param  Doctrine\ORM\Query\Parameter $paramObj
 * @return int
 */
protected function getParamsArray($paramObj)
{
    $parameters=array();
    foreach ($paramObj as $val){
        /* @var $val Doctrine\ORM\Query\Parameter */
        $parameters[$val->getName()]=$val->getValue();
    }

    return $parameters;
}
 public function getListParamsByDql($dql)
{
    $parsedDql = preg_split("/:/", $dql);
    $length = count($parsedDql);
    $parmeters = array();
    for($i=1;$i<$length;$i++){
        if(ctype_alpha($parsedDql[$i][0])){
            $param = (preg_split("/[' ' )]/", $parsedDql[$i]));
            $parmeters[] = $param[0];
        }
    }

    return $parmeters;}

ব্যবহারের উদাহরণ:

$query = $this->_entityRepository->createQueryBuilder('item');
$query->leftJoin('item.receptionUser','users');
$query->where('item.customerid = :customer')->setParameter('customer',$customer)
->andWhere('item.paymentmethod = :paymethod')->setParameter('paymethod',"Bonus");
echo $this->getFullSQL($query->getQuery());

এর জন্য আপনাকে ধন্যবাদ: ডি
সাদ অচেমলাল

খুব সুন্দর. স্বাভাবিক জিজ্ঞাসাগুলির সাথে কাজ করে তবে আমি রিজেপএক্সের সাথে একটি কোয়েরি পেয়েছি এবং দেখে মনে হচ্ছে এটি $ qb = $ this-> createQueryBuilder ('r') -> অভ্যন্তরজয়েন ('r.profile', 'p') -> অ্যাডসलेक्ट (' p ') -> যেখানে (' REGEXP (: fileNamePattern, r.fileNamePattern) = 1 ') -> এবং কোথায় (' p.incomingLocation =: ইনকামিং লোকেশন ') -> সেটপ্যারামিটার ([' fileNamePattern '=> $ ফাইলের নাম,' ইনকামিং লোকেশন ') => $ অবস্থান]) -> getQuery ();
ফাহিম

সমস্ত প্রশ্নের সাথে কাজ করে না। আমার যখন এটি ছিল -> সেটপ্যারামিটারগুলি (অ্যারে ('বীমাকার্যারি' => $ বীমাক্যারিয়ার, 'ডেটফ্র্যাম' => $ ডেটফ্রম-> ফর্ম্যাট) ('ইয়াম-ডি'), 'ডেটটিও' => $ ডেটটি-> ফর্ম্যাট ('Ym- d '),)) এগুলি কি বাকি ছিল? বর্গক্ষেত্রে চিহ্ন।
দারিয়াস.ভি

9

আপনি নিম্নলিখিত পদ্ধতির সাহায্যে সহজেই এসকিউএল প্যারামিটারগুলি অ্যাক্সেস করতে পারেন।

   $result = $qb->getQuery()->getSQL();

   $param_values = '';  
   $col_names = '';   

   foreach ($result->getParameters() as $index => $param){              
            $param_values .= $param->getValue().',';
            $col_names .= $param->getName().',';
   } 

   //echo rtrim($param_values,',');
   //echo rtrim($col_names,',');    

সুতরাং আপনি যদি মুদ্রিত করেন $param_valuesএবং $col_names, আপনি স্কয়ার এবং সংশ্লিষ্ট কলামের নামগুলির মধ্য দিয়ে প্যারামিটার মানগুলি পেতে পারেন।

দ্রষ্টব্য: যদি $paramঅ্যারেটি ফেরত দেয় তবে আপনাকে পুনরাবৃত্তি করতে হবে, কারণ অভ্যন্তরের প্যারামিটারগুলি IN (:?)সাধারণত নেস্টেড অ্যারে হিসাবে আসে।

ইতিমধ্যে আপনি যদি অন্য কোনও পদ্ধতির সন্ধান পান তবে দয়া করে আমাদের সাথে ভাগ করে নেওয়ার জন্য যথেষ্ট দয়া করুন :)

ধন্যবাদ!


6

আরও স্পষ্ট সমাধান:

 /**
 * Get string query 
 * 
 * @param Doctrine_Query $query
 * @return string
 */
public function getDqlWithParams(Doctrine_Query $query){
    $vals = $query->getFlattenedParams();
    $sql = $query->getDql();
    $sql = str_replace('?', '%s', $sql);
    return vsprintf($sql, $vals);
}

$ query-> getFlattenedParams (); অস্তিত্ব নেই
বিকাশকারী

5
Solution:1
====================================================================================

function showQuery($query)
{
    return sprintf(str_replace('?', '%s', $query->getSql()), $query->getParams());
}

// call function  
echo showQuery($doctrineQuery);

Solution:2
====================================================================================

function showQuery($query)
{
    // define vars              
    $output    = NULL;
    $out_query = $query->getSql();
    $out_param = $query->getParams();

    // replace params
   for($i=0; $i<strlen($out_query); $i++) {
       $output .= ( strpos($out_query[$i], '?') !== FALSE ) ? "'" .str_replace('?', array_shift($out_param), $out_query[$i]). "'" : $out_query[$i];
   }

   // output
   return sprintf("%s", $output);
}

// call function  
echo showQuery($doctrineQueryObject);

5

তুমি ব্যবহার করতে পার :

$query->getSQL();

আপনি যদি মাইএসকিউএল ব্যবহার করে থাকেন তবে চলমান এসকিউএল স্টেটমেন্টগুলি দেখতে আপনি ওয়ার্কবেঞ্চ ব্যবহার করতে পারেন। আপনি নিম্নলিখিতটি ব্যবহার করে মাইএসকিএল থেকে চলমান ক্যোয়ারীটি দেখতে ব্যবহার করতে পারেন:

 SHOW FULL PROCESSLIST \G

4

এটি কারও পক্ষে কার্যকর হতে পারে:

// Printing the SQL with real values
$vals = $query->getFlattenedParams();
foreach(explode('?', $query->getSqlQuery()) as $i => $part) {
    $sql = (isset($sql) ? $sql : null) . $part;
    if (isset($vals[$i])) $sql .= $vals[$i];
}

echo $sql;

2

টি এল; ডিআর

$qb = ... // your query builder
$query = $qb->getQuery();
// temporarily enable logging for your query (will also work in prod env)
$conf = $query->getEntityManager()->getConnection()->getConfiguration();
$backupLogger = $conf->getSQLLogger();
$logger = new \Doctrine\DBAL\Logging\DebugStack();
$conf->setSQLLogger($logger);
// execute query
$res = $query->getResult();
$conf->setSQLLogger($backupLogger); //restore logger for other queries
$params = [
  'query' => array_pop($logger->queries) //extract query log details
  //your other twig params here...
]
return $params; //send this to your twig template...

আপনার টুইগ ফাইলগুলিতে ডক্ট্রাইনের টুইগ হেল্প ফিল্টারগুলি ব্যবহার করুন:

// show raw query:
{{ (query.sql ~ ';')|doctrine_replace_query_parameters(query.params)
// highlighted
{{ (query.sql ~ ';')|doctrine_replace_query_parameters(query.params)|doctrine_pretty_query(highlight_only = true) }}
// highlighted and formatted (i.e. with tabs and newlines)
{{ (query.sql ~ ';')|doctrine_replace_query_parameters(query.params)|doctrine_pretty_query }}

ব্যাখ্যা:

প্রস্তুত করা বিবৃতি আসলে "বাস্তব প্রশ্নগুলি" বলে উল্লেখ করা অন্য উত্তরগুলি সঠিক, তবে তারা সুস্পষ্ট জিজ্ঞাসকের প্রত্যাশার উত্তর দেয় না ... প্রতিটি বিকাশকারী ডিবাগিংয়ের জন্য একটি "রানযোগ্য ক্যোয়ারী" প্রদর্শন করতে চায় (বা এটি ব্যবহারকারীকে প্রদর্শন করতে) ।

সুতরাং, আমি সিম্ফনি প্রোফাইলারের উত্সটি দেখেছিলাম তারা কীভাবে তা দেখে। মতবাদ অংশটি মতবাদের দায়িত্ব তাই তারা সিমফনির সাথে সংহত করার জন্য একটি মতবাদ-বান্ডেল তৈরি করেছিল। এক নজরেdoctrine-bundle/Resources/views/Collector/db.html.twigফাইলটি আপনি কীভাবে এটি ব্যবহার করবেন তা আবিষ্কার করবেন (এটি সংস্করণে পরিবর্তিত হতে পারে)। মজার বিষয় হল, তারা দ্বিগুণ ফিল্টার তৈরি করেছে যা আমরা পুনরায় ব্যবহার করতে পারি (উপরে দেখুন)।

সমস্ত কিছুর জন্য আমাদের অনুসন্ধানের জন্য লগিং সক্ষম করতে হবে। এটি করার একাধিক উপায় রয়েছে এবং আমি এখানে ডিবাগস্ট্যাক ব্যবহার করি যা এগুলি আসলে মুদ্রণ না করে প্রশ্নগুলি লগ করতে দেয়। এটিও নিশ্চিত করে যে এটি আপনার যদি প্রয়োজন হয় তবে এটি উত্পাদন মোডে কাজ করবে ...

আপনার যদি আরও ফর্ম্যাটিংয়ের প্রয়োজন হয় তবে আপনি দেখতে পাবেন যে তারা কোনও স্টাইল ট্যাগে কিছু সিএসএস অন্তর্ভুক্ত করে তাই কেবল এটি "চুরি" ":

.highlight pre { margin: 0; white-space: pre-wrap; }
.highlight .keyword   { color: #8959A8; font-weight: bold; }
.highlight .word      { color: #222222; }
.highlight .variable  { color: #916319; }
.highlight .symbol    { color: #222222; }
.highlight .comment   { color: #999999; }
.highlight .backtick  { color: #718C00; }
.highlight .string    { color: #718C00; }
.highlight .number    { color: #F5871F; font-weight: bold; }
.highlight .error     { color: #C82829; }

আশা করি, এটি সাহায্য করবে ;-)


1

আমি একটি সাধারণ লগার লিখেছি, যা সন্নিবেশিত পরামিতিগুলির সাহায্যে ক্যোয়ারী লগ করতে পারে। স্থাপন:

composer require cmyker/doctrine-sql-logger:dev-master

ব্যবহার:

$connection = $this->getEntityManager()->getConnection(); 
$logger = new \Cmyker\DoctrineSqlLogger\Logger($connection);
$connection->getConfiguration()->setSQLLogger($logger);
//some query here
echo $logger->lastQuery;

1
$sql = $query->getSQL();

$parameters = [];
    foreach ($query->getParameters() as $parameter) {
        $parameters[] = $parameter->getValue();
    }

$result = $connection->executeQuery($sql, $parameters)
        ->fetchAll();

কোডটি কী করে তা ব্যাখ্যা করে আপনার উত্তরে কিছু পাঠ্য যুক্ত করা উচিত।
ডার্কমুককে

0

প্যারামিটারগুলি এই '2019-01-01' এর মতো তারিখের স্ট্রিংগুলি থাকে এবং যখন অ্যারে ব্যবহার করে IN পছন্দ করে পাস করা হয় তখন কাজের জন্য @dsamblas ফাংশনটি পরিবর্তিত হয়

$qb->expr()->in('ps.code', ':activeCodes'),

। সুতরাং dsamblas যা লিখেছিল তা সবই করুন, তবে এইটির সাথে startQuery প্রতিস্থাপন করুন বা পার্থক্যগুলি দেখুন এবং আমার কোড যুক্ত করুন। (যদি সে তার ফাংশনে কিছু পরিবর্তন করে এবং আমার সংস্করণে কোনও পরিবর্তন হয় না)

public function startQuery($sql, array $params = null, array $types = null)

{
    if($this->isLoggable($sql)){
        if(!empty($params)){
            foreach ($params as $key=>$param) {

                try {
                    $type=Type::getType($types[$key]);
                    $value=$type->convertToDatabaseValue($param,$this->dbPlatform);
                } catch (Exception $e) {
                    if (is_array($param)) {
                        // connect arrays like ("A", "R", "C") for SQL IN
                        $value = '"' . implode('","', $param) . '"';
                    } else {
                        $value = $param; // case when there are date strings
                    }
                }

                $sql = join(var_export($value, true), explode('?', $sql, 2));
            }

        }
        echo $sql . " ;".PHP_EOL;
    }
}

বেশি পরীক্ষা করিনি।


0

আমি এই বিষয়টির জন্য কিছু গবেষণা করেছি, কারণ আমি একটি উত্পন্ন এসকিউএল কোয়েরি ডিবাগ করতে এবং এটি এসকিএল সম্পাদকের মধ্যে সম্পাদন করতে চেয়েছিলাম। সমস্ত উত্তরে যেমন দেখা গেছে, এটি একটি অত্যন্ত প্রযুক্তিগত বিষয়।

যখন আমি ধরে নিই যে প্রাথমিক প্রশ্নটি ডেভ-এনভির ভিত্তিতে রয়েছে, তখন একটি খুব সাধারণ উত্তর এই মুহুর্তে অনুপস্থিত। আপনি কেবল সিমফনি প্রোফাইলার বিল্ডটি ব্যবহার করতে পারেন। কেবলমাত্র ডক্ট্রাইন ট্যাবে ক্লিক করুন, আপনি যে কোয়েরিটি পরীক্ষা করতে চান তাতে স্ক্রোল করুন roll তারপরে "রান রানযোগ্য ক্যোয়ারী দেখুন" এ ক্লিক করুন এবং আপনি আপনার এসকিউএল সম্পাদকটিতে আপনার ক্যোয়ারীটি সরাসরি পেস্ট করতে পারেন

আরও ইউআই বেস পদ্ধতির কিন্তু খুব দ্রুত এবং ডিবাগিং কোড ওভারহেড ছাড়াই।

এখানে চিত্র বর্ণনা লিখুন


0
$sql = $query->getSQL();
$obj->mapDQLParametersNamesToSQL($query->getDQL(), $sql);
echo $sql;//to see parameters names in sql
$obj->mapDQLParametersValuesToSQL($query->getParameters(), $sql);
echo $sql;//to see parameters values in sql

public function mapDQLParametersNamesToSQL($dql, &$sql)
{
    $matches = [];
    $parameterNamePattern = '/:\w+/';
    /** Found parameter names in DQL */
    preg_match_all($parameterNamePattern, $dql, $matches);
    if (empty($matches[0])) {
        return;
    }
    $needle = '?';
    foreach ($matches[0] as $match) {
        $strPos = strpos($sql, $needle);
        if ($strPos !== false) {
            /** Paste parameter names in SQL */
            $sql = substr_replace($sql, $match, $strPos, strlen($needle));
        }
    }
}

public function mapDQLParametersValuesToSQL($parameters, &$sql)
{
    $matches = [];
    $parameterNamePattern = '/:\w+/';
    /** Found parameter names in SQL */
    preg_match_all($parameterNamePattern, $sql, $matches);
    if (empty($matches[0])) {
        return;
    }
    foreach ($matches[0] as $parameterName) {
        $strPos = strpos($sql, $parameterName);
        if ($strPos !== false) {
            foreach ($parameters as $parameter) {
                /** @var \Doctrine\ORM\Query\Parameter $parameter */
                if ($parameterName !== ':' . $parameter->getName()) {
                    continue;
                }
                $parameterValue = $parameter->getValue();
                if (is_string($parameterValue)) {
                    $parameterValue = "'$parameterValue'";
                }
                if (is_array($parameterValue)) {
                    foreach ($parameterValue as $key => $value) {
                        if (is_string($value)) {
                            $parameterValue[$key] = "'$value'";
                        }
                    }
                    $parameterValue = implode(', ', $parameterValue);
                }
                /** Paste parameter values in SQL */
                $sql = substr_replace($sql, $parameterValue, $strPos, strlen($parameterName));
            }
        }
    }
}

-1

মতবাদে একটি এসকিউএল কোয়েরি মুদ্রণ করতে, ব্যবহার করুন:

$query->getResult()->getSql();

আপনার উত্তর দিয়ে বিবরণ যুক্ত করতে ভুলবেন না? বর্ণনা ব্যতিরেকে কেবল একটি লাইনার, গ্রহণযোগ্য নয়।
HaveNoDisplayName

1
মতবাদে এসকিএল কোয়েরি মুদ্রণ করতে $ কোয়েরি-> getResult () -> getSQL () ব্যবহার করুন; ধন্যবাদ
জয়দীপ প্যাটেল

2
কম
नेट
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.