Php 类内PDO准备的语句

Php 类内PDO准备的语句,php,mysql,pdo,Php,Mysql,Pdo,我试图在我的数据库类中使用一个更新方法,在这里我可以更新一条记录。我正在努力确保我可以在另一个例子中使用这个方法,我不必重复写同样的语句。这是我的密码: <?php require 'init.php'; class Database { private $conn; public function __construct() { try { $this->conn = new PDO('mysql:host=localho

我试图在我的数据库类中使用一个更新方法,在这里我可以更新一条记录。我正在努力确保我可以在另一个例子中使用这个方法,我不必重复写同样的语句。这是我的密码:

<?php 
require 'init.php';
class Database {
    private $conn;

    public function __construct() {
        try {
            $this->conn = new PDO('mysql:host=localhost;dbname=school', DB_USER, DB_PASS);
            $this->conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        } catch(PDOException $e) {
            return false;
        }
    }

    public function update($table, $key, $value, $id) {
        $stmt = $this->conn->prepare("UPDATE $table SET $key = $value WHERE id = :id");
        return $stmt->execute(array($key => $value, 'id' => $id));
    }
}
$database = new Database();

您没有正确使用PDO的绑定功能。您应该执行以下操作:

public function update($table, $key, $value, $id) {
    $stmt = $this->conn->prepare(
        "UPDATE $table SET $key = :value WHERE id = :id"
    );
    return $stmt->execute(array(
        ':value' => $value,
        ':id' => $id
    ));
}
首先,需要将要绑定的整个字符串放入绑定数组的键中。所以你把
':id'
而不是
'id'
。另外,在
$table
$value
的情况下,您将变量直接放入查询中,但随后尝试将它们相互绑定,这是没有意义的


编辑:不能使用PDO绑定表和列名。

fyi:不,您不能绑定表/列,您可以将它们列为白名单,谢谢,但它不起作用。顺便问一下,请问最好的方法是什么?回复:惠特利斯特@甘达利特里我不知道为什么它不起作用。如果查询中的
:value
是字符串,则应该在其周围加引号。你犯了什么错误?至于白名单,我不知道PDO是否内置了类似的东西,但您可以手动执行,只需检查
$table
$key
是否在可接受的值数组中。“如果是字符串,您应该在查询中加引号:value。”-否。执行
“更新$table SET$key=':value'其中id=':id”“
是无效的,如果你是这个意思的话。像这样的引号
':value'=>$value,
是可以的,只是不在查询本身中。哎呀,我的错又来了。我猜PDO是为您做的。您对
$table
$key
$value
使用的实际值是什么?另外,告诉我们您得到的实际错误;这很重要。这些是传递的实际值和常量值吗?
“admin”、“username”、“golobo”、13
?如果您试图传递一个包含空格、连字符、撇号等的值,或者可能包含空格的值,则会造成问题。您需要将变量包装在backticks
`
中,实际上我正试图测试那些值
useename,golobo,13
来测试对象@Fred ii你的实际错误是什么?另外,您是否使用错误报告<代码>错误报告(E_全部);ini设置(“显示错误”,1)放在你的开场白之后
如果你不告诉我“这么说”的错误是什么,我就帮不了你了,祝你好运。