如果我有这样的表:
+-------------+-------------+
| 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++;
}
}
}
如果所有内容都要用"new"更新,那么这可以很容易地实现。
检查以下代码:
<?
$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')
它是有效的。我不知道它是否是最好的,但至少我没有向DB发送数百个查询。