0

同じフォームに複数の HTML 挿入を作成しようとしているので、データベースに複数の行をすばやく挿入して時間を節約できます。ただし、これを処理する方法がよくわかりません。

<form action="admin1.php" method="post">
<?php
 function multiform($x){
    for ($x = 0; $x < 3; $x++){
        echo 'Episode: <input type="number" name="Episode[]">
        Date: <input type="date" name="Date[]">
        Guest: <input type="text" name="Guest[]">
        Type: <input type="text" name="Type[]">
        Youtube:<input type="text" name="Youtube[]"> MP3: <input type="text" name="MP3[]"> iTunes:<input type="text" name="Itunes[]"><br/><br/>';
    }
}

multiform(0);

?>
<input type="submit" value="Submit Form" name="submitForm">
</form>

これは私が使用しようとしたものです:

$con = mysqli_connect("server","root","","database");

function multiformpost($x) {    
    for ($x = 0; $x < 3; $x++)  {

        $Episode = $_POST['Episode'][$x];
        $Date = $_POST['Date'][$x]; 
        $Guest = $_POST['Guest'][$x];
        $Type = $_POST['Type'][$x]; 
        $Youtube = $_POST['Youtube'][$x];
        $MP3 = $_POST['MP3'][$x];
        $Itunes = $_POST['Itunes'][$x];  

        $sql = "INSERT INTO podcasts(Episode, Date, Guest, Type, Youtube, MP3, Itunes) VALUES ('{$Episode}', '{$Date}', '{$Guest}', '{$Type}', '{$Youtube}', '{$MP3}', '{$Itunes}')";
    }
    if (mysqli_connect_errno()) {
    echo "Failed to connect to MySQL: " . mysqli_connect_error();

    if (!mysqli_query($con, $sql)) {
    die ('Error: ' . mysqli_error($con));
    }
    echo "Added to database";
    }
}

multiformpost(0);

mysqli_close($con);

これは単に空白の画面を返します..間違っていることは知っていますが、その理由は完全にはわかりません。

4

1 に答える 1

1

ループ内で SQLのセクションを構築してからVALUES、単一のクエリを実行する必要があります。だから、このようなもの:

$con = mysqli_connect("","","","");
if (mysqli_connect_errno()) {
    echo "Failed to connect to MySQL: " . mysqli_connect_error();
}
multiformpost($con);
mysqli_close($con);

function multiformpost($db) {
    if(empty($db) {
        throw new Exception('You need to pass a valid mysqli connection to this method');
    }

    $sql = "INSERT INTO podcasts(Episode, Date, Guest, Type, Youtube, MP3, Itunes) VALUES ";
    $size = count($_POST['Episode']);
    for ($x = 0; $x < $size; $x++)  {

        $Episode = mysqli_real_escape_string($db,$_POST['Episode'][$x]);
        $Date = mysqli_real_escape_string($db,$_POST['Date'][$x]); 
        $Guest = mysqli_real_escape_string($db,$_POST['Guest'][$x]);
        $Type = mysqli_real_escape_string($db,$_POST['Type'][$x]); 
        $Youtube = mysqli_real_escape_string($db,$_POST['Youtube'][$x]);
        $MP3 = mysqli_real_escape_string($db,$_POST['MP3'][$x]);
        $Itunes = mysqli_real_escape_string($db,$_POST['Itunes'][$x]);  

        $sql .= "('{$Episode}', '{$Date}', '{$Guest}', '{$Type}', '{$Youtube}', '{$MP3}', '{$Itunes}'),";
    }
    $sql = rtrim($sql,',');

    if (!mysqli_query($db, $sql)) {
        die ('Error: ' . mysqli_error($db));
    } 
    echo "Added to database";
}

また、私が提案する次の変更も行ったことに注意してください。

  • 関数に DB 接続を渡します。関数内で POST 配列の配列サイズを直接検出できるため、元のパラメーターが何に使用されていたのかわかりません。オブジェクト指向の mysqli の使用法に移行したほうがよいでしょう (インスタンス化された mysqli オブジェクトが関数に渡されたことを確認できるため) が、ここではその変更を行いませんでした。
  • 2 つを混同しないように、($conグローバル スコープの場合) と(関数内のローカル スコープの場合)の使用を区別しました。以前は、変数を宣言せずに関数スコープ内$dbでコードを参照していたため、変数を使用することさえできませんでした。を使用するのではなく、この依存性注入アプローチを強くお勧めします。$conglobalglobal
  • DB接続エラーチェックを関数の外に移動しました
  • SQL インジェクションを緩和するために、文字列エスケープを追加しました。
  • 私はあなたのすべてのグローバルスクリプト要素を一緒に移動しました.関数は通常、あなたが行ったように手続き型コードの途中に挿入されるべきではありません.コードをたどるのが難しくなります.
于 2014-03-10T17:17:13.883 に答える