2

我已经建立了一个数据库,这是其中一张表:

+-------------------------+------------+------+-----+---------------------+-------+
| 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 不会改变。我什至尝试对时间值进行硬编码(以“Ymd His”和时间戳格式),我尝试将数据类型更改为时间戳,但它仍然无效。当我在 mysql 控制台中输入相同的查询时,它工作正常,但 php 似乎无法处理它。在这种情况下我能做什么?

更新 最奇怪的事情是什么 - 这段代码被称为外部应用程序的类方法,当我从自定义 php 代码调用它(方法)时它工作正常(available_activations 和 last_activation_attempt 值都已更改),但是当我使用此应用程序仅更改 available_activation 值。它使用 $_POST 数据。

4

2 回答 2

0

就测试而言,我没有太多时间,但尝试以 MySQL 的时间戳格式使用它。

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

我不记得了,但我认为 MySQL 更喜欢这种方式,即使它以Y-m-d H:i:s格式输出。

于 2012-06-15T13:50:29.273 回答
0

当我尝试重新创建时,我可以让它工作。几个想法:检查 prepare、bind_param 和 execute 调用是否失败。

在这种情况下,在准备好的语句中简单地将 last_activation_attempt 设置为 NOW() 而不是在 date() 值中绑定不是更容易吗?

于 2012-06-15T13:44:22.503 回答