如何将多个选择复选框添加到 mysql 数据库


How to add multiple selection checkboxes to mysql db?

我希望用户能够选中多个复选框,然后将他/她的选择打印在html页面上,并将每个选择添加到我的Mysql db中。不幸的是,我只看到文字字符串"数组"被添加到我的数据库中,而不是所选名称。

我的脚本如下所示:

    <html>
<head>
<title>checkbox help</title>
</head>
<?php
if (isset($_POST['submit'])) {
    $bewoner_naam = $_POST["bewoner_naam"];
    $how_many = count($bewoner_naam);
    echo 'Names chosen: '.$how_many.'<br><br>';
    if ($how_many>0) {
        echo 'You chose the following names:<br>';
    }
    for ($i=0; $i<$how_many; $i++) {
        echo ($i+1) . '- ' . $bewoner_naam[$i] . '<br>';
    }
        echo "<br><br>";
}

$bewoner_naam = $_POST['bewoner_naam'];回声$bewoner_NAAM[0];输出将是第一个选定复选框的值回声$bewoner_NAAM[1];输出将是第二个选定复选框的值print_r($bewoner_naam);输出将是所选复选框的值数组

$con = mysql_connect("localhost","usr","root");
mysql_select_db("db", $con);
$sql="INSERT INTO bewoner_contactgegevens (bewoner_naam) VALUES ('$_POST[bewoner_naam]')";
if (!mysql_query($sql,$con))
  {
  die('Error: ' . mysql_error());
  }
echo "1 record added";

mysql_close($con)
?>

<body bgcolor="#ffffff">
<form method="post">
Choose a name:<br><br>
<input type="checkbox" name="bewoner_naam[]" value="kurt">kurt <br>
<input type="checkbox" name="bewoner_naam[]" value="ian">ian <br>
<input type="checkbox" name="bewoner_naam[]" value="robert">robert <br>
<input type="checkbox" name="bewoner_naam[]" value="bruce">bruce<br>
<input type="submit" name = "submit">
</form>
</body>
<html>

非常感谢你帮助我!!

最亲切的问候,

马丁

您不能将数组插入到单个列中,它会在您观察到时显示为"数组",因此您有两种选择:

  • 通过循环遍历该数组,插入多行,每行对应一项。
  • 使用implode将它们组合在一起,形成一个奇异值。

在您的示例中,数据库的结构方式尚不清楚这两者中哪一个是最好的。

由于$_POST['bewoner_naam']是一个数组,因此您必须将该数组中的每个项目添加到数据库中。例如,您可以为此使用 for 循环:

$con = mysql_connect("localhost","usr","root");
mysql_select_db("db", $con);
foreach($_POST['bewoner_naam'] as $naam) {
    $sql="INSERT INTO bewoner_contactgegevens (bewoner_naam) VALUES ('". mysql_real_escape_string($naam) ."')";
}

请注意,我使用了mysql_real_escape_string函数。您将始终希望包含此内容。有关原因和方法,请参阅:清理 PHP/SQL $_POST、$_GET 等...?

第一件事是避免 PHP 中的所有mysql_*函数。它们已被弃用,并在较新版本中删除,最重要的是,不安全。我建议您切换到PDO并使用准备好的语句。

但是,这不会解决您的问题。您遇到的问题是,在组合SQL的代码中,您将数组与字符串连接起来,这就是为什么您只插入"Array"的原因。如果您希望将所有数组项作为字符串插入,则需要implode数组:

$sql = "INSERT INTO bewoner_contactgegevens (bewoner_naam) VALUES (:checkboxes)";
$statement = $pdo->prepare($sql);
$statement->bindValue(":checkboxes", implode(",", $_POST["bewoner_naam"]);
$statement->execute();
虽然,在

数据库中将多个值存储为逗号分隔的列表并不是一个好主意,因为它会随着时间的推移变得太不可维护,并且在获取此类数据时会产生更多困难,因为您需要在从数据中检索它后"重新解析"它。

正如@Rodin建议的那样,您可能希望将每个数组项作为单独的行插入,因此我提出以下建议:

$sql = "INSERT INTO bewoner_contactgegevens (bewoner_naam) VALUES "
    . rtrim(str_repeat('(?),', count($_POST["bewoner_naam"])), ',');
$statement = $pdo->prepare($sql);
$count = 1;
foreach ($_POST["bewoner_naam"] as $bewoner_naam) {
    $statement->bindValue($count++, $bewoner_naam);
}
$statement->execute();

这样,您将创建一个批量插入语句,其中包含与选中复选框一样多的占位符,并将其每个值放在数据库中的单独行上。

有关 PDO 和参数绑定的更多信息,请参阅 http://www.php.net/pdo