3

我有以下代码使用准备好的语句执行 MySQL 查询:

$selectStatement = "SELECT " . implode(", ", $allFields); // cat select w/ allFields
$stmnt = $mysqli->prepare($selectStatement . 
     "FROM Musicians WHERE name = ?");
$stmnt->bind_param('s', $name);
$stmnt.execute();

在这一点上,我读过的大部分内容都告诉我应该使用bind_result()然后fetch()在 $stmnt 上。但是,我更愿意得到一个填充了值的数组,而不是像这样迭代一堆转储变量fetch()。有没有办法在使用准备好的语句和结果时获得类似于fetch_assoc()给我的东西?

4

2 回答 2

3

你是对的,要使用熟悉的 fetch() 和 mysqli,必须先调用 get_result() 并且它并不总是可用。
更不用说如果没有一些复杂的代码,您也无法绑定可变数量的占位符。
这使得mysqli绝对无法准备好的语句一起使用。

所以,有2个解决方案。

  1. 不要使用 mysqli
  2. 不要使用准备好的语句。

对于第一个选项,选择 PDO。
与 mysqli 不同,它拥有mysqli 所需的一切以及更多

$stm = $pdo->prepare("SELECT * FROM Musicians WHERE name = ?");
$stm->execute(array($name));
$row = $stm->fetch(); // or fetchAll() depends on the numer of rows expected.

对于第二个,您可以使用手动处理的占位符。
这种方法将比 PDO 更有用,PDO 是一个真正简洁的代码:

$row = $db->getRow("SELECT * FROM Musicians WHERE name = ?s",$name);
于 2013-03-04T08:27:04.013 回答
0

添加解决方案以澄清:

如果我们可以在启动时选择服务器,我更喜欢使用 php-mysqlnd 模块,而不是 php-mysql 模块,用于 PHP。然后,我们可以使用:

...
$stmnt.execute();
$res = $stmnt->get_result();
$row = $res->fetch_assoc();

这对我来说似乎更简单。

于 2014-04-04T10:32:58.950 回答