我正在阅读PHP manual的mysqli_stmt_bind_result,并在comments中看到了这段代码:
while ( $field = $meta->fetch_field() ) {
$parameters[] = &$row[$field->name];
}
鉴于在该行之前既没有$ params也没有$ row,为什么/该行如何工作?
答案 0 :(得分:6)
PHP实际上没有变量声明。这意味着在某些情况下,您可以引用变量而无需事先声明它们。我说一些案例是因为:
foreach($undefinedArray as $key=>$value){
// will give a notice and a warning
// notice: undefined variable
// warning: invalid argument to foreach
}
但这并不意味着你不能这样做:
for($i=0;$i<5;$i++){
$undefinedArray[]=$i;
}
// will create an array with 5 indexes, each holding the numbers 0 through 4
这是有效的,因为找不到$undefinedArray
并在运行中创建。
现在,关于你自己的情况。我会假设你的意思this post。我不得不承认,这是一个非常有趣的解决方案,我会试着抑制自己对那里的任何不良做法发表评论,但让我们继续解释它!
$params[] = &$row[$field->name];
这是魔术发生的地方,实际上是由于&amp ;.因为&$row['unknown_index']
,实际上会创建索引!
这意味着上面的陈述做了两件事。首先,它创建一个数组,每个列名都保存为$row
($row[$field->name]
)中的索引。然后它会保存指向$row
中$params
的每个元素的指针。
call_user_func_array(array($stmt, 'bind_result'), $params);
这是$stmt->bind_result()
。但是将$params
中的每个元素作为参数传递给bind_result。因为它们是通过引用传递的,所以$ row的每个索引都将保存每个选定的字段。
其余的应该很容易理解。
如果您有任何疑问。随意问一下!
答案 1 :(得分:4)
从第一条评论开始。
$variables = array();
$data = array();
$meta = $result->result_metadata();
while($field = $meta->fetch_field())
$variables[] = &$data[$field->name]; // pass by reference
call_user_func_array(array($result, 'bind_result'), $variables);
那么问题是什么?
答案 2 :(得分:1)
它不起作用,因为如你所说,这些变量不存在。
答案 3 :(得分:1)
来自C,C ++编程学校,我有时很难接受PHP的堆栈和堆管理。 PHP会自动执行太多操作,这给开发人员带来了太多的自由。无论如何,在Dexter的精彩解释之后,我确定Khez已经清除了他的怀疑。我只是想在代码中添加我的分数,以便更好地了解在here提到的代码中发生的事情。
$stmt = $conn->prepare ("SELECT * FROM sample");
$stmt->execute ();
$meta = $stmt->result_metadata();
$params = array (); // You can skip these lines, PHP initiates arrays on
$row = array (); // the fly. I prefer doing as much of these initializations
$results = array (); // as possible, on my own.
while ($field = $meta->fetch_field())
{
/* Again, you can skip the following line, PHP will automatically create
* a new key/value pair and since we are using the same name for the
* container of that key/value pair, PHP will actually keep appending.
* So after N loops you have an array that contains N key/value pairs
*/
$row [$field->name] = 0;
$params[] =& $row[$field->name];
}
/* So now, $params is an array of N references, where reference i points to
* the value part of i-th key/val pair in $row
*/
call_user_func_array (array ($stmt, 'bind_result'), $params);
$index = 0;
while ($stmt->fetch ())
{
// again, one can skip this. PHP creates this on the fly.
$results[$index] = array();
foreach ($row as $key => $val)
{
// skip making that temp array!
$results[$index][$key] = $val;
}
$index += 1;
}
return $results;
就是这样。希望这段代码有意义。
P.S:作为一个事后的想法,我想澄清一下我对PHP的疑虑。如果我尝试填充$ results如下:$results[$index][] = $row;
或者像这样:
$results[] = $row;
$ results中的所有键/值对重复包含相同的集合。希望有人能够对PHP的这种行为有所了解。