php - 奇怪的 pdo sql 更新行为

标签 php mysql sql pdo

我在 PDO 中有一个 sql UPDATE 查询,它应该更新名称和权限字符串。 但它只是将该行的 id 放置在所有列中。

这是我的代码:

public function saveRole($roleID, $name, $permissions)
{
    $sql = "UPDATE roles SET name = :name, permissions = :permissions WHERE id = :id";

    //this one sets a string variable in the PDO wrapper class
    PDO::setSQL($sql);

    //this one sets an array inside the PDO wrapper class
    PDO::setData([
        'name' => $name,
        'permissions' => $permissions,
        'id' => $roleID,
    ]);

    PDO::execute();

    return PDO::getResponse(true);
}

如您所见,我为 PDO 编写了一个包装器,如下所示:

static function execute($sql = null, $data = null, $fetchmode = \PDO::FETCH_OBJ)
{
            //check if data and SQL are set in function call, if so, use function call params, if not use class params ($this->SQL & $this->data)
    self::connect();

    try
    {
        $stmnt = self::$con->prepare(self::$sql);

        $stmnt->setFetchMode($fetchmode);

        if (sizeof(self::$data) > 0)
        {
            foreach (self::$data as $key => $value)
            {
                $stmnt->bindParam(':' . $key, $value);
            }
        }

        $stmnt->execute();

        self::$stmnt = $stmnt;

        self::$data = [];
        self::$sql = '';

        self::$lastResponse = new pdoReturn(true, $stmnt);

        return;
    } catch (\PDOException $exception)
    {
        self::$data = [];
        self::$sql = '';

        self::$lastResponse = new pdoReturn(false, $exception);

        return;
    }
}

function setSQL($sql) { 
    if (!is_string($sql)) 
        return false; 
    if (strlen($sql) == 0) 
        return false; 
    $this->sql = $sql; 
    return true; 
} 

function setData($data) { 
    if (!is_array($data)) 
        return false; 
    $this->data = $data;
    return true; 
}

最佳答案

As you see, I've written a wrapper for PDO

要立即修复,请更改

   $stmnt = self::$con->prepare(self::$sql);
   $stmnt->setFetchMode($fetchmode);

    if (sizeof(self::$data) > 0)
    {
        foreach (self::$data as $key => $value)
        {
            $stmnt->bindParam(':' . $key, $value);
        }
    }

    $stmnt->execute();

    $stmnt = self::$con->prepare(self::$sql);
    $stmnt->setFetchMode($fetchmode);
    $stmnt->execute(self::$data);

然后阅读 your first database wrapper's childhood diseases并修复其他问题,例如状态和错误报告。

关于php - 奇怪的 pdo sql 更新行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43786217/

相关文章:

Mysql存储过程多选

java - 终止另一个应用程序创建的查询

php - 在 JAX-WS 中使用安全性的最佳实践是什么

php - MySQL查询1个查询中不同计数的两个不同条件

python - mysql - 如何确保使用flask-sqlalchemy 在 Flask 中成功连接 mysql 数据库?

php - 通过 AJAX 传递数据的空 POST

c# - SQL 数据库中一对多关系的性能问题

sql - Django:ManyToManyField,带有附加列

php - 允许 JavaScript 请求 PHP 文件,但不能直接从浏览器请求

php - 如何从两个不同的表中进行 SELECT 和 COUNT 以在一个查询中获取帖子的 "like count"?