PDOStatement :: execute () ожидает, что параметр 1 будет массивом - PullRequest
0 голосов
/ 26 июня 2019

Когда я хочу обновить таблицу статей из базы данных MySQL, я получаю следующую ошибку

PDOStatement::execute() expects parameter 1 to be array, bool given in /Users/Iceson/Sites/blog jean/app/Database.php on line 49

Вот код обновления от моего managementpost.php

if(isset($_POST['update'])) {

$id = $_POST['id'];
$titre = $_POST['titre'];
$contenu = $_POST['contenu'];

App\App::getDb()->prepare("UPDATE articles SET titre ='$titre', 
contenu ='$contenu' WHERE id='id'",true);

}

Вот мой класс базы данных из моего database.php, ошибка находится в строке $req->execute($attributes); в функции prepare

<?php

namespace App;

use \PDO;

class Database {

private $db_name;
private $db_user;
private $db_pass;
private $db_host;
private $pdo;

public function __construct($db_name, $db_user = 'root', $db_pass = 'root', $db_host = 'localhost') {

    $this->db_name = $db_name;
    $this->db_user = $db_user;
    $this->db_pass = $db_pass;
    $this->db_host = $db_host;
}

private function getPDO() {
    if ($this->pdo === null) {
        $pdo = new PDO('mysql:host=localhost;dbname=blogdejean;charset=utf8', 'root', 'root');
        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $this->pdo = $pdo;
    } 
    return $this->pdo;   
}

public function query($statement, $class_name = null, $one = false) {
    $req = $this->getPDO()->query($statement);
    if($class_name === null) {
        $req->setFetchMode(PDO::FETCH_OBJ);
    } else {
        $req->setFetchMode(PDO::FETCH_CLASS, $class_name);
    }
    if($one) {
        $datas = $req->fetch();
    } else {
        $datas = $req->fetchALL();
    }
    return $datas;
}

public function prepare($statement, $attributes, $class_name = null, $one = false) {
    $req = $this->getPDO()->prepare($statement);
    $req->execute($attributes);
    if($class_name === null) {
        $req->setFetchMode(PDO::FETCH_OBJ);
    } else {
        $req->setFetchMode(PDO::FETCH_CLASS, $class_name);
    }
    if($one) {
        $datas = $req->fetch();
    } else {
        $datas = $req->fetchALL();
    }
    return $datas;
}
}

Ответы [ 3 ]

1 голос
/ 26 июня 2019

Вы неправильно используете свой класс базы данных: вместо отправки оператора с параметрами, которые вы можете связать, вы вводите значения в оператор SQL, что делает ваш запрос уязвимым для внедрения SQL.

А если вам нужно отправить массив значений для привязки, вы отправляете логическое значение.

Так что вам нужно заменить это:

App\App::getDb()->prepare("UPDATE articles SET titre ='$titre', contenu ='$contenu' WHERE id='id'",true);

с:

App\App::getDb()->prepare(
    "UPDATE articles SET titre = ?, contenu = ? WHERE id = ?",
     [
        $_POST['titre'], 
        $_POST['contenu'], 
        $_POST['id'],
    ]
);

Вероятно, вам следует еще раз подумать, почему вы так расширяете PDO; например, выборка всех строк не имеет смысла для оператора обновления.

0 голосов
/ 26 июня 2019

спасибо, теперь у меня есть общая ошибка "Общая ошибка в / Users / Iceson / Сайты / блог jean / app / Database.php: 58" это $ datas = $ req-> fetchALL ();я думаю, что испортил мой класс базы данных, все работало до обновления, я не знаю, что случилось

0 голосов
/ 26 июня 2019
public function prepare($statement, $attributes, $class_name = null, $one = false) {
    $req = $this->getPDO()->prepare($statement);
    $req->execute($attributes);
    if($class_name === null) {
        $req->setFetchMode(PDO::FETCH_OBJ);
    } else {
        $req->setFetchMode(PDO::FETCH_CLASS, $class_name);
    }
    if($one) {
        $datas = $req->fetch();
    } else {
        $datas = $req->fetchALL();
    }
    return $datas;
}

Вы подготовили метод, ожидающий массив в качестве второго аргумента ($ attribute), но вы передали его true.

App\App::getDb()->prepare("UPDATE articles SET titre ='$titre', contenu ='$contenu' WHERE id='id'",true);

Это должно быть что-то вроде этого.

App\App::getDb()->prepare("UPDATE articles SET titre = :titre, contenu = :contenu WHERE id= :id",[':titre' => $titre, ':contenu' => $contenu, ':id' => $id ]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...