Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 关系MySql表UPDATE语句的基本规则:for vs while_Php_Mysql - Fatal编程技术网

Php 关系MySql表UPDATE语句的基本规则:for vs while

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" =

我正在用mysql和php做我的第一步,所以我对正确的代码优化的基本规则有疑问

我的
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();

}


?>