Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何执行php、PDO准备的动态语句更新?_Php_Mysql_Pdo - Fatal编程技术网

如何执行php、PDO准备的动态语句更新?

如何执行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错误 下面是我

我很难找到关于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