【问题标题】:Foreach loop ONLY adds last value in array to table [duplicate]Foreach 循环仅将数组中的最后一个值添加到表中
【发布时间】:2020-05-28 15:35:29
【问题描述】:

请原谅我,因为我对 PHP 和 MYSQL 比较陌生,我相信这可能是一个容易回答的问题(或者可能不是,我不确定)。 这是我的 HTML 形式的复选框

<form method="post" action="process.php">
<input type="checkbox" name="athlete[]" value="1">athlete 1
<br>
<input type="checkbox" name="athlete[]" value="2">athlete 2
<br>
<input type="checkbox" name="athlete[]" value="3">athlete 3
<br><br>
<input type="submit" value="Submit">
</form>

相当简单。然后我在 process.php 中有这个 PHP:

$checkboxes = isset($_POST['athlete']) ? $_POST['athlete'] : array();
foreach($checkboxes as $value) {
    $sql = "INSERT INTO draftPick(user_id, athlete_id)VALUES('77', '$value' )";
}

if(mysqli_query($conn,$sql)) {

    echo 'Data added sucessfully';
}
else {
    echo "Error: " . $sql . "<br>" . mysqli_error($conn);
}

mysqli_close($conn);

我正在尝试使用我的复选框创建一个 foreach 循环,然后将每个复选框值插入到我的 MYSQL 表中的新行中。但是当我运行这个 PHP 时,它只有 strong> 将最后选中的复选框值插入到 MYSQLtable 中,而不是全部插入。我如何循环它,以便它将 all 检查值插入我的表中。感谢您的帮助!

【问题讨论】:

  • 您需要在循环内执行查询。
  • 警告:使用mysqli 时,您应该使用parameterized queriesbind_param 将任何数据添加到您的查询中。 请勿使用字符串插值或连接来完成此操作,因为您创建了严重的SQL injection bug切勿$_POST$_GET任何类型的数据直接放入查询中,如果有人试图利用您的错误,这可能会非常有害。
  • 注意:object-oriented interface to mysqli 明显不那么冗长,使代码更易于阅读和审核,并且不容易与过时的mysql_query 接口混淆,因为缺少单个i 会导致麻烦。示例:$db = new mysqli(…)$db-&gt;prepare("…") 程序接口是 PHP 4 时代的产物,不应在新代码中使用。

标签: php html mysql mysqli


【解决方案1】:

您所做的只是替换字符串$sql,但您实际插入数据库的执行是在循环之后编写的,这就是它只插入最后一个复选框的原因。

试试这个:

$checkboxes = isset($_POST['athlete']) ? $_POST['athlete'] : array();
foreach($checkboxes as $value) {
    $sql = "INSERT INTO draftPick(user_id, athlete_id)VALUES('77', '$value' )";

    if(mysqli_query($conn,$sql)) {
        echo 'Data added sucessfully';
    } else {
        echo "Error: " . $sql . "<br>" . mysqli_error($conn);
    }

}

mysqli_close($conn);

另外,请注意,您插入(循环)的方式非常慢,因为它执行了大量的查询。你应该改用batch insert

警告:正如 Darman 在评论中提到的那样

您对 SQL 注入非常开放,应该使用参数化 准备好的语句,而不是手动构建查询。他们 由 PDO 或 MySQLi 提供。永远不要相信任何形式的输入!甚至 当您的查询仅由受信任的用户执行时,您仍处于 损坏您的数据的风​​险。逃避是不够的!

【讨论】:

  • 我知道准备好的陈述很适合这个问题。但是这个问题本身并没有提到任何关于安全的事情,我正在回答他的问题,我的回答解决了他的问题。只是对那些投反对票的人说
  • 不使用准备好的语句是一个更大的问题。回答时,您需要解决所有问题,否则您的回答将因包含错误信息而被否决。
  • 您还应该展示如何启用 MySQLi 异常。总之,您的答案不是完整的答案!
【解决方案2】:

您也可以借此机会修正 SQL 注入漏洞。

$stmt = $conn->prepare('INSERT INTO draftPick (user_id, athlete_id) VALUES ('77', ? )');
$stmt->bind_param('i', $value);
foreach($checkboxes as $value) {
    $stmt->execute();
}

【讨论】:

    【解决方案3】:

    当你设置时:

     $sql = "INSERT INTO draftPick(user_id, athlete_id)VALUES('77', '$value' )";
    

    它只是一个字符串 bieng 设置为 $sql 变量 where

    mysqli_query($conn,$sql)
    

    是哪个执行SQL查询将数据插入到表中所以移动

    foreach($checkboxes as $value) {
      $sql = "INSERT INTO draftPick(user_id, athlete_id)VALUES('77', '$value' )";
      mysqli_query($conn,$sql);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-01
      • 1970-01-01
      • 2019-10-22
      • 2015-03-28
      • 1970-01-01
      • 2013-08-03
      相关资源
      最近更新 更多