php - 警告:PDOStatement::execute():SQLSTATE[HY093]:参数编号无效:参数未在...文件文本中定义

标签 php mysql pdo prepare

$fields 是一个数组,在打印后得到如下值:

Array ( [first_name] => Nisse [last_name] => Example [ssn] => 198306205053 [address] =>           Stockholm, Sverige [phone_number] => 54654987321546 [latitude] => 55.717089999999999 [longitude] => 13.235379 )

我像这样从我的数据类中调用更新函数:

DataManager::update_user($fields, $user_data['id'];

但是我得到了错误:

Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: parameter was not defined in...filetext

我检查了其他几个类似的线程,但我想我在这里遗漏了一些基本概念,因为我仍然找不到答案。据我所知,我的数组中有 7 个 ? 和 7 个项目,如果我定义了所有值,我可以在 SQL 工作台中完美地运行它,即:

UPDATE users SET first_name = 'Kalle', last_name = 'Anka', ssn = 242345234, address = 'Stockholm', phone_number = 53423434, latitude = 17.189889231223423423424324234, longitude = 109.234234 WHERE id = 4

我已经尝试过将 $user_id 设置为特定值并且没有纬度/经度参数的 PDO 准备语句。

如果我忘记了任何重要信息,请指出,我会得到的。 address 是 varchar 和 lat/long 是 DB btw 中的 float 。使用 MYSQL。

下面的函数:

public static function update_user($fields, $user_id)
{
    $db = self::_connect();

    $st = $db->prepare("UPDATE users SET first_name = ?, last_name = ?, ssn = ?, address = ?, phone_number = ?, latitude = ?, longitude = ? WHERE id = '{$user_id}'");
    $st->execute($fields);

    return ($st->rowCount()) ? true : false;
}

最佳答案

如果您使用位置参数,您传递给 execute() 的参数数组必须是一个有序数组。同样,如果您使用命名参数,则数组必须是关联数组。

这是一个确认行为的测试:

$stmt = $db->prepare("SELECT ?, ? ,?");

$params = array( 'a', 'b', 'c' );
// OK
if ($stmt->execute($params)) {
  print_r($stmt->fetchAll());
}

$params = array( 'A'=>'abc', 'B'=>'def', 'C'=>'ghi' );
// ERROR!
if ($stmt->execute($params)) {
  print_r($stmt->fetchAll());
}

$stmt = $db->prepare("SELECT :A, :B, :C");

$params = array( 'a', 'b', 'c' );
// ERROR!
if ($stmt->execute($params)) {
  print_r($stmt->fetchAll());
}

$params = array( 'A'=>'abc', 'B'=>'def', 'C'=>'ghi' );
// OK
if ($stmt->execute($params)) {
  print_r($stmt->fetchAll());
}

请注意,在当前版本的 PHP 中,关联数组键不必 必须以: 为前缀作为@prodigitalson 注释。 : 前缀在旧版本的 PHP 中的数组键中是必需的。

还值得一提的是,当我尝试在单个查询中混合使用位置参数和命名参数时,我遇到了错误和不可预测的行为。您可以在应用中的不同查询中使用任何一种样式,但为给定查询选择一种或另一种样式。

关于php - 警告:PDOStatement::execute():SQLSTATE[HY093]:参数编号无效:参数未在...文件文本中定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14814592/

相关文章:

php - PDO 和 PHP。未定义索引,但已定义

php - 我的页面出现mysql错误

php - 将 Gravatar 实现到自定义评论系统中

php - 成功上传到文件夹,但mysql上没有数据

mysql - 备份 :run command throws generic error: '' mysqldump"is not recognized as an internal or external command

PHP PDO : Could my PHP be cleaner/more efficient?

php - 如何使用 PHP PDO 在 mysql 中插入未知数量的列

php - apache 重写规则不起作用...尝试结合 css 和 javascript

php - CodeIgniter 列表字段

php - 在MySql中插入phonegap数据