0

在过去的几天里,我看到了几个问题,mysqli但这些问题的答案似乎没有认识到$stmt->execute()和之间的区别$db->query()

据我了解,有两种不同的模型可用于访问mysqli.

这个使用原始 SQL 并要求程序员转义输入以防止 SQL 注入攻击,但允许程序员检索包含column => value映射的关联数组(或普通数组):

$result_set = $db->query("SAFE SQL QUERY HERE");
while ($row = $result_set->fetch_assoc()) {
     # do something with $row['fieldname'];
}  

或者,您可以这样做,它允许很好地绑定参数和结果,但不能(AFAIK)为您提供任何类型的简单数组结果:

$stmt = $db-prepare("SQL QUERY WITH ? PLACEHOLDERS");
$stmt->bind_param("s", $input_variable);
$stmt->execute();
$stmt->bind_results($output_col1, $output_col2);
while ($stmt->fetch()) {
     # do something with $output_col1 and $output_col2
}

我的问题是 - 有没有办法mysqli获得第一个模式中显示的简单数组输出,但仍然按照第二个模式使用安全绑定的输入参数?

我无论如何都找不到这样做(除了PDO改用!)。

4

3 回答 3

1

阿尔尼塔克,

AFAIK,您不能自动将整个数组绑定到获取的结果。很遗憾。但是,如果您正在寻找其中的数组行为(大概是这样更容易传递结果),您可以试试这个:

<?php
 $dbh = new mysqli( ... );
 $arr = array();
 if( $stmt = $dbh->prepare( 'SELECT id, email FROM email_list' );
 {
  $stmt->execute();
  $stmt->bind_result( $arr['id'], $arr['email'] );

  while( $stmt->fetch() )
   DoSomething( $arr );
 }
?>

这将为您提供上面所要求的行为。但是,它不会动态地将数组字段绑定到数组中的关联索引——也就是说,您必须指定将 id 绑定到 $arr['id'] 等。

如果您的方案确实需要动态绑定到关联索引,您总是可以编写一个简单的类,首先解析所选字段的查询,然后设置关联数组索引,然后执行查询。

于 2009-03-09T17:57:46.750 回答
1

在 php 手册的此页面的评论中,有多种函数实现来执行此类操作:mysqli_stmt::fetch

于 2009-03-09T18:05:46.793 回答
0

我会说不。以为我没有mysqli大量使用或准备语句,我相信您的第二个示例中的每个步骤都是离散且必要的。我能给您的唯一安慰是,您的第一个示例掩盖了一些 SQL 转义,您可以在第二个示例中安全且真正地忽略这些转义。

于 2009-03-09T17:48:06.417 回答