1

PHPとHTMLを使用してMySQLDBに複数の行を挿入しようとしています。私は基本的なPHPを知っており、さまざまなフォーラムで多くの例を検索し、1つのスクリプトを作成しましたが、機能していないようです。誰かがこれを手伝ってくれる?これが私のスクリプトです:

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";
}
4

3 に答える 3

3

MySQLは、1つのクエリに複数の行を挿入できます。私はあなたのコードを可能な限りオリジナルに近づけました。大量のデータがある場合、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);
于 2011-12-29T13:34:44.627 に答える
0

このコードを試してください。Mysqlクエリは、phpを使用した複数の挿入を受け入れません。これはforループであり、値は動的に変化するため、foreachループ内にsql挿入クエリを含めることができます。動的な値で各行を挿入します。以下のコードを確認し、懸念がある場合はお知らせください

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";
 }
}
于 2011-12-29T11:56:40.940 に答える
0

プリペアドステートメントを1つ作成し、パラメーターをバインドしてから、ループ内で実行する、より最新のアプローチをお勧めします。これにより、安定した/安全な挿入クエリが提供され、多くのエスケープ呼び出しが行われるのを回避できます。

コード:

// 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どこに記述しますか(ループ内のexecute呼び出しが機能する前の任意の場所)。

送信された値を調整するには、execute呼び出しの前に、繰り返される変数(たとえば$vsr、など)を上書きします。$ofice

データ型の特異性を高めたい場合は、必要に応じsて(string)をi(integer)またはd(double / float)に置き換えることができます。

于 2020-01-24T06:39:48.083 に答える