使用PHP在表中插入多行

时间:2011-12-29 11:38:12

标签: php mysql multiple-records

我正在尝试使用PHP和HTML将多行插入MySQL数据库。我知道基本的PHP,并在不同的论坛上搜索了很多例子并创建了一个脚本,但它似乎不起作用。任何人都可以帮忙解决这个问题这是我的剧本:

include_once 'include.php';

foreach($_POST['vsr'] as $row=>$vsr) {
   $vsr=mysql_real_escape_string($vsr);
   $ofice=mysql_real_escape_string($_POST['ofice'][$row]);
   $date=mysql_real_escape_string($_POST['date'][$row]);
   $type=mysql_real_escape_string($_POST['type'][$row]);
   $qty=mysql_real_escape_string($_POST['qty'][$row]);
   $uprice=mysql_real_escape_string($_POST['uprice'][$row]);
   $tprice=mysql_real_escape_string($_POST['tprice'][$row]);
}

$sql .= "INSERT INTO maint_track (`vsr`, `ofice`, `date`, `type`, `qty`, `uprice`,
`tprice`) VALUES ('$vsr','$ofice','$date','$type','$qty','$uprice','$tprice')";

$result = mysql_query($sql, $con);

if (!$result) {
   die('Error: ' . mysql_error());
} else {
   echo "$row record added";
}

3 个答案:

答案 0 :(得分:3)

MySQL可以在单个查询中插入多行。我将代码尽可能地保留在原始代码中。请记住,如果您有大量数据,这可能会创建一个大于MySQL将接受的大查询。

include_once 'include.php';

$parts = array();    
foreach($_POST['vsr'] as $row=>$vsr) {
   $vsr=mysql_real_escape_string($vsr);
   $ofice=mysql_real_escape_string($_POST['ofice'][$row]);
   $date=mysql_real_escape_string($_POST['date'][$row]);
   $type=mysql_real_escape_string($_POST['type'][$row]);
   $qty=mysql_real_escape_string($_POST['qty'][$row]);
   $uprice=mysql_real_escape_string($_POST['uprice'][$row]);
   $tprice=mysql_real_escape_string($_POST['tprice'][$row]);

   $parts[] = "('$vsr','$ofice','$date','$type','$qty','$uprice','$tprice')";
}

$sql = "INSERT INTO maint_track (`vsr`, `ofice`, `date`, `type`, `qty`, `uprice`,
`tprice`) VALUES " . implode(', ', $parts);

$result = mysql_query($sql, $con);

答案 1 :(得分:0)

请尝试此代码。 Mysql查询不会接受使用php的多个插入。由于它是for循环并且值是动态更改的,因此可以在for循环中包含sql insert查询。它将使用动态值插入每一行。如果您有任何疑虑,请查看以下代码并告知我们

include_once 'include.php';

foreach($_POST['vsr'] as $row=>$vsr) {
   $vsr=mysql_real_escape_string($vsr);
   $ofice=mysql_real_escape_string($_POST['ofice'][$row]);
   $date=mysql_real_escape_string($_POST['date'][$row]);
   $type=mysql_real_escape_string($_POST['type'][$row]);
   $qty=mysql_real_escape_string($_POST['qty'][$row]);
   $uprice=mysql_real_escape_string($_POST['uprice'][$row]);
   $tprice=mysql_real_escape_string($_POST['tprice'][$row]);

   $sql = "INSERT INTO maint_track (`vsr`, `ofice`, `date`, `type`, `qty`, `uprice`,
`tprice`) VALUES ('$vsr','$ofice','$date','$type','$qty','$uprice','$tprice')";

 $result = mysql_query($sql, $con);

 if (!$result)
 {
    die('Error: ' . mysql_error());
 } 
 else 
 {
    echo "$row record added";
 }
}

答案 2 :(得分:0)

我更喜欢一种更现代的方法,该方法创建一个准备好的语句并绑定参数,然后在循环中执行。这样可以提供稳定/安全的插入查询,并避免进行太多的转义调用。

代码:

// switch procedural connection to object-oriented syntax
$stmt = $con->prepare('INSERT INTO maint_track (`vsr`,`ofice`,`date`,`type`,`qty`,`uprice`,`tprice`)
                       VALUES (?,?,?,?,?,?,?)');  // use ?s as placeholders to declare where the values will be inserted into the query
$stmt->bind_param("sssssss", $vsr, $ofice, $date, $type, $qty, $uprice, $tprice);  // assign the value types and variable names to be used when looping

foreach ($_POST['vsr'] as $rowIndex => $vsr) {
    /*
      If you want to conditionally abort/disqualify a row...
      if (true) {
          continue;
      }
    */
    $ofice  = $_POST['ofice'][$rowIndex];
    $date   = $_POST['date'][$rowIndex];
    $type   = $_POST['type'][$rowIndex];
    $qty    = $_POST['qty'][$rowIndex];
    $uprice = $_POST['uprice'][$rowIndex];
    $tprice = $_POST['tprice'][$rowIndex];
    echo "<div>Row# {$rowIndex} " . ($stmt->execute() ? 'added' : 'failed') . "</div>";
}

要拒绝插入行,请使用在我的代码段中注释的条件continue-当然,请写出true所在的逻辑(循环内执行调用之前的任何位置)工作)。

要调整提交的值,请在执行调用之前覆盖迭代变量(例如$vsr$ofice等)。

如果您想享受更大的数据类型特异性,可以根据需要用s(整数)或i(双精度/浮点数)替换d(字符串)。 / p>