English 中文(简体)
混合使用PHP的mysqli数据访问函数?
原标题:
  • 时间:2009-03-09 17:23:17
  •  标签:

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

据我所知,在mysqli中有两种不同的访问结果的模型。

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

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

或者,您可以使用这种方法,它允许漂亮地绑定参数和结果,但是(据我所知)无法提供任何简单的数组结果:

$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 !)。

最佳回答

这个页面的评论区有多个实现此类功能的函数,具体请参考:mysqli_stmt::fetch。

问题回答

Alnitak,

据我所知,无法自动将整个数组绑定到获取的结果中。不幸的是。但是,如果您希望它具有数组行为(可能是为了更轻松地传递结果),您可以尝试这个:

<?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]等。

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

我会说不。虽然我并没有大量使用过 mysqli 或准备好的语句,但我相信你第二个例子中的每个步骤都是离散且必要的。我唯一能给你的安慰就是你的第一个例子掩盖了一些SQL转义,在第二个例子中你可以安全地忽略它们。





相关问题
热门标签