2009-09-20 61 views
4

我有這個代碼調用ZEND中的存儲過程。有沒有辦法打印將被執行的SQL命令?Zend存儲過程

$sp = $dbAdapter->prepare('CALL updateResultsByEvent(?, ?, ?, ?)'); 
$sp->bindParam(1,$id); 
$sp->bindParam(2,$event->name); 
$sp->bindParam(3,$event->distance); 
$sp->bindParam(4,$event->unit); 
// print $sp;???? 
$sp->execute(); 

我想驗證參數值是否正確傳遞。

#0 C:\projects\ABC\library\1.9.2\Zend\Db\Statement.php(284): Zend_Db_Statement_Mysqli->_execute(NULL) 
#1 C:\projects\ABC\application\controllers\AdminController.php(53): Zend_Db_Statement->execute() 
#2 C:\projects\ABC\library\1.9.2\Zend\Controller\Action.php(513): AdminController->updateleagueresultsbyeventAction() 
#3 C:\projects\ABC\library\1.9.2\Zend\Controller\Dispatcher\Standard.php(289): Zend_Controller_Action->dispatch('updateleagueres...') 
#4 C:\projects\ABC\library\1.9.2\Zend\Controller\Front.php(946): Zend_Controller_Dispatcher_Standard->dispatch(Object(Zend_Controller_Request_Http), Object(Zend_Controller_Response_Http)) 
#5 C:\projects\ABC\library\1.9.2\Zend\Application\Bootstrap\Bootstrap.php(77): Zend_Controller_Front->dispatch() 
#6 C:\projects\ABC\library\1.9.2\Zend\Application.php(346): Zend_Application_Bootstrap_Bootstrap->run() 
#7 C:\projects\ABC\public\index.php(29): Zend_Application->run() 
#8 {main} 

回答

6

MySQL向其general query log輸出SQL查詢的模型,其中插入參數值。但除此之外,在執行SQL時,無法獲取SQL,並結合參數值。您需要了解如何查詢工作的準備:

  • 準備,一個SQL查詢發送到RDBMS服務器,在那裏它被解析和優化,並存儲在內部表示 - 不典型的SQL語句了。在您的示例中準備的SQL是'CALL updateResultsByEvent(?, ?, ?, ?)'

  • 執行期間,參數值被髮送到RDBMS服務器,在那裏它們與內部查詢表示法結合在一起。 RDBMS在內部使可讀的SQL獨立於可執行的查詢。如果您選擇再次執行語句,則可以更輕鬆地替換不同的參數值。它還可以防止參數值可能導致SQL注入錯誤的可能性。

一般情況下,你不能在人類可讀的形式「真實」的SQL查詢,因爲這些參數,從不被執行的形式查詢相結合。

+0

感謝您解釋這一點。它幫助我理解了很多關於SP的知識。 – 2010-11-16 03:29:30