动态准备语句,PHP
Dynamic prepared statement, PHP
我检查了几乎所有产生相同错误的问题,但所有这些问题都以错误的方式绑定了参数。也许而且很可能我也错误地绑定了参数,尽管我的情况不同因为我有动态查询。
我正在根据正在完美创建的输入动态创建查询。但是问题来自 foreach
循环中的 $stmt->bind_param
语句。这是我的错误代码片段:
$query = "UPDATE users SET";
foreach($updationFields as $field => $value){
if($value != "-"){
$query = $query. " " . $field . " = :".$field.",";
}
}
$query = rtrim($query, ",");
$query = $query . " WHERE UserId = :UserId";
$stmt = $this->conn->prepare($query);
foreach($updationFields as $field => $value){
echo $field;
if($value != "-"){
$input = ":".$field;
$stmt->bind_param($input, $value); // This line produces error
}
}
$stmt->bind_param(":UserId", $userId);
$stmt->execute();
此处为一个字段生成动态 "string query":
UPDATE users SET fullName = :fullName WHERE UserId = :UserId
错误说:致命错误:在
中的非对象上调用成员函数 bind_param()
知道我做错了什么吗?
正如@Fred-ii- 和@commorrissey 指出的那样 :Placeholder
由 PDO 支持而不是 mysqli 所以我不得不:
- 将
:Placeholders
替换为?
- 使用
call_user_func_array
调用 bind_param
,按 mysqli_stmt 的预期提供动态引用。
下面是创建动态绑定的代码:
$params = array();//
$params[] = $type;
$i=0;
foreach($updationFields as $field => $value){
if($value != "-"){
$bind_name = 'bind' . $i;
$$bind_name = $value;
$params[] = &$$bind_name;
$i++;
}
}
$bind_name = 'bind' . $i;
$$bind_name = $userId;
$params[] = &$$bind_name;
$return = call_user_func_array(array($stmt,'bind_param'), $params);
我检查了几乎所有产生相同错误的问题,但所有这些问题都以错误的方式绑定了参数。也许而且很可能我也错误地绑定了参数,尽管我的情况不同因为我有动态查询。
我正在根据正在完美创建的输入动态创建查询。但是问题来自 foreach
循环中的 $stmt->bind_param
语句。这是我的错误代码片段:
$query = "UPDATE users SET";
foreach($updationFields as $field => $value){
if($value != "-"){
$query = $query. " " . $field . " = :".$field.",";
}
}
$query = rtrim($query, ",");
$query = $query . " WHERE UserId = :UserId";
$stmt = $this->conn->prepare($query);
foreach($updationFields as $field => $value){
echo $field;
if($value != "-"){
$input = ":".$field;
$stmt->bind_param($input, $value); // This line produces error
}
}
$stmt->bind_param(":UserId", $userId);
$stmt->execute();
此处为一个字段生成动态 "string query":
UPDATE users SET fullName = :fullName WHERE UserId = :UserId
错误说:致命错误:在
中的非对象上调用成员函数 bind_param()知道我做错了什么吗?
正如@Fred-ii- 和@commorrissey 指出的那样 :Placeholder
由 PDO 支持而不是 mysqli 所以我不得不:
- 将
:Placeholders
替换为?
- 使用
call_user_func_array
调用bind_param
,按 mysqli_stmt 的预期提供动态引用。
下面是创建动态绑定的代码:
$params = array();//
$params[] = $type;
$i=0;
foreach($updationFields as $field => $value){
if($value != "-"){
$bind_name = 'bind' . $i;
$$bind_name = $value;
$params[] = &$$bind_name;
$i++;
}
}
$bind_name = 'bind' . $i;
$$bind_name = $userId;
$params[] = &$$bind_name;
$return = call_user_func_array(array($stmt,'bind_param'), $params);