修复动态未知命名参数

Fixing dynamic unknown named parameters

提问人: 提问时间:4/8/2023 更新时间:4/9/2023 访问量:102

问:

在下面的代码片段中,仅用作多行数据的 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;
php mysqli 预备语句

评论


答:

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 中的答案。继续讨论的评论可能会被删除。