0

我在通过 PHP 类更新 MySQL 数据库时遇到了一些麻烦(这是我第一次真正涉足 PHP 类,所以我可能会遗漏一些非常基本的元素)。我已经包含了与我遇到的问题相关的代码(即没有正确更新 MySQL 表)。

为了快速解释我的代码,我在构造对象时从数据库中提取用户信息。然后,我调用该函数modify_column()从我提取的数据中增加或减少一个数值。最后,我运行save()更新 MySQL 表。

我有两个问题:(1)$this->info没有被修改函数正确更新(例如,如果 I modify_column('age', '1'),一个 var_dump 显示age int(3)而不是age string(2) = 10(假设原始年龄是​​ 9 岁)。和(2),更新查询不起作用.我假设这是因为我有一个源自第一个问题的大小不正确的变量。

代码片段(我的数据库函数基于 PDO 包装器,它们一直工作得很好):

class user {

    public $id;

    public function __construct($id) {

        global $db;

        /* pull the user's information from the database */
        $bind = array(':id' => $id);
        $result = $db->select('user', 'id = :id', $bind, '*', SQL_SINGLE_ROW);

        $this->id = $result['id'];
        $this->info = $result;
    }

    /*
     * Update the user's MySQL table, thereby saving the data.
     */
    public function save() {

        global $db;

        $bind = array($this->id);
        $db->update('users', $this->info, 'id = ?', $bind);

    }

    public function modify_column($column, $amount) {
        $this->info[$column] += $amount;
    }
}

另外,请让我知道是否有一种更简洁的方法来完成我想要完成的工作(即使用类函数快速修改表中的数值。

谢谢!

4

1 回答 1

0

您似乎没有任何输入变量的规定。当您将数据添加到$this->info所有值时,将被设置为字符串。您不想对字符串进行增量数学(即+=-=)。您需要将这些值转换为整数。我建议添加一个具有类属性及其类型数组的类属性。然后,您将能够在设置$info数组时根据它们的类型转换所有值。

所以像这样

protected $fields = array(
    'age' => 'integer',
    'name' => 'string',
    // etc.
}

然后你可以添加这样的功能

protected function type_cast(&$value, $key) {
    // field type to use
    $type = $this->fields[$key];
    if ($type === 'integer') {
        $value = (integer)$value;
    } else if ($type === 'string') {
        $value =  (string)$value;
    } // etc.
}

在您的构造函数中,只需遍历$result函数type_cast

array_walk(&$result, array($this, 'type_cast'));
$this->info = $result;

如果您在数据库中使用整数,您可能还需要确保将您的 id 值转换为整数。

我不确定你的数据库抽象是如何工作的,所以很难说出发生了什么。我建议回显查询本身并针对数据库进行尝试,或者查看返回的 MySQL 错误以了解那里出了什么问题。

于 2012-12-03T20:48:32.887 回答