【发布时间】:2014-12-29 21:42:05
【问题描述】:
我有这张表叫classes:
+------------+----------+------+-----+----------------+
| Field | Type | Null | Key | Extra |
+------------+----------+------+-----+----------------+
| class_id | int(3) | NO | PRI | auto_increment |
| class_level| int(1) | YES | | |
| class_name | char(1) | YES | | |
+------------+----------+------+-----+----------------+
里面的数据是这样的:
+----------+-------------+------------+
| class_id | class_level | class_name |
+----------+-------------+------------+
| 1 | 0 | N |
| 2 | 1 | A |
| 3 | 1 | B |
| 4 | 2 | C |
| 5 | 2 | D |
| 6 | 3 | E |
| 7 | 3 | F |
+----------+-------------+------------+
使用 PHP,我想增加 class_level 内的所有值,但 0 除外。
所以我做了这个 PHP/MySQL 函数:
mysql_query("UPDATE classes SET class_level = (class_level + 1) WHERE class_level != 0") or die(mysql_error());
这(奇怪的是)不会给每个class_level 加1,除了等于0 之外,而是加2 或3 或4!我还没有找到一个规则,这个脚本会添加 2 或 3 或 4。这是随机选择的。也没有输出错误。
它所做的一切都是随机添加 2 或 3 或 4 到每一行。
所以,为了调试它,我做了这个 PHP 代码来一一添加:
$query = mysql_query("SELECT * FROM `classes` WHERE `class_level` != 0");
while ($row = mysql_fetch_assoc($query)) {
$class_id = $row['class_id'];
$class_level = $row['class_level'];
$class_level = $class_level + 1;
var_dump($class_level);
mysql_query("UPDATE `classes` SET `class_level` = '$class_level' WHERE `class_id` = '$class_id'") or die(mysql_error());
}
var_dump 的输出是:
int(2) int(2) int(3) int(3) int(4) int(4)
但在表中的数据库中,我得到以下结果:
+----------+-------------+------------+
| class_id | class_level | class_name |
+----------+-------------+------------+
| 1 | 0 | N |
| 2 | 4 | A |
| 3 | 4 | B |
| 3 | 5 | C |
| 4 | 5 | D |
| 5 | 6 | E |
| 6 | 6 | F |
+----------+-------------+------------+
这是一个空文件,只有 MySQL 连接和上面的代码,所以上面没有循环。
这是我的版本信息:PHP 版本:5.2.12,MySQL Client API 版本 5.1.44。请注意,我无法安装 mysqli 或 PDO。
编辑:
在执行 MySQL 查询后,我从表中输出了数据,结果应该是这样。但是在表本身(或仅用于输出的代码刷新)中添加了 3 个,而不是 1 个!
编辑 2:
我尝试从命令行(又名用于 SQL 命令的 Webmin 工具)执行这个 MySQL 查询,结果应该是:添加了 1。
【问题讨论】:
-
请don't use
mysql_*functions 使用新代码。它们不再被维护并且是officially deprecated。改为了解prepared statements,并使用PDO 或MySQLi。 -
听起来你的脚本被执行了多次。你在使用url重写吗?也许像
favicon.ico这样的请求会被重写到您的脚本中。 -
看起来你的
UPDATE/loop 嵌套在一个外部循环中,所以它被运行了多次。 -
1.我既不能使用 mysqli 也不能使用 PDO,因为它不是我的服务器,我不能在上面安装任何东西。 2.它不在ANY循环中,因为它是一个空文件,只有这段代码和与mysql的连接
-
如果你有时间看看尝试使用redbeanphp.com。这很简单。你不应该考虑 pdo ,mysql ,mysqli 它会处理一切。
标签: php mysql sql-update add