gpt4 book ai didi

php - 使用 call_user_func_array() 动态构建准备好的语句

转载 作者:可可西里 更新时间:2023-11-01 08:04:21 24 4
gpt4 key购买 nike

<分区>

我需要根据用户输入动态构建 SQL 语句和参数。 sql 语句的长度和参数的数量根据用户输入而变化。我正在尝试使用 this tutorial并将其应用于我的代码。这是代码:

$query = "SELECT p.*, s.* 
FROM product p
INNER JOIN product_shop ps
ON ps.p_id = p.p_id
INNER JOIN shop s
ON s.s_id = ps.s_id
WHERE s.country = ?";
$a_params[] = $place['country'];
$a_param_type[] = "s";
// prepare and bind

$param_type = '';

foreach ($place as $key => $value) {
if ($key === "country") {
continue;
}
$query .= " and s.$key = ?";
$a_params[] = $value;
$a_param_type[] = "s";
}
/* Prepare statement */
$stmt = $conn->prepare($query);
if($stmt === false) {
trigger_error('Wrong SQL: ' . $sql . ' Error: ' . $conn->errno . ' ' . $conn->error, E_USER_ERROR);
}

$a_params[] = $a_param_type;

/* use call_user_func_array, as $stmt->bind_param('s', $param); does not accept params array */
call_user_func_array(array($stmt, 'bind_param'), $a_params);

/* Execute statement */
$stmt->execute();
$meta = $stmt->result_metadata();

我知道 $place['country'] 将始终被填充。 sql语句是正确的。它是:

"SELECT p.*, s.* \n        FROM product p \n        INNER JOIN product_shop ps \n        ON ps.p_id = p.p_id \n        INNER JOIN shop s \n        ON s.s_id = ps.s_id \n        WHERE s.country = ? and s.suburb = ? and s.city = ? and s.province = ?"

不要介意“\n”字符,它们对 sql 语句没有影响。

在:

call_user_func_array(array($stmt, 'bind_param'), $a_params);

$a_params 的值为:

0:"New Zealand"
1:"Grey Lynn"
2:"Auckland"
3:"Auckland"
4:array(4)
0:"s"
1:"s"
2:"s"
3:"s"

在:

$meta = $stmt->result_metadata();

$meta 的值变为:

current_field:0
field_count:13
lengths:null
num_rows:0
type:1

表示没有从数据库中选择任何行。我已经在数据库上手动执行了这个 sql,它返回了行。我的代码有什么问题,导致它没有从数据库返回任何行?

编辑: 我看到了 this answer说要将“ssss”放在 $params 的开头所以我这样做了并在 $stmt 对象中得到了这个错误:

errno:2031
error:"No data supplied for parameters in prepared statement"
error_list:array(1)
propertyNode.hasAttribute is not a function

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com