Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/245.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在一个表中插入多行,如果它们不存在的话_Php_Mysql_Performance - Fatal编程技术网

Php MySQL在一个表中插入多行,如果它们不存在的话

Php MySQL在一个表中插入多行,如果它们不存在的话,php,mysql,performance,Php,Mysql,Performance,如果我有这样一张桌子: +-------------+-------------+ | Field | Type | +-------------+-------------+ | document | varchar(35) | | section | int(11) | | selection | int(11) | | status | varchar(35) | +-------------+-------------

如果我有这样一张桌子:

+-------------+-------------+
| Field       | Type        |
+-------------+-------------+
| document    | varchar(35) |
| section     | int(11)     |
| selection   | int(11)     |
| status      | varchar(35) |
+-------------+-------------+
我有一个PHP数组。我们称之为$choices[]。列选择与选项数组的数组索引共同响应。如果我向$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++;
          }
      }
   } 

如果所有的东西都要用新的更新,那么这可以很容易地实现

检查以下代码:

<?
$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语句中修改


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

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

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')

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

我仍在建模,但我会马上发布一些伪代码。文档、节、选择的任何组合都必须是唯一的,所以我将3列组合作为主键,所以也许我只是想到了自己的答案。我可以在mytable值“$document”、“$section”、“$counter”、“new”中插入IGNORE,这样就不需要第一次查询了。