我有这个代码在ZEND中调用存储过程。有没有办法打印将要执行的SQL命令?
$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}
答案 0 :(得分:6)
MySQL向其general query log输出一个SQL查询的模型,其中插入了参数值。但除此之外,您无法在执行时获取SQL,并结合参数值。您需要了解准备好的查询的工作原理:
在 prepare 期间,SQL查询被发送到RDBMS服务器,在那里它被解析和优化并存储在内部表示中 - 通常不再是SQL语句。您的示例中准备的SQL是'CALL updateResultsByEvent(?, ?, ?, ?)'
。
在执行期间,参数值被发送到RDBMS服务器,在那里它们与内部查询表示相结合。 RDBMS在内部将可读的SQL与可执行查询分开。如果您选择再次执行该语句,则可以更轻松地替换不同的参数值。它还可以防止参数值导致SQL注入错误的可能性。
通常,您无法以人类可读的形式获得“真正的”SQL查询,因为参数永远不会以执行的形式与查询结合。