php - PDO 准备语句中的参数编号无效

标签 php mysql exception pdo

我正在处理使用 PDO 类创建的一系列查询,在某些情况下,我的查询需要相同的参数。 我创建了一个用于保存数据的 foreach 语句的数组,但一些变量来自外部,我可以在一个查询中同时使用这两个数据吗?

例子:

// $connection is the PDO object;
// $full_data contains:
// $full_data[$i]["address"]
// $full_data[$i]["phone"]
// $full_data[$i]["email"]
// $full_data[$i]["user_id"]
// $full_data[$i]["surname"] // not used but present
// $full_data[$i]["name"] // not used but present

$sql = "UPDATE users_table SET city = :address, phone = :phone, email = :email, admin_id = :admin_id, admin_name = :admin_name WHERE user_id = :user_id";
$statement = $connection->prepare ($sql);


$statement->bindParam (':admin_id', trim($admin_id), PDO::PARAM_INT);
$statement->bindParam (':admin_name', trim($admin_name), PDO::PARAM_STR);


foreach ($full_data as $value) {
    $ok = $statement->execute ($value);
    $num = $statement->rowCount ();
}

} catch (PDOException $e) {
    return $e->getMessage ();
}

此页面返回错误: SQLSTATE[HY093]:参数编号无效:绑定(bind)变量的数量与标记的数量不匹配

到底是什么问题,在 UPDATE 语句上该技术有效

最佳答案

该死,几个小时后我发现了问题......

// $connection is the PDO object;
// $full_data contains:
// $full_data[$i]["address"]
// $full_data[$i]["phone"]
// $full_data[$i]["email"]
// $full_data[$i]["user_id"]
// ==> $full_data[$i]["surname"] // not used but present
// ==> $full_data[$i]["name"] // not used but present

查询 ["surname"]["name"] 中未保存的数组数据会产生错误。 好像execute();需要精确的数组数据结构。 我用这个解决了这个问题:

$sql = "UPDATE users_table SET city = :address, phone = :phone, email = :email, admin_id = :admin_id, admin_name = :admin_name WHERE user_id = :user_id";
$statement = $connection->prepare ($sql);

// must be removed ==> $statement->bindParam (':admin_id', trim($admin_id), PDO::PARAM_INT);
// must be removed ==> $statement->bindParam (':admin_name', trim($admin_name), PDO::PARAM_STR);

for ($i = 0; $i < count($full_data); $i++) {
    $full_data[$i]["admin_name"] = "the admin name";
    $full_data[$i]["admin_id"] = "100";
    unset ($full_data[$i]["surname"]); // IMPORTANT: must remove the unused vars
    unset ($full_data[$i]["name"]); // IMPORTANT: must remove the unused vars
}



foreach ($full_data as $value) {
    // bindParam can be avoided, but it's recommended for data type security
    $statement->bindParam(':address', trim($value['address']), PDO::PARAM_STR);
    $statement->bindParam(':phone', trim($value['phone']), PDO::PARAM_STR);
    $statement->bindParam(':email', trim($value['email']), PDO::PARAM_STR);
    $statement->bindParam(':admin_id', trim($value['admin_id']), PDO::PARAM_INT);
    $statement->bindParam(':admin_name', trim($value['admin_name']), PDO::PARAM_STR);

    $ok = $statement->execute ($value);
    $num = $statement->rowCount ();
}

} catch (PDOException $e) {
    return $e->getMessage ();
}

关于php - PDO 准备语句中的参数编号无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2105015/

相关文章:

php - 样式 cakephp 表单选择框中的错误

php - 图片上传到文件夹中。但在浏览器中无法查看

php - 无法获取基于 mysql 查询的表单来加载所有 POST 变量

java - 全屏独占模式错误

java - Exception Java 的异常构造函数

php - 在 Linux 上安装 GD 库和 freetype

sql - MySQL 中的两个左连接和一个联合

MySql where..in multiple columns

ios - 无法找到零星的 SIGABRT 错误!如何寻找原因?

php - 变量在 PHP 而不是在 Blade 中?