$ fields是一个数组,打印后得到的值如下:
Array ( [first_name] => Nisse [last_name] => Example [ssn] => 198306205053 [address] => Stockholm, Sverige [phone_number] => 54654987321546 [latitude] => 55.717089999999999 [longitude] => 13.235379 )
我从数据类中调用update函数,如下所示:
DataManager::update_user($fields, $user_data['id'];
但是我得到了错误:
警告:PDOStatement :: execute():SQLSTATE [HY093]:无效的参数编号:在…文件文本中未定义参数
我检查了其他几个类似的线程,但我想这里缺少一些基本概念,因为我仍然找不到答案。据我所知,数组中有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准备语句。
如果我忘记了任何重要信息,请指出来,我会得到的。地址是varchar,而lat / long是DB btw中的浮点数。使用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()必须为序数数组。同样,如果使用命名参数,则数组必须是关联数组。
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中使用前缀。
:
还值得一提的是,当我尝试在单个查询中混合使用位置参数和命名参数时,遇到了错误和不可预测的行为。您可以在应用程序的 不同 查询中使用这两种样式,但可以为给定查询选择一种样式或另一种样式。