0

PHP クラスを介して MySQL データベースを更新するのに問題があります (これは PHP クラスへの最初の本格的な進出であるため、いくつかの非常に基本的な要素が欠けている可能性があります)。私が抱えている問題 (つまり、MySQL テーブルを適切に更新していない) に関連するコードを含めました。

コードを簡単に説明するために、オブジェクトが作成されるときにデータベースからユーザーの情報を取得します。modify_column()次に、取得したデータから数値を増減する関数を呼び出します。最後に、実行save()して MySQL テーブルを更新します。

2 つの問題があります: (1)$this->info変更機能によって適切に更新されていません (たとえば、 I の場合、 (元の年齢が 9 であると仮定すると)ではなくmodify_column('age', '1')var_dump が表示されます)。(2) 更新クエリが機能していません。最初の問題に起因する不適切なサイズの変数があるためだと思います。age int(3)age string(2) = 10

コードのスニペット (私のデータベース関数は 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;

DBで整数を使用している場合は、ID値が整数としてキャストされていることも確認する必要があります。

DB抽象化がどのように機能するかわからないため、何が起こっているのかを判断するのは困難です。クエリ自体をエコーアウトしてデータベースに対して試すか、返されるMySQLエラーを調べて、そこで何が問題になっているのかを把握することをお勧めします。

于 2012-12-03T20:48:32.887 に答える