MySQL INSERT - 使用for()循环查询&默认情况下,非设置值是否插入为“”?

时间:2011-08-22 21:39:10

标签: php mysql arrays for-loop

我有两个数组,其中包含1到5个设置值。我想将这些值插入到包含两列的表中。

这是我当前的查询,在另一个SO问题中给我:

INSERT INTO table_name (country, redirect) 
VALUES ('$country[1]', '$redirect[1]'), 
       ('$country[2]', '$redirect[2]'), 
       ('$country[3]', '$redirect[3]'),
       ('$country[4]', '$redirect[4]'),
       ('$country[5]', '$redirect[5]')
ON DUPLICATE KEY UPDATE redirect=VALUES(redirect)

我有点担心如果没有设置其中一些数组值会发生什么,因为我相信上面假设有5组值(总共10个值),这肯定是不确定的。 如果值为null / 0会自动跳过它吗?

这样的事情会更好吗,会不会对资源造成太大的负担呢?

for($i = 0, $size = $sizeof($country); $i <= size; $i++) {
$query = "INSERT INTO table_name (country, redirect) VALUES ('$country[$i]', '$redirect[$i]) ON DUPLICATE KEY UPDATE redirect='$redirect[$i]'";
$result = mysql_query($query);
}

粗体;中突出显示的问题。任何答案都将非常感谢:) :) !!

2 个答案:

答案 0 :(得分:1)

做这样的事情:

$vals = array()
foreach($country as $key => $country_val) {
    if (empty($country_val) || empty($redirect[$key])) {
       continue;
    }
    $vals[] = "('" . mysql_real_escape_string($country_val) . "','" . mysql_real_escape_string($redirect[$key]) . "')";
}
$val_string = implode(',', $vals);

$sql = "INSERT INTO .... VALUES $val_string";

这将动态构建值部分,跳过任何未设置的部分。但请注意,mysql查询字符串有一个长度限制,由max_allowed_pa​​cket设置设置。如果您正在构建“巨大”查询,则必须将其拆分为多个较小的查询(如果超出此限制)。

答案 1 :(得分:0)

如果你问php是否会自动跳过将值插入查询中,如果它是null或0,答案是否定的。为什么不循环遍历各个国家/地区,如果它们具有匹配的重定向,则包含插入语句的那一部分......就像这样:(未经过测试,仅显示示例)。这是一个查询,所有值。如果它们不存在,您还可以将某些检查或默认值合并为空。

 $query = "INSERT INTO table_name (country, redirect) VALUES ";
 for($i = 0, $size = $sizeof($country); $i <= size; $i++) {
  if(array_key_exists($i, $country && array_key_exists($i, $redirect)
   if($i + 1 != $size){
     $query .= "('".$country[$i]."', '".$redirect[$i]).",";
   }  else $query .= "('".$country[$i]."', '".$redirect[$i].")";
  }
 }
 $query .= " ON DUPLICATE KEY UPDATE redirect=VALUES(redirect);"
 $result = mysql_query($query);