在处理mysqli预处理语句时获取的替代方法?

时间:2013-03-03 21:46:13

标签: php mysql mysqli

我有以下代码,它使用预准备语句执行MySQL查询:

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

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

2 个答案:

答案 0 :(得分:3)

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

所以,有两个解决方案。

  1. 请勿使用mysqli
  2. 请勿使用预先准备好的陈述。
  3. 对于第一个选项,请选择PDO 与mysqli不同,它有everything you need from mysqli and much more.

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

答案 1 :(得分:0)

添加解决方案以澄清:

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

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

这对我来说似乎更简单。