我已经设置了一个数据库,这是其中一个表:
+-------------------------+------------+------+-----+---------------------+-------+
| 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()更新带有新值的记录时,所有值都会与日期时间值相比发生变化。 我正在使用的查询是
$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不会让步。我甚至尝试对时间值进行硬编码(均为“Y-m-d H-i-s”和时间戳格式),我尝试将数据类型更改为时间戳,但它仍然无效。当我在mysql控制台中输入相同的查询时它工作正常,但PHP似乎没有处理它。在这种情况下我该怎么办?
更新 什么是最奇怪的事情 - 这段代码被称为来自外部应用程序的类方法,当我从自定义php代码调用它(方法)时它工作正常(available_activations和last_activation_attempt值都被更改),但是当我使用它时应用程序只有available_activation值更改。它使用$ _POST数据。
答案 0 :(得分:0)
当我尝试重新创建时,我可以让它工作。一些想法:检查prepare,bind_param和执行调用的失败。
在这种情况下,简单地在准备好的语句中将last_activation_attempt设置为NOW()而不是在date()值中绑定是不是更容易?
答案 1 :(得分:0)
我没有太多时间进行测试,但尝试在MySQL的时间戳格式中使用它。
$stmt->bind_param("ss", date("YmdHis"), $licence_id);
我不记得了,但我认为MySQL更喜欢这种方式,即使它以Y-m-d H:i:s
格式输出它。