Học thuyết - Làm thế nào để in ra sql thực, không chỉ là tuyên bố chuẩn bị?


167

Chúng tôi đang sử dụng Doctrine, một ORM PHP. Tôi đang tạo một truy vấn như thế này:

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

và sau đó trong hàm tôi đang thêm vào nhiều mệnh đề và các điều phù hợp, như thế này

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

Sau này, trước khi sử dụng execute()đối tượng truy vấn đó, tôi muốn in ra SQL thô để kiểm tra nó và thực hiện điều này:

$q->getSQLQuery();

Tuy nhiên, chỉ in ra tuyên bố đã chuẩn bị, không phải truy vấn đầy đủ. Tôi muốn xem những gì nó đang gửi tới MySQL, nhưng thay vào đó, nó đang in ra một tuyên bố đã chuẩn bị, bao gồm cả ?. Có cách nào để xem truy vấn 'đầy đủ' không?


Cách tốt nhất tôi tìm thấy để xem toàn bộ truy vấn được mô tả trong câu trả lời này: stackoverflow.com/a/678310/229077
Marek

Bạn có thể tận dụng công việc được thực hiện bởi Doctrine (trình lược tả đang hiển thị một truy vấn có thể chạy được). Xem câu trả lời của tôi dưới đây để biết chi tiết
Vincent Pazeller

Câu trả lời:


164

Doctrine không gửi "truy vấn SQL thực" đến máy chủ cơ sở dữ liệu: thực tế nó đang sử dụng các câu lệnh được chuẩn bị, có nghĩa là:

  • Gửi bản tuyên bố, để nó được chuẩn bị (đây là những gì được trả lại bởi $query->getSql())
  • Và, sau đó, gửi các tham số (được trả về bởi $query->getParameters())
  • và thực hiện các báo cáo đã chuẩn bị

Điều này có nghĩa là không bao giờ có một truy vấn SQL "thực" ở phía PHP - vì vậy, Doctrine không thể hiển thị nó.


14
Pascal: bạn không nên nói đó không phải là "truy vấn SQL thực" bởi vì câu lệnh được chuẩn bị là truy vấn SQL thực, chỉ là các tham số như được gửi riêng. Từ ngữ này có thể gây nhầm lẫn cho mọi người (ví dụ: olivierpons.fr/2014/03/22/symfony-2-avantages-et-inconvenents ).
Matthieu Napoli

$query->getParameters();sẽ KHÔNG trả về các tham số theo đúng thứ tự, vì chúng sẽ xuất hiện trong câu lệnh truy vấn đã chuẩn bị
gondo

4
Tôi nghĩ ở đây tác giả của câu hỏi không quan tâm học thuyết gửi gì hay không. Những gì người dùng và tôi muốn biết là làm thế nào để có được truy vấn mà chúng ta có thể sao chép dán và chạy mà không phải thay thế thủ công các dấu hỏi bằng các tham số. Giống như trong codeigniter. Tôi nghĩ rằng tôi đã tìm thấy điều này trong trình gỡ lỗi symfony, nhưng tôi vẫn không thể tìm thấy khi tôi chạy tập lệnh từ dòng lệnh.
Darius.V

104

Một ví dụ làm việc:

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

5
Trong khi nó hoạt động như các bài tập biến, bạn có thể muốn xem xét điều này: in $ query-> getQuery (); foreach ($ query-> getParameter () là $ param) {print "{$ param-> getName ()} -> {$ param-> getValue ()} \ n"; } vì bạn sẽ nhận được một đầu ra dễ đọc hơn
Justin Finkelstein

nó mang lại lợi ích nhỏ Khi tôi sao chép sql, tôi vẫn có tham số tìm kiếm wichi để chèn thủ công, sẽ mất rất nhiều thời gian. Chúng tôi muốn một truy vấn với parameterr được chèn, tại sao chúng tôi không thể tìm thấy nó quá lâu? Ngay cả trong khung codeigniter theo như tôi nhớ, trong trình lược tả bạn có thể sao chép truy vấn và chạy ngay lập tức mà không cần thủ công. Chúng tôi cần tương tự trên symfony.
Darius.V

35

Bạn có thể kiểm tra truy vấn được thực hiện bởi ứng dụng của mình nếu bạn đăng nhập tất cả các truy vấn trong mysql:

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

sẽ có nhiều truy vấn không chỉ là truy vấn mà bạn đang tìm kiếm mà bạn có thể grep cho nó.

nhưng thường ->getSql(); hoạt động

Biên tập:

để xem tất cả các truy vấn mysql tôi sử dụng

sudo vim /etc/mysql/my.cnf 

và thêm 2 dòng đó:

general_log = on
general_log_file = /tmp/mysql.log

và khởi động lại mysql


17

Tôi đã tạo ra một Logger Doctrine2 thực hiện chính xác điều này. Nó "hydrat hóa" truy vấn sql tham số với các giá trị bằng cách sử dụng các bộ chuyển đổi kiểu dữ liệu riêng của Doctrine 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;
    }
}

Ví dụ sử dụng :; Sự an toàn của mã sau đây sẽ lặp lại trên đầu ra tiêu chuẩn của bất kỳ câu SQL, XÁC NHẬN, XÓA nào được tạo bằng $ em Entity Manager,

/**@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
Không hoạt động khi tham số là các chuỗi ngày như '2019-01-01'
Darius.V

14

getSqlQuery() về mặt kỹ thuật hiển thị toàn bộ lệnh SQL, nhưng nó hữu ích hơn rất nhiều khi bạn có thể xem các tham số.

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

Để làm cho mẫu này có thể tái sử dụng nhiều hơn, có một cách tiếp cận hay được mô tả trong các nhận xét tại Raw SQL từ Đối tượng truy vấn của Doctrine .


Tôi biết đây là một bài viết cũ, nhưng cả hai liên kết của bạn đều dẫn đến một trang 404. Bạn có thể cập nhật câu trả lời của bạn xin vui lòng? Tôi đang hỏi, bởi vì tôi không chắc ý của bạn là gì $q. Nó dường như không phải là truy vấn cũng không phải là trình tạo truy vấn.
k00ni

1
Tôi sợ rằng tôi không thể tìm thấy mã có thể tái sử dụng nhiều hơn. $qtrong trường hợp này là truy vấn của Học thuyết 1. Bạn có thể đang sử dụng Học thuyết 2, trong trường hợp đó bạn sẽ muốn một cái gì đó như $qb = $this->createQueryBuilder('a'); $q = $qb->getQuery(); $sql = $q->getSQL(); $params = $q->getParameters(); Hy vọng điều đó có ích!
ladenedge

13

Không có truy vấn thực sự nào khác, đây là cách các câu lệnh được chuẩn bị hoạt động. Các giá trị được ràng buộc trong máy chủ cơ sở dữ liệu, không phải trong lớp ứng dụng.

Xem câu trả lời của tôi cho câu hỏi này: Trong PHP với PDO, làm thế nào để kiểm tra truy vấn tham số SQL cuối cùng?

(Lặp đi lặp lại ở đây để thuận tiện :)

Sử dụng các câu lệnh được chuẩn bị với các giá trị tham số hóa không chỉ đơn giản là một cách khác để tự động tạo ra một chuỗi SQL. Bạn tạo một câu lệnh được chuẩn bị tại cơ sở dữ liệu, và sau đó gửi các giá trị tham số một mình.

Vì vậy, những gì có thể được gửi đến cơ sở dữ liệu sẽ là một PREPARE ..., sau đó SET ...và cuối cùngEXECUTE ....

Bạn sẽ không thể có được một chuỗi SQL như thế SELECT * FROM ..., ngay cả khi nó sẽ tạo ra kết quả tương đương, bởi vì không có truy vấn nào như vậy thực sự được gửi đến cơ sở dữ liệu.


9

Giải pháp của tôi:

 /**
 * 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;}

Ví dụ về cách sử dụng:

$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());

Cảm ơn bạn vì điều này: D
Saad Achemlal

rất đẹp. hoạt động với các truy vấn bình thường nhưng tôi đã có một truy vấn với regrec và có vẻ như không hỗ trợ $ qb = $ this-> createQueryBuilder ('r') -> InternalJoin ('r.profile', 'p') -> addSelect (' p ') -> trong đó (' REGEXP (: fileNamePotype, r.fileNamePotype) = 1 ') -> andWhere (' p.inasingLocation =: đếnLocation ') -> setParameter ([' fileNamePotype '=> $ fileName,' đến ' => $ location]) -> getQuery ();
Fahim

Không hoạt động với tất cả các truy vấn. Khi tôi có cái này -> setParameter (mảng ('bảo hiểmCarrier' => $ bảo hiểmCarrier, định dạng 'dateFrom' => $ dateFrom-> ('Ym-d'), 'dateTo' => $ dateTo-> ('Ym- d '),)) những người còn lại với? nhãn hiệu trong sql.
Darius.V

9

Bạn có thể dễ dàng truy cập các tham số SQL bằng cách sử dụng phương pháp sau.

   $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,',');    

Vì vậy, nếu bạn in ra $param_values$col_names, bạn có thể nhận được các giá trị tham số đi qua tên cột và cột tương ứng.

Lưu ý: Nếu $paramtrả về một mảng, bạn cần lặp lại, vì các tham số bên trong IN (:?)thường đi kèm là một mảng lồng nhau.

Trong khi đó, nếu bạn tìm thấy một cách tiếp cận khác, xin hãy tử tế để chia sẻ với chúng tôi :)

Cảm ơn bạn!


6

Giải pháp rõ ràng hơn:

 /**
 * 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);
}

$ truy vấn-> getFlattenedParams (); không tồn tại
Nhà phát triển

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

Bạn có thể dùng :

$query->getSQL();

Nếu bạn đang sử dụng MySQL, bạn có thể sử dụng Workbench để xem các câu lệnh SQL đang chạy. Bạn cũng có thể sử dụng xem truy vấn đang chạy từ mysql bằng cách sử dụng như sau:

 SHOW FULL PROCESSLIST \G

4

Có lẽ nó có thể hữu ích cho ai đó:

// 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

TL; DR

$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...

trong các tệp twig của bạn, hãy sử dụng các bộ lọc trợ giúp twig của Doctrine:

// 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 }}

Giải trình:

Các câu trả lời khác đề cập rằng tuyên bố Chuẩn bị thực sự là "truy vấn thực" là đúng, nhưng chúng không trả lời kỳ vọng của người hỏi rõ ràng ... Mọi nhà phát triển đều muốn hiển thị "truy vấn có thể chạy" để gỡ lỗi (hoặc hiển thị cho người dùng) .

Vì vậy, tôi đã xem xét nguồn của hồ sơ Symfony để xem cách họ làm điều đó. Phần học thuyết là trách nhiệm của Học thuyết nên họ đã tạo ra một gói học thuyết để tích hợp với Symfony. Nhìn vào doctrine-bundle/Resources/views/Collector/db.html.twigtập tin, bạn sẽ tìm ra cách họ làm điều đó (điều này có thể thay đổi giữa các phiên bản). Thật thú vị, họ đã tạo ra các bộ lọc twig mà chúng ta có thể sử dụng lại (xem bên trên).

Để mọi thứ hoạt động, chúng tôi cần kích hoạt Ghi nhật ký cho truy vấn của chúng tôi. Có nhiều cách để làm điều này và ở đây tôi sử dụng DebugStack cho phép ghi nhật ký truy vấn mà không thực sự in chúng. Điều này cũng đảm bảo rằng nó sẽ hoạt động trong chế độ sản xuất nếu đây là thứ bạn cần ...

Nếu bạn cần định dạng thêm, bạn sẽ thấy rằng chúng bao gồm một số CSS trong thẻ kiểu, vì vậy chỉ cần "đánh cắp" nó ^^:

.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; }

Hy vọng, điều này sẽ giúp ;-)


1

Tôi đã viết một logger đơn giản, có thể đăng nhập truy vấn với các tham số được chèn. Cài đặt:

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

Sử dụng:

$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();

Bạn nên thêm một số văn bản vào câu trả lời của bạn giải thích những gì mã làm.
DarkMukke

0

Hàm @dsamblas đã sửa đổi hoạt động khi các tham số là các chuỗi ngày như '2019-01-01' này và khi có mảng được truyền bằng cách sử dụng IN như

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

. Vì vậy, hãy làm mọi thứ mà DSamblas đã viết, nhưng thay thế startQuery bằng cái này hoặc xem sự khác biệt và thêm mã của tôi. (trong trường hợp anh ta sửa đổi một cái gì đó trong chức năng của mình và phiên bản của tôi không có sửa đổi).

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;
    }
}

Không kiểm tra nhiều.


0

Tôi đã thực hiện một số nghiên cứu cho chủ đề này, vì tôi muốn gỡ lỗi một truy vấn SQL được tạo và thực hiện nó trong trình soạn thảo sql. Như đã thấy trong tất cả các câu trả lời, nó là một chủ đề kỹ thuật cao.

Khi tôi cho rằng câu hỏi ban đầu dựa trên dev-env, một câu trả lời rất đơn giản bị thiếu vào lúc này. Bạn chỉ có thể sử dụng bản dựng trong trình tạo hồ sơ Symfony. Chỉ cần nhấp vào Tab Doctrine, Di chuyển đến truy vấn bạn muốn kiểm tra. Sau đó nhấp vào "xem truy vấn có thể chạy" và bạn có thể dán truy vấn của mình trực tiếp vào trình soạn thảo SQL của mình

Cách tiếp cận cơ sở UI nhiều hơn nhưng rất nhanh chóng và không cần gỡ lỗi mã trên đầu.

nhập mô tả hình ảnh ở đây


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

Để in ra một truy vấn SQL trong Doctrine, hãy sử dụng:

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

đừng quên thêm mô tả với câu trả lời của bạn? Chỉ cần một lớp lót không có mô tả, không được chấp nhận.
HaveNoDisplayName 27/1/2015

1
Để in ra truy vấn sql trong Doctrine, hãy sử dụng $ query-> getResult () -> getSql (); Cảm ơn
Jaydeep Patel 27/1/2015

2
thay vì thêm commnet, hãy chỉnh sửa câu trả lời của bạn
HaveNoDisplayName
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.