2013-03-03 125 views
3

我有以下代码使用预处理语句执行MySQL查询:提取处理mysqli预处理语句时的替代方法?

$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()在使用准备好的语句和结果时会给我的东西?

+0

为什么你没有在执行方法中设置数组? – Sam 2013-03-03 21:48:41

+0

因为它返回一个布尔值并且不接受任何参数? – user1427661 2013-03-03 21:50:43

+0

看一看:http://www.php.net/manual/en/mysqli-result.fetch-all.php – michi 2013-03-03 22:08:36

回答

3

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

所以,有两种解决方案。

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

对于第一个选项,一个去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,真正整洁的代码更加有用:

$row = $db->getRow("SELECT * FROM Musicians WHERE name = ?s",$name); 
+0

这是我评估mysqli时选择PDO的主要原因。能够在常规查询中获取关联数组而不是在参数化查询中获取关联数组是一种荒谬的限制。 (如果你同意我的观点,那就去upvote [这个答案](http://stackoverflow.com/a/127218/13508)并且给这个世界带来一些正义。) – 2013-03-04 11:44:21

0

要添加一个解决方案,以澄清:

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

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

这对我来说似乎更简单。