2

データベースをセットアップしましたが、これはテーブルの 1 つです。

+-------------------------+------------+------+-----+---------------------+-------+
| Field                   | Type       | Null | Key | Default             | Extra |
+-------------------------+------------+------+-----+---------------------+-------+
| id                      | char(23)   | NO   | PRI | NULL                |       | 
| claim_date              | timestamp  | NO   |     | CURRENT_TIMESTAMP   |       | 
| banned                  | tinyint(1) | NO   |     | NULL                |       | 
| available_downloads     | tinyint(4) | NO   |     | 10                  |       | 
| last_download_attempt   | datetime   | NO   |     | NULL                |       | 
| last_activation_attempt | datetime   | NO   |     | NULL                |       | 
| download_exp_date       | timestamp  | NO   |     | 0000-00-00 00:00:00 |       | 
| available_activations   | tinyint(4) | NO   |     | 5                   |       | 
| os_version              | tinyint(1) | NO   |     | NULL                |       | 
+-------------------------+------------+------+-----+---------------------+-------+

問題は、mysqli_stmt と mysqli->query() の両方を使用して新しい値でレコードを更新しようとするたびに、datetime 以外のすべての値が変更されることです。私が使用しているクエリは

$stmt = $this->db->prepare('UPDATE licences SET available_activations=available_activations-1, last_activation_attempt=? WHERE id=?');
$stmt->bind_param("ss", date("Y-m-d H:i:s"), $licence_id);
$stmt->execute();

available_activations の値は減少しますが、last_activation_attempt は変化しません。時間の値を ("Ymd His" とタイムスタンプの両方の形式で) ハードコーディングしようとしましたが、データ型をタイムスタンプに変更しようとしましたが、まだ死んでいます。mysql コンソールに同じクエリを入力すると正常に動作しますが、php はそれを処理していないようです。この場合、どうすればよいですか?

更新 最も奇妙なことは何ですか-このコードは外部アプリケーションからクラスメソッドとして呼び出され、カスタムphpコードから(メソッド)を呼び出すと正常に動作します(available_activationsとlast_activation_attemptの両方の値が変更されます)が、使用するとこのアプリケーションでは、available_activation 値のみが変更されます。$_POST データを使用します。

4

2 に答える 2

0

再作成しようとしたとき、それを機能させることができました。いくつかのアイデア: prepare、bind_param、および execute 呼び出しの失敗をチェックします。

このシナリオでは、date() 値でバインドする代わりに、準備されたステートメントで last_activation_attempt を NOW() に設定する方が簡単ではないでしょうか?

于 2012-06-15T13:44:22.503 に答える
0

テストするほどの時間はありませんが、MySQL のタイムスタンプ形式で使用してみます。

$stmt->bind_param("ss", date("YmdHis"), $licence_id);

はっきりとは覚えていませんが、MySQL はY-m-d H:i:sフォーマットで出力してもその方法を好むと思います。

于 2012-06-15T13:50:29.273 に答える