如何执行php、PDO准备的动态语句更新?
我很难找到关于pdo update准备语句的好文档,甚至更难找到关于使用pdo准备语句动态更新数据库的文档。我已经让我的动态插入工作,但有更新的问题。我得到的错误是: 警告:PDOStatement::execute()[PDOStatement.execute]: SQLSTATE[HY093]:参数编号无效:未定义参数 在里面 /Users/scottmcpherson/Sites/phpsites/projectx/application/models/db.php 在线91错误 下面是我创建的类减去与此问题无关的两个方法:如何执行php、PDO准备的动态语句更新?,php,mysql,pdo,Php,Mysql,Pdo,我很难找到关于pdo update准备语句的好文档,甚至更难找到关于使用pdo准备语句动态更新数据库的文档。我已经让我的动态插入工作,但有更新的问题。我得到的错误是: 警告:PDOStatement::execute()[PDOStatement.execute]: SQLSTATE[HY093]:参数编号无效:未定义参数 在里面 /Users/scottmcpherson/Sites/phpsites/projectx/application/models/db.php 在线91错误 下面是我
<?php
require_once("../config/main.php");
class Database{
protected static $dbFields = array('username', 'password');
public $db;
public $tableName = 'users';
public $id = 1;
public $username = "Jonny";
public $password = "Appleseed";
public function __construct() {
$this->connect();
}
public function connect(){
try {
$this->db = new PDO("mysql:host=".DB_SERVER."; dbname=".DB_NAME, DB_USER, DB_PASS);
} catch (PDOException $e) {
echo 'Connection failed: ' . $e->getMessage();
}
}
public function properties() {
$properties = array();
foreach (self::$dbFields as $field) {
if (isset($this->field) || property_exists($this, $field)) {
$properties[$field] = $this->$field;
}
}
return $properties;
}
public function propertyValues() {
$property = $this->properties();
$propertyValues = array();
foreach ($property as $key => $value) {
$propertyValues = ":" . implode(", :", array_keys($property));
}
return $propertyValues;
}
public function polishedVals(){
// The end result of this function is:
// username=:username, password=:password
$props = $this->properties();
$phaseOne = array();
foreach ($props as $key => $value) {
$phaseOne[$key] = ":".$key;
}
$phaseTwo = array();
foreach ($phaseOne as $key => $value) {
$phaseTwo[] = "{$key}={$value}";
}
$polishedVals = implode(", ", $phaseTwo);
return $polishedVals;
}
public function update(){
$stmt = "UPDATE ". $this->tableName." SET ";
$stmt .= $this->polishedVals();
$stmt .= "WHERE id=" . $this->id;
$stmt = $this->db->prepare($stmt);
if($stmt->execute($this->properties())) {
echo "yes";
} else {
echo "error ";
}
}
}
$database = new Database();
echo$database->update();
?>
除了发现这个问题,如果你发现这个代码还有其他问题,请告诉我。我对PHP还是有点陌生
编辑:我现在创建了一个新方法,该方法在属性数组中每个键的开头添加一个::
public function colProperties(){
$properties = $this->properties();
$withCols = array();
foreach($properties as $key => $value){
$withCols[":".$key] = $value;
}
return $withCols;
}
因此,我的update()方法现在看起来像:
公共功能更新(){
如果我使用var_dump($this->colProperties),我会得到:
数组(2){[“:username”]=>string(5)“Jonny”[“:password”]=>string(9)“Appleseed”}
但仍然会出现相同的错误。我不认为向更新查询传递参数需要与选择查询不同的方法。手册页面中的信息应适用于:
<?php
/* Execute a prepared statement by passing an array of insert values */
$calories = 150;
$colour = 'red';
$sth = $dbh->prepare('SELECT name, colour, calories
FROM fruit
WHERE calories < :calories AND colour = :colour');
$sth->execute(array(':calories' => $calories, ':colour' => $colour));
?>
确保您的键完全匹配。错误介于两者之间
$stmt .= $this->polishedVals();
$stmt .= "WHERE id=" . $this->id;
WHERE子句之间需要有一个空格,因为polishedVals()方法不会在内爆后添加空格
UPDATE User SET city=:city, location=:locationWHERE User.id=28
这导致了错误。
简单错误。请发布发布的
$this->properties()
的内容。它就在connect方法的正下方。properties方法只是创建一个带有类中定义的属性的关联数组。因此,在这种情况下,数组看起来像:array([username]=>Jonny[password]=>applesed)我的意思是通过var\u dump($this->properties()
)发布实际变量内容。如果数组键不以冒号开头,语句执行将失败。它们应该像array([:username]=>Jonny[:password]=>applesed)
我明白你的意思了。我不需要用insert方法()。如果我使用var dump属性,我会得到:array(2){[“username”]=>string(5)“Jonny”[“password”]=>string(9)“applesed”}@Michael我创建了一个方法,在每个键的开头加上一个:。var_dump显示:“array(2){[“:username”]=>string(5)“Jonny”[“:password”]=>string(9)“applesed”}“.I,$this->properties,使用我的新方法“$this->colProperties()。仍然会出错。我想我还是继续吧。@Scott,你可以编辑你的问题并在那里提供进一步的信息。注释中的代码不可读。无论如何,我看不到明显的错误。
var_dump($this->properties())
$stmt .= $this->polishedVals();
$stmt .= "WHERE id=" . $this->id;
UPDATE User SET city=:city, location=:locationWHERE User.id=28