如何回显 MySQLi 准备好的语句?

2021-12-25 00:00:00 php mysqli

我目前正在使用 MySQLi,试图弄清楚它是如何工作的.在我目前的项目中,我总是喜欢在编码时回显查询字符串,以确保一切正确,并快速调试我的代码.但是……我如何使用准备好的 MySQLi 语句来做到这一点?

I'm playing around with MySQLi at the moment, trying to figure out how it all works. In my current projects I always like to echo out a query string while coding, just to make sure that everything is correct, and to quickly debug my code. But... how can I do this with a prepared MySQLi statement?

示例:

$id = 1;
$baz = 'something';

if ($stmt = $mysqli->prepare("SELECT foo FROM bar WHERE id=? AND baz=?")) {
  $stmt->bind_param('is',$id,$baz);
  // how to preview this prepared query before acutally executing it?
  // $stmt->execute();
}

我一直在浏览这个列表(http://www.php.net/mysqli) 但没有任何运气.

I've been going through this list (http://www.php.net/mysqli) but without any luck.


编辑

好吧,如果在 MySQLi 中不可能,也许我会坚持这样的:

Well, if it's not possible from within MySQLi, maybe I'll stick with something like this:

function preparedQuery($sql,$params) {
  for ($i=0; $i<count($params); $i++) {
    $sql = preg_replace('/?/',$params[$i],$sql,1);
  }
  return $sql;
}

$id = 1;
$baz = 'something';

$sql = "SELECT foo FROM bar WHERE id=? AND baz=?";

echo preparedQuery($sql,array($id,$baz));

// outputs: SELECT foo FROM bar WHERE id=1 AND baz=something

显然远非完美,因为它仍然相当多余—我想阻止的事情—它也没有让我知道 MySQLi 对数据做了什么.但是我想通过这种方式我可以快速查看所有数据是否都存在并且位于正确的位置,并且与手动将变量拟合到查询中相比,它可以为我节省一些时间—对于许多变量,这可能会很痛苦.

Far from perfect obviously, since it's still pretty redundant — something I wanted to prevent — and it also doesn't give me an idea as to what's being done with the data by MySQLi. But I guess this way I can quickly see if all the data is present and in the right place, and it'll save me some time compared to fitting in the variables manually into the query — that can be a pain with many vars.

推荐答案

我认为你不能——至少不是你希望的那样.您要么必须自己构建查询字符串并执行它(即不使用语句),要么寻找或创建支持该功能的包装器.我使用的是 Zend_Db,这就是我要做的:

I don't think you can - at least not in the way that you were hoping for. You would either have to build the query string yourself and execute it (ie without using a statement), or seek out or create a wrapper that supports that functionality. The one I use is Zend_Db, and this is how I would do it:

$id = 5;
$baz = 'shazam';
$select = $db->select()->from('bar','foo')
                       ->where('id = ?', $id)
                       ->where('baz = ?', $baz); // Zend_Db_Select will properly quote stuff for you
print_r($select->__toString()); // prints SELECT `bar`.`foo` FROM `bar` WHERE (id = 5) AND (baz = 'shazam')

相关文章