提问人: 提问时间:4/8/2023 更新时间:4/9/2023 访问量:102
修复动态未知命名参数
Fixing dynamic unknown named parameters
问:
在下面的代码片段中,仅用作多行数据的 SELECT 语句,它给出了以下错误:$stmt->bind_param($types, ...$values);
mysqli_stmt::bind_param() 不接受未知的命名参数
我一般理解这个错误,但它是动态的,其中已经有必要的问号,但可能有任意数量的问号,或者可能只有一个。$Query
$types
$values
$results_array = [];
if (!empty($values)) :
$stmt = $mysqli->prepare($Query);
$stmt->bind_param($types, ...$values);
$stmt->execute();
$result = $stmt->get_result();
while($row = $result->fetch_array()) :
$results_array[] = $row;
endwhile;
$stmt->close();
return $results_array;
endif;
$mysqli
当然包含连接字符串,而正在使用的动态查询已经包含问号并包含相关字段类型,即“SSSI”或其他任何类型,并与数组中的数据匹配。$Query
$types
$values
由于下面的帮助,它现在似乎正在工作。由于其中一些来自答案和评论,我不能相信,所以我将在这里附加我现在所拥有的,因为当前的问题似乎已经解决!我也详细阐述了一下。这是一个更大的函数的一小部分,因此$selType被传递到其中。
$results_array = [];
if (!empty($values)) :
$stmt = $mysqli->prepare($Query);
$stmt->bind_param($types, ...$values);
$stmt->execute(array_values($values));
$result = $stmt->get_result();
if ($selType === "assoc") :
while($row = $result->fetch_assoc()) :
$results_array[] = $row;
endwhile;
else :
while($row = $result->fetch_array()) :
$results_array[] = $row;
endwhile;
endif;
$stmt->close();
return $stmt->get_result()->fetch_all();
endif;
答:
0赞
SamHoque
4/8/2023
#1
您可以根据值的数量动态生成 SQL 查询的问号,然后将值绑定到参数mysqli_stmt::bind_param()
重构代码后,它应如下所示。
$results_array = [];
if (!empty($values)) {
$num_values = count($values);
$question_marks = str_repeat("?,", $num_values);
$question_marks = rtrim($question_marks, ",");
$Query .= " VALUES (" . $question_marks . ")";
$stmt = $mysqli->prepare($Query);
$stmt->bind_param($types, ...$values);
$stmt->execute();
$result = $stmt->get_result();
while($row = $result->fetch_array()) {
$results_array[] = $row;
}
$stmt->close();
}
return $results_array;
评论
0赞
4/8/2023
谢谢你和很好的答案,这将非常有帮助,但我不确定这是在这种情况下的问题。查询已经有问号了。
2赞
Dharman
4/8/2023
您也可以将值作为数组传递execute
0赞
Dharman
4/8/2023
#2
您似乎正在尝试解压缩关联数组。它需要是一个列表。您可以将其转换为列表。array_values
在 PHP 8.1 上简化的代码应如下所示:
$results_array = [];
if (!empty($values)) :
$stmt = $mysqli->prepare($Query);
$stmt->execute(array_values($values));
return $stmt->get_result()->fetch_all();
endif;
评论
0赞
Dharman
4/9/2023
评论已移至聊天室;请不要在此处继续讨论。在下方发表评论之前,请查看评论的目的。不要求澄清或提出改进建议的评论通常属于 Meta Stack Overflow 或 Stack Overflow Chat 中的答案。继续讨论的评论可能会被删除。
评论