混合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为单位的每个关联索引)。这会给你你所需要的。