Php 关系MySql表UPDATE语句的基本规则:for vs while
我正在用mysql和php做我的第一步,所以我对正确的代码优化的基本规则有疑问 我的Php 关系MySql表UPDATE语句的基本规则:for vs while,php,mysql,Php,Mysql,我正在用mysql和php做我的第一步,所以我对正确的代码优化的基本规则有疑问 我的UPDATE语句需要在一定数量的行上执行,因为它应该在关系表上执行,所以for循环正确吗 <? // connection already created $data[] = array ("id" => 54, "enabled" => 1); $data[] = array ("id" => 33, "enabled" => 0); $data[] = array ("id" =
UPDATE
语句需要在一定数量的行上执行,因为它应该在关系表上执行,所以for循环正确吗
<?
// connection already created
$data[] = array ("id" => 54, "enabled" => 1);
$data[] = array ("id" => 33, "enabled" => 0);
$data[] = array ("id" => 12, "enabled" => 0);
$data[] = array ("id" => 58, "enabled" => 0);
$data[] = array ("id" => 21, "enabled" => 1);
$data[] = array ("id" => 10, "enabled" => 1);
$data[] = array ("id" => 18, "enabled" => 0);
$data[] = array ("id" => 32, "enabled" => 1);
$data[] = array ("id" => 84, "enabled" => 0);
$data[] = array ("id" => 80, "enabled" => 1);
for (var $i = 0; $i < count ($data); $i ++) {
$id = $data[$i]["id"];
$enabled = $data[$i]["enabled"];
$sql = "UPDATE users SET user_enabled = '$enabled' WHERE user_id = '$id' LIMIT 1;";
$res = mysql_query ($sql);
$num = mysql_num_rows ($res);
}
?>
对于有限长度的序列,您应该使用循环。您可以使用循环
几点评论:
- 在循环的每次迭代中计算
计数($data)
是一项不必要的成本。要么在count($data)
开始循环并倒计时,要么按照@Ignacio的建议,使用foreach
- 这是一个很好的例子,在这个例子中,使用带参数的准备好的查询将是一个好处。但是PHP的普通mysql扩展不支持此功能。您必须使用mysqli,或者更好
- 在SQL表达式中,不必在整数值周围加引号
mysql\u num\u rows()
对于UPDATE
查询来说毫无意义。您可能打算使用mysql\u受影响的行()
- 我不知道您为什么在这个查询中使用
LIMIT
,因为我猜user\u id
是users
表的主键,因此您永远不会更新多行
下面是我将如何编写代码:
<?php
// PDO connection already created
$data[] = array ("id" => 54, "enabled" => 1);
...etc...
$sql = "UPDATE users SET user_enabled = :enabled WHERE user_id = :id";
$stmt = $pdo->prepare($sql);
foreach ($data as $parameters) {
$success = $stmt->execute($parameters);
$num = $stmt->rowCount();
}
?>
如果需要更新的记录数量足够大,有时最好将单个大容量插入到临时表中,然后通过与临时表的联接更新目标表。
<?php
// PDO connection already created
$data[] = array ("id" => 54, "enabled" => 1);
...etc...
$sql = "UPDATE users SET user_enabled = :enabled WHERE user_id = :id";
$stmt = $pdo->prepare($sql);
foreach ($data as $parameters) {
$success = $stmt->execute($parameters);
$num = $stmt->rowCount();
}
?>