当前位置: 首页 > 面试题库 >

如何回显MySQLi准备的语句?

徐隐水
2023-03-14
问题内容

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

例:

$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),但没有任何运气。

编辑

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

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对数据进行了什么处理。但是我想我可以通过这种方式快速查看是否所有数据都存在并且在正确的位置,与手动将变量放入查询中相比,这可以节省
一些 时间-对于许多var来说可能是一件痛苦的事情。


问题答案:

我不认为您可以-
至少不是您希望的那样。您要么自己构建查询字符串并执行(即不使用语句),要么寻找或创建支持该功能的包装器。我使用的是Zend_Db,这就是我的方法

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


 类似资料:
  • 问题内容: 我正在尝试准备好的语句,但是下面的代码不起作用。我收到错误消息: 致命错误:在第12行的/var/www/prepared.php中的非对象上调用成员函数execute() 另外,我需要对准备好的语句使用mysqli吗?谁能指出我关于从连接到插入再到带有错误处理的选择的准备好的语句的完整示例? 问题答案: 从文档: 在执行语句或获取行之前,必须使用mysqli_stmt_bind_pa

  • 问题内容: 我如何使用mysqli用LIKE进行查询并获得所有结果? 这是我的代码,但是不起作用: 此代码似乎不起作用。我已经搜索了很多。也可能返回多于1行。那么,即使返回的结果超过1行,我如何获得所有结果呢? 问题答案: 这是您正确获取结果的方式 或者,您也可以执行以下操作: 希望您意识到我从这里和这里的手册中直接得到了答案,这是您应该首先去的地方。

  • 问题内容: 我完全被mySQLi弄糊涂了。尽管多年来我一直在使用过程性mysql调用,但我希望习惯于为其提供的db security / mySQL注入保护编写准备好的语句。我正在尝试编写一个简单的select语句(是的,我知道为此进行程序调用可提高性能)。运行时,我会得到所有回声,直到击中组件为止。在我看来,这一切都相当简单,但是在阅读了数小时的mySQLi手册后,我感到茫然。任何想法为什么会失

  • 问题内容: 停止使用不推荐使用的mysql_ *函数后,我切换到mysqli。但是后来,我注意到未准备好的语句对于SQL注入是不安全的。然后,我再次更改了代码。 我所拥有的是以下函数,该函数检查数据库中是否存在变量 $ ID 并打印该行的 title 值: 我将其更改为: 我的问题是:这是执行准备好的语句的正确方法吗?另外,我现在可以安全使用SQL注入吗?非常感谢任何愿意回答这个问题的人:) 问题

  • 问题内容: 我总是发现很难编写MySQLi预备语句,因为许多函数的工作方式与旧方法不同。现在我面临一个问题。 问题答案: 您正在尝试通过以下方式获取结果 事实并非如此。因为execute将仅返回布尔值。 做喜欢的。

  • 问题内容: 这个问题已经在这里有了答案 : mysqli_fetch_assoc()期望参数/调用成员函数bind_param()错误。如何获取并修复实际的mysql错误? (1个答案) 3年前关闭。 我正在努力弄清MySQli,但我对错误报告感到困惑。我正在使用MySQLi’prepare’语句的返回值来检测执行SQL时的错误,如下所示: 但是,prepare语句的返回值是否仅检测SQL语句的前