Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
混合PHP';s mysqli数据访问功能?_Php_Sql_Mysqli - Fatal编程技术网

混合PHP';s mysqli数据访问功能?

混合PHP';s mysqli数据访问功能?,php,sql,mysqli,Php,Sql,Mysqli,在过去的几天里,我看到了一些使用mysqli的问题,但答案似乎没有意识到$stmt->execute()和$db->query()之间的区别 据我所知,在mysqli中访问结果有两种不同的模型 此方法使用原始SQL,要求程序员转义输入以防止SQL注入攻击,但允许程序员检索包含column=>value映射的关联数组(或普通数组): $result_set = $db->query("SAFE SQL QUERY HERE"); while ($row = $result_set->f

在过去的几天里,我看到了一些使用
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
之外!)。

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

阿尔尼塔克

另外,您不能将整个数组自动绑定到获取的结果。不幸的是。但是,如果要从中查找数组行为(可能这样更容易传递结果),可以尝试以下方法:

<?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 );
 }
?>

在php手册的这一页上的注释中,有多个函数实现了这类功能:

olafur-我已经回滚了您的拼写更改。“已识别”是标准的英语拼写。有趣,但(AIUI)不允许$results[]=$arr,这是获取二维结果数组的常见模式,因为它在循环中每次都使用相同的$arr。我认为,在将$arr添加到$results[]之前,您必须获取$arr的深度副本,这非常容易测试,您是对的!如果要创建多维数组,则需要执行绑定数组的深度复制。在while循环中,您可以执行类似$multi[]['id']=$arr['id']的操作;(对于以$arr为单位的每个关联索引)。这会给你你所需要的。