Arhn - архитектура программирования

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

У меня возникли проблемы с поиском хорошей документации по подготовленным операторам обновления 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() теперь выглядит так: 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->colProperties())) {
        echo "yes";
    } else {
        echo "error ";
    }
}

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

03.12.2011

  • Пожалуйста, опубликуйте содержимое $this->properties() 03.12.2011
  • Это опубликовано. Это прямо под методом подключения. Метод свойств просто создает ассоциативный массив с атрибутами, определенными в классе. Таким образом, в этом случае массив будет выглядеть так: Массив ( [имя пользователя] => Джонни [пароль] => Appleseed ) 03.12.2011
  • Я имел в виду опубликовать фактическое содержимое переменной через var_dump($this->properties(). Если ключи массива не начинаются с двоеточия, выполнение оператора завершится ошибкой. Они должны выглядеть как Array ( [:username] => Jonny [:password] => Appleseed ) 03.12.2011
  • Я вижу, что ты говоришь. Мне не нужно было делать это с помощью моего метода вставки(). Если я изменяю свойства дампа, я получаю: массив (2) { [имя пользователя] => строка (5) Джонни [пароль] => строка (9) Appleseed }. 03.12.2011
  • @Michael Я создал метод, который добавляет : в начало каждой клавиши. И var_dump показывает: «массив (2) { [: имя пользователя] => строка (5) Джонни [: пароль] => строка (9) Appleseed }». Я, $this-›properties, с помощью моего нового метода '$this-›colProperties(). Все еще получаю ошибку. Думаю, я просто продолжу. 03.12.2011
  • возможный дубликат вставить/обновить вспомогательную функцию с использованием PDO 03.12.2011

Ответы:


1

Я не думаю, что для передачи параметров в запрос 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())

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

03.12.2011
  • @ Скотт, вы можете отредактировать свой вопрос и предоставить там дополнительную информацию. Код в комментариях не читается. Как бы то ни было, я не вижу очевидной ошибки. 03.12.2011

  • 2

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

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

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

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

    Что вызывает ошибку. Простой баг.

    27.02.2017
    Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..