PDOStatement :: execute()期望参数1为数组,给定布尔值

时间:2019-06-26 12:58:08

标签: php sql pdo

当我想从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 个答案:

答案 0 :(得分:1)

您错误地使用了数据库类:您没有将可绑定的参数发送给语句,而是将值插入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;例如,在更新语句上获取所有行都没有意义。

答案 1 :(得分:0)

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;
}

您的prepare方法期望一个数组作为第二个参数($ attributes),但是您将其传递给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 ]);

答案 2 :(得分:0)

谢谢大家,现在我遇到一个常规错误“ / Users / Iceson / Sites / blog jean / app / Database.php:58中的常规错误”,这是$ datas = $ req-> fetchALL();我想我弄乱了我的数据库类,直到更新部分为止一切都正常了,我不知道怎么了