0

如果我有这样的表:

+-------------+-------------+
| Field       | Type        |
+-------------+-------------+
| document    | varchar(35) |
| section     | int(11)     |
| selection   | int(11)     |
| status      | varchar(35) |
+-------------+-------------+

我在 PHP 中有一个数组。让我们称之为$choices[]。该列selection对应于选择数组的数组索引。如果我向数组中添加一个或多个元素,$choices那么我需要更新数据库。我将在一个循环中运行,$document并且$section也设置了。我不想假设我的编号中间没有丢失的行。$choices检查 中每个元素的(文档、部分、选择) 、创建任何不存在的元素并将其状态设置为“新”的最有效方法是什么?我是否必须将其作为一个循环执行,还是有办法在一个查询中执行此操作?

这是完全未经测试的,但如果我不寻求帮助,这基本上就是我的做法。我猜想有人可能有比我更好的解决方案。

foreach($documents as $document)
  {
    foreach($sections as $section)
      {
        $choices=$master_array[$document][$section];
        $ch_count=count($choices);
        $counter=0;
        while($counter < $ch_count-1)
          {
            $query="SELECT status FROM mytable WHERE document='$document' AND section='$section' AND selection='$counter'";
            $result = mysql_query($query);
            if(mysql_num_rows($result)==0)
              {
                $query="INSERT INTO mytable VALUES('$document','$section','$counter','new')";
                $result = mysql_query($query);
              }
            $counter++;
          }
      }
   } 
4

2 回答 2

0

如果一切都将使用“新”进行更新,那么这可以很容易地实现。

检查以下代码:

<?
$setStr = "";
foreach($choices as $column)
{
    $setStr .= $column . "=" . "'new', ";
}

$sqlCommand = "UPDATE table SET ".substr($setStr,'',-2)." WHERE pick_a_row_here;";
echo $sqlCommand;
?>

对于那些不存在的,尝试配置它,以便在未指定时它们的值默认为 false。当然,INSERT 语句可以很容易地改编自我上面的 UPDATE 语句。

让我知道你的想法。如果您有任何问题或意见,我会尽力回答。

于 2012-08-02T14:14:33.563 回答
0

我最终使用一个循环将一个看起来像这样的大查询字符串连接在一起,除了更大:

INSERT IGNORE INTO mytable VALUES 
('doc1','1','0','New'),
('doc1','1','1','New'),
('doc1','1','2','New'),
('doc1','1','3','New'),
('doc1','2','0','New'),
('doc1','2','1','New'),
('doc1','2','2','New'),
('doc1','2','3','New'),
('doc1','3','0','New'),
('doc1','3','1','New'),
('doc1','3','2','New')

它有效。我不知道它是否最好,但至少我不会向数据库发送数百个查询。

于 2012-08-02T20:44:45.193 回答