动态绑定mysqli_stmt参数,然后绑定结果
我正在尝试动态绑定 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'];
}
I'm trying to dynamically bind mysql_stmt parameters and get the result in an associative array. I've found this post here on Stack Overflow where Amber posted an answer with the following code:
Original post:
How to make a proper mysqli extension class with prepared statements?
"Assuming you're actually wanting to write your own version (as opposed to utilizing one of the existing libraries other answers have suggested - and those are good options, too)...
Here are a couple of functions which you may find it useful to examine. The first allows you to bind the results of a query to an associative array, and the second allows you to pass in two arrays, one an ordered array of keys and the other an associative array of data for those keys and have that data bound into a prepared statement:"
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);
}
I tried studying the code to understand what it does and I've made the second function work properly but I don't know what I should do to be able to utilize the first function. How do I use it to retrieve an array similar to mysqli_result:: fetch_assoc()?
I want to be able to utilize the result in such a way like you used to do with:
while ($row = mysql_fetch_array($result)){
echo $row['foo']." ".$row['bar'];
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
好的,这是一种方法:
已编辑,修复获取多行时的错误
Okay, here is a way to do it:
Edited, to fix bug when fetching multiple rows
如果只选择一行,伊曼纽尔的答案就可以正常工作!如果查询选择多行,则 $results-Array 为每行保存一个结果,但结果始终填充最后一个条目。对 fetch() 进行一点更改,但它运行良好。
$sqlStmt 是一个字符串,填充 mysql-query
$params 是一个数组,填充应传递的变量
$results 是一个空数组,保存结果
The Answer from Emmanuel works fine, if only one row is selected! If the query select multiple rows, the $results-Array holds for every row a result, but the result is always filled with the last entry. With a little change in the fetch()-while it work well.
$sqlStmt is an string, filled with the mysql-query
$params is an array, filled with the variables that should passed
$results is an empty array, that holds the result
只是将 @Emmanuel 和 @matzino 的优秀答案与选择 PDO 而不是 mysqli 时可以获得的代码进行比较:
哎呀,就这些了吗?
Just to compare excellent answers from @Emmanuel and @matzino with the code you can get if choose PDO over mysqli:
whoops, that's all?
使用上面的答案后,我发现自己需要进行一些清理,特别是“fieldNames[]”部分。下面的代码是程序风格的。我希望它对某人有用。
我从我制作的一个可以动态查询数据的类中删除了代码。为了更容易阅读,我删除了一些内容。在我的课程中,我允许用户定义定义表和外键,以便限制前端的数据输入以及所述相关数据的过滤和排序选项。这些都是我删除的参数以及自动查询生成器。
After using the answer above I have figured out that there was some cleanup needed for myself, particularly the 'fieldNames[]' portion. The code below is in procedural style. I hope it will come of use to someone.
I cut the code from a class I made that can dynamically query data. There are a few things I removed to make it easier to read. In the class I have I allow the user to define definitions tables and foreign keys so that data entry on the front-end is restricted as well as filter and sort options for said related data. These are all parameters I removed as well as the automated query builder.