【问题标题】:PHP SQL Update arrayPHP SQL 更新数组
【发布时间】:2014-05-30 01:04:18
【问题描述】:

我最初对以下内容感到满意,以便将第 1 行和第 2 行更新为相同的值 (status=1)

if ($_POST){
    $sql ="UPDATE table SET  status = 1,
            WHERE id IN (1,2 );";
    db()->query($sql);

    if(db()->query($sql)){
        echo "<b>Good</b>";
    } 
    else{
        echo "<b>No Good</b>";
    }
}

但现在我想用不同的值更新,即第 1 行到状态 1,第 2 行到状态 2,第 3 行到状态 3。

马上,我知道我需要 1. 使用一个数组并循环遍历它 3 次。 2.将数组值传入$sql

我认为它会是这样的,但我仍在学习 PHP..

$array_id = array(1, 2, 3);
$array_status = array(1, 2, 3);

if ($_POST){
    $sql ="UPDATE table SET  status = $array_status
            WHERE id = $array_id;";
    db()->query($sql);

    if(db()->query($sql)){
        echo "<b>Update Successful</b>";
    } 
    else{
        echo "<b>Update Unsuccessful</b>";
    }
}

我将如何实现这一目标?

【问题讨论】:

    标签: php html mysql


    【解决方案1】:

    您可以使用 for loop 遍历数组并为每个数组执行一个查询(Radu Vlad 答案),或者您可以构建一个长查询并执行一次,如下所示:

    if ($_POST){
        $sql = ""; // Blank string
        $len = count($array_id); // Number of iterations
        for ($i = 0; $i < $l; $i++) { // Enter the loop
            $sql .= "UPDATE 
                      table
                    SET
                      status = {$array_status[$i]}
                    WHERE id = {$array_id[$i]};"; // Append the query
        }
        db()->query($sql);
    
        if(db()->query($sql)){
            echo "<b>Update Successful</b>";
        } 
        else{
            echo "<b>Update Unsuccessful</b>";
        }
    }
    

    $i 的 val 为 0 时,$array_id[$i] 将打印第一个元素,$i 为 1 时,$array_id[$i] 将打印第二个元素,以此类推。

    使用.= 可以将文本附加到字符串。在循环结束时,$sql 将是一个包含 3 个查询的字符串('UPDATE ... SET ...; UPDATE ... SET ...; UPDATE ... SET ...;')。

    但不确定这是否是最好的方法。但你明白了。

    【讨论】:

      【解决方案2】:

      如果您希望 status 等于 id,请执行以下操作(单个查询):

      UPDATE table SET status=id WHERE id IN (1,2,3);
      

      当然你可以使用一些数学,比如:

      UPDATE table SET status=(id+1)*2 WHERE id IN (1,2,3);
      

      【讨论】:

        【解决方案3】:

        你没有真正解释你为什么需要它,所以

        try1(幼稚):设置状态 = id

        "UPDATE table SET status = id"
        

        这是一种不好的做法,只有您才能理解这些数字是什么。另外,如果 id 是自动递增的,则状态也将是自动递增的,您将有一个重复的列。如果状态只有 3 个可能的值,则不应这样做。

        try2(basic):做 3 次更新,或者实际上,用 for 做尽可能多的更新

        if ($_POST){
        
        $status = 1;
        
        for ($i = 1; $i <= 3; $i++){
        $sql ="UPDATE table
               SET status = $status
               WHERE id = $i;";
        db()->query($sql);
        
        $status++;
        }
        

        更好的方法是因为您可以更好地控制状态。当然,如果您只有这 3 个值,则第二次尝试是无关紧要的。这个假设您将在 for 循环中更改 $status 变量,与 $i (id) 一致

        try3(mature): 设置 id 和 status 一致的 1 个或 2 个数组,这样 $arr[$id] 将有 status 的值,key 是 id,或者 $arr1[$i ] 的值为 id,$arr2[$i] 的值为 status

        该示例将只有一个数组(也称为映射,因为您根据另一个值映射一个值)

        if ($_POST){
        
        $status_array = array(1 => 1,2 => 2,3 => 3);
        
        
        for ($i = 1; $i <= 3; $i++){
        $sql ="UPDATE table
               SET status = $status_array[$i]
               WHERE id = $i;";
        db()->query($sql);
        }
        

        另外,这行得通,因为数组是一致的。如果您没有一致的数组,您应该使用 2 个数组,或者尝试使用 key->value 而不是 for

        的 foreach

        【讨论】:

        • 我认为作者无意通过++ 更改每个id 的状态。他说这将是一个例子。实际上,我认为他正在寻找一种方法来独立将每个 ID 的状态更改为另一个 IDs 及其状态。
        • 正在编辑帖子。他并没有真正解释他需要什么,我为他提供了 3 种解决方案,从最简单的解决方案到体面的解决方案。
        • 另外,我解释了我的示例是针对这种情况的,您可以根据需要将 $status 更改为 $i 的函数。
        • 对不起,伙计们,我应该更清楚。它没有增加,它只是碰巧以这种方式工作。可能是,id 1 到状态 3,id 45 到状态 50,第 39 行到状态 74。
        【解决方案4】:

        我建议您使用以下代码:

        $theArray = array("1" => "1","2" => "2","3" => "3"); // The scheme is ID => Status
        
        $errorMsg = false; // Our default assumption is that no error occured
        
        foreach($theArray as $key => $value) {
            $sql = "UPDATE table SET status =".$value." WHERE id = ".$key;
        
            if(!db() -> query($sql)) { // Execute the query and check whether it failed
                $errorMsg = "Query for ID ".$key." failed.";
                break; // When the query failed we exit the loop and echo the error message
            }
        }
        
        if($errorMsg) { // If an error occured (errorMsg is no longer false) we echo it here
            echo $errorMsg;
        }
        

        基本上,您只需创建一个数组$theArray,其中包含key =&gt; valueIDs 和您想要给它们的statuses。之后,循环遍历这个数组,为每个 key =&gt; value 对执行 db() -&gt; query() 并检查它是否失败。如果 query 失败,你 break 循环并输出错误信息。


        优点:

        • 我没有使用两个数组($array_id$array_status),而是只使用一个associative array$theArray。这里的优点是您只有 一个 而不是两个数组,并且您可以在不更改代码的情况下扩展您想要更改的行数。只需扩展数组即可。
        • 数组$theArray不需要需要按时间顺序排列,您可以独立于其他IDs 为每个ID 分配status
        • 您在代码中执行了两次db() -&gt; query($sql)。这不是非常有效和多余的。相反,您可以只执行一次命令,然后根据 if() 中的 return value 立即检查它是否失败。
        • 我在代码中创建的errorMsg 让您知道哪个query 失败,以便为您提供更详细的调试信息。

        【讨论】:

          【解决方案5】:

          如果您想使用 INSERT 语法更新多行(在单个查询中),您可以这样做:

          REPLACE table(id,status) VALUES(1,1),(2,2),(3,3)
          

          注意id必须是Primary Key或Unique,否则REPLACE会插入一个新行。 另请注意,REPLACE 不是 SQL 标准,仅适用于 MySQL。

          【讨论】:

            猜你喜欢
            • 2012-09-07
            • 1970-01-01
            • 1970-01-01
            • 2012-05-20
            • 2016-12-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多