如何处理多个html插入


How to process multiple html inserts?

我试图以相同的形式创建多个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);

返回一个空白屏幕。我知道这是错的,但我不完全确定为什么。

您需要在循环中构建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对象被传递给函数),但我在这里没有做这个更改。
  • 我区分了$con(用于全局作用域)和$db(用于局部作用域)的使用,以便您不会混淆两者。以前,您的代码在函数作用域中引用$con而没有声明global,因此该变量甚至不可用。强烈建议使用这种依赖注入方法,而不是使用global
  • 我将DB连接错误检查移出函数
  • 我添加了字符串转义以减轻SQL注入。
  • 我将所有的全局脚本元素移动到一起,因为函数通常不应该像您所做的那样插入到过程代码的中间,因为这会使代码更难遵循。