Как вы выполняете динамическое обновление подготовленного оператора php, PDO? - PullRequest
1 голос
/ 03 декабря 2011

У меня проблемы с поиском хорошей документации по инструкциям, подготовленным для pdo, и еще больше проблем с поиском документации по динамическому обновлению базы данных с помощью операторов, подготовленных 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();


 ?>

Если все переменные заменить действительными значениями, результат, которого я добиваюсь методом update (), будет выглядеть следующим образом:

public function update(){

    $stmt  = "UPDATE users SET ";
    $stmt .= "username=:username, password=:password ";
    $stmt .= "WHERE id=1";  
    $stmt  = $this->db->prepare($stmt);
    if($stmt->execute($this->properties())) {
        echo "yes";
    } else {
        echo "error ";
    }
}

В дополнение к обнаружению этой проблемы, пожалуйста, дайте мне знать, если вы видите какие-либо другие проблемы с этим кодом. Я все еще новичок в PHP.

Редактировать: Теперь я создал новый метод, который добавляет: в начало каждого ключа в массиве свойств:

public function colProperties(){
    $properties = $this->properties();
    $withCols = array();
    foreach($properties as $key => $value){
        $withCols[":".$key] = $value;

    }
    return $withCols;
}

Итак, мой метод update () теперь выглядит так: публичная функция update () {

    $stmt  = "UPDATE ". $this->tableName." SET ";
    $stmt .= $this->polishedVals();
    $stmt .= "WHERE id=" . $this->id;   
    $stmt  = $this->db->prepare($stmt);

    if($stmt->execute($this->colProperties())) {
        echo "yes";
    } else {
        echo "error ";
    }
}

и если я var_dump ($ this-> colProperties), я получаю: array (2) {[": username"] => string (5) "Jonny" [": password"] => string (9) "Appleseed"} И все равно получаю ту же ошибку.

Ответы [ 2 ]

2 голосов
/ 03 декабря 2011

Я не думаю, что передача параметров в запрос UPDATE требует другого метода, чем SELECT.Информация в справочной странице PDOStatement-> execute () должна применяться:

<?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));
?>

Вы используете именованные параметры, поэтому execute() ожидает ассоциативный массив.Используйте var_dump () , чтобы отобразить $this->properties() непосредственно перед execute():

var_dump($this->properties())

Убедитесь, что ваши ключи точно совпадают.

0 голосов
/ 27 февраля 2017

Ошибка в том, что между

$stmt .= $this->polishedVals();
$stmt .= "WHERE id=" . $this->id; 

Между предложением WHERE должен быть пробел, поскольку метод polishedVals () не добавляет пробел после имплозии.Итак, у вас будет что-то вроде

UPDATE User SET city=:city, location=:locationWHERE User.id=28

, что вызывает ошибку.Простая ошибка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...