我正在尝试动态绑定mysql_stmt参数,并在一个关联数组中获得结果。我在Stack Overflow上找到了这篇文章,Amber用下面的代码给出了答案:
原帖:如何使用预准备语句创建一个合适的mysqli扩展类?
“假设您真的想编写自己的版本(而不是使用其他答案建议的现有库之一--这些也是很好的选择)......
这里有两个函数,你可能会发现它们很有用。第一个函数允许你将查询结果绑定到一个关联数组,第二个函数允许你传入两个数组,一个是键的有序数组,另一个是这些键的数据的关联数组,并将这些数据绑定到一个准备好的语句中:“
function stmt_bind_assoc (&$stmt, &$out) {
$data = mysqli_stmt_result_metadata($stmt);
$fields = array();
$out = array();
$fields[0] = $stmt;
$count = 1;
while($field = mysqli_fetch_field($data)) {
$fields[$count] = &$out[$field->name];
$count++;
}
call_user_func_array(mysqli_stmt_bind_result, $fields);
}
function stmt_bind_params($stmt, $fields, $data) {
// Dynamically build up the arguments for bind_param
$paramstr = '';
$params = array();
foreach($fields as $key)
{
if(is_float($data[$key]))
$paramstr .= 'd';
elseif(is_int($data[$key]))
$paramstr .= 'i';
else
$paramstr .= 's';
$params[] = $data[$key];
}
array_unshift($params, $stmt, $paramstr);
// and then call bind_param with the proper arguments
call_user_func_array('mysqli_stmt_bind_param', $params);
}
我试着学习代码来理解它的作用,我已经使第二个函数正常工作,但我不知道我应该做些什么来使用第一个函数.我如何使用它来检索类似于mysqli_result::的数组fetch_assoc()函数中的值?
我希望能够像你以前那样利用结果:
while ($row = mysql_fetch_array($result)){
echo $row['foo']." ".$row['bar'];
}
4条答案
按热度按时间u0njafvf1#
好吧,这里有一个方法:
已编辑,以修复读取多行时的错误
qij5mzcb2#
如果只选择一行,Emmanuel的答案就能很好地工作!如果查询选择了多行,$results-Array会为每一行保存一个结果,但结果总是用最后一个条目填充。在fetch()中做了一点改动--尽管它工作得很好。
$sqlStmt是一个字符串,用mysql-query填充
$params是一个数组,填充了应该传递的变量
$results是一个空数组,用于保存结果
57hvy0tb3#
如果你选择PDO而不是mysqli,那么你可以将@Emmanuel和@matzino给出的答案与你得到的代码进行比较:
哦,就这些?
hkmswyz64#
在使用了上面的答案之后,我发现自己需要做一些清理,特别是'fieldNames[]'部分。下面的代码是过程化的。我希望它能对某些人有用。
我从我做的一个可以动态查询数据的类中删除了代码。为了让它更容易阅读,我删除了一些东西。在我的类中,我允许用户定义定义表和外键,以便限制前端的数据输入,以及相关数据的过滤和排序选项。这些都是我删除的参数,以及自动查询构建器。