我在过去几天看到了几个使用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
之外!)。
答案 0 :(得分: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 );
}
?>
这将为您提供上述请求的行为。但是,它不会将数组字段动态绑定到数组中的关联indeces - 也就是说,必须指定将id绑定到$ arr ['id']等。
如果您的方案确实需要动态绑定到关联indeces,您总是可以编写一个简单的类,首先解析所选字段的查询,然后设置assoc数组indeces,然后执行查询。
答案 1 :(得分:1)
在php手册的这个页面的评论中有一个函数的多个实现来执行此类操作:mysqli_stmt::fetch
答案 2 :(得分:0)
我会说不。我以为我没有使用mysqli
或准备好的陈述,我相信你的第二个例子中的每一步都是离散的和必要的。我能给你的唯一安慰就是你的第一个例子掩盖了一些SQL转义,你可以在第二个例子中安全地忽略它。