【问题标题】:Inserting multiple checkbox values to MySQL将多个复选框值插入 MySQL
【发布时间】:2012-08-20 18:30:03
【问题描述】:

我知道关于这个问题已经有多个关于 SO 的问题,我已经研究过它们,但没有得到令人满意的答案。所以这是我的问题,

我有一个由几个文本框和复选框组成的表单。看起来是这样的,

用户可以选择多个复选框。我正在尝试将这些复选框的 (不是显示的文本字符串)插入 MySQL 表中。它应该是这样的,

一个服务 ID(SID)可以有多个位置(Loc_Code)。这些位置代码(CO、GQ)是复选框的值。

到目前为止,我已经编写了以下代码。

<html>
<head>
</head>
<body>
<?php
require_once("db_handler.php");

$conn = iniCon();
$db = selectDB($conn);

/* Generating the new ServiceID */
$query = "SELECT SID FROM taxi_services ORDER BY SID DESC LIMIT 1";
$result = mysql_query($query, $conn);
$row = mysql_fetch_array($result);
$last_id = $row["SID"];

$id_letter = substr($last_id, 0, 1);
$id_num = substr($last_id, 1) + 1;
$id_num = str_pad($id_num, 3, "0", STR_PAD_LEFT);
$new_id = $id_letter . $id_num;

//Selecting locations
$query = "SELECT Loc_Code, Name FROM districts";
$result = mysql_query($query, $conn);

$count = mysql_num_rows($result);
?>

<?php
if(isset($_POST["savebtn"]))
{
    //inserting the new service information
    $id = $_POST["sid"];
    $name = $_POST["name"];
    $cost = $_POST["cost"];
    if($_POST["active"] == "on") $active = 1; else $active = 0;

    $query = "INSERT INTO taxi_services(SID, Name, Cost, Active) VALUES('$id', '$name', '$cost', '$active')";
    $result = mysql_query($query, $conn);

    //inserting the location details
    for($j = 0; $j < $count; $j++)
    {
        $loc_id = $_POST["checkbox2"][$j];
        $query = "INSERT INTO service_locations(SID, Loc_Code) VALUES('$id', '$loc_id')";
        $result5 = mysql_query($query, $conn);
    }

    if (!$result || !$result5)
    {
        die("Error " . mysql_error());
    }
    else
    {
?>
        <script type="text/javascript">
            alert("Record added successfully!");
        </script>
<?php
    }   
    mysql_close($conn); 
}
?>

<div id="serv">
<b>Enter a new taxi service</b>
<br/><br/>
    <form name="servForm" action="<?php $PHP_SELF; ?>" method="post" >
        <table width="300" border="0">
          <tr>
            <td>Service ID</td>
            <td><input type="text" name="sid" readonly="readonly" value="<?php echo $new_id; ?>" style="text-align:right" /></td>
          </tr>
          <tr>
            <td>Name</td>
            <td><input type="text" name="name" style="text-align:right" /></td>
          </tr>
          <tr>
            <td>Cost</td>
            <td><input type="text" name="cost" style="text-align:right" onkeypress="return isNumberKey(event)" /></td>
          </tr>
          <tr>
            <td>Active</td>
            <td><input type="checkbox" name="active" /></td>
          </tr>
        </table>
</div>

<div id="choseLoc">
Locations <br/><br/>
    <table border="0">
        <?php
        $a = 0;
        while($row = mysql_fetch_array($result))
            {
            if($a++ %5 == 0) echo "<tr>";
            ?>
            <td align="center"><input type="checkbox" name="checkbox2[]" value="<?php echo $row['Loc_Code']; ?>" /></td>
            <td style="text-align:left"><?php echo $row["Name"]; ?></td>
        <?php
        if($a %5 == 0) echo "</tr>";
            }
        ?>
    </table>
</div>
<br/>
<div id="buttons">
    <input type="reset" value="Clear" /> <input type="submit" value="Save" name="savebtn" />
    </form>
</div>

</body>
</html>

它会正确插入服务详细信息。但是当它插入位置数据的时候,就会出现这样的问题,

我选择了 4 个复选框并保存。 4 个位置代码与服务 ID 一起保存。但是从上面的截图可以看出,也插入了一堆空行。

我的问题是如何阻止这种情况发生?如何仅从我选择的复选框中插入数据?

谢谢。

【问题讨论】:

  • 您的代码容易受到 SQL 注入的攻击。您确实应该使用prepared statements,将变量作为参数传递给其中获得 SQL 评估。如果您不知道我在说什么或如何解决它,请阅读Bobby Tables 的故事。
  • 另外,如the introduction 中关于mysql_* 函数的PHP 手册章节所述:不建议使用此扩展来编写新代码。相反,应该使用mysqliPDO_MySQL 扩展名。在选择 MySQL API 时,另请参阅 MySQL API Overview 以获得更多帮助。
  • 您是否尝试过检查$_POST 变量来检查提交的内容?
  • @eggyal:是的,我知道 SQL 注入。但这只是数据库的一个小前端,唯一的用户就是我。它不在线。但是感谢您的提醒:)
  • @Truth:你是说这一行的$_POST$loc_id = $_POST["checkbox2"][$j];

标签: php mysql checkbox


【解决方案1】:

一种方法是只遍历提交的复选框:

//inserting the location details
foreach($_POST["checkbox2"] as $loc_id)
{
  $query = "INSERT INTO service_locations(SID, Loc_Code) VALUES('$id', '$loc_id')";
  $result5 = mysql_query($query, $conn);
}

我在此重申上面给出的 SQL 注入警告:您最好准备一个 INSERT 语句,然后使用参数执行它。使用 PDO,它看起来像:

//inserting the location details
$stmt = $dbh->prepare('
  INSERT INTO service_locations(SID, Loc_Code) VALUES(:id, :loc)
');
$stmt->bindValue(':id', $id);
$stmt->bindParam(':loc', $loc_id);
foreach($_POST["checkbox2"] as $loc_id) $stmt->execute();

【讨论】:

  • 效果很好。 :) 你能解释一下这一行吗? foreach($_POST["checkbox2"] as $loc_id)$loc_id如何获取复选框的值? |我目前正在学习 PDO :) 当我掌握了它的窍门时,我一定会在使用 PHP 和 MySQL 时使用它。谢谢。
  • @nK0de:了解foreach
【解决方案2】:

来自这句话:

for($j = 0; $j < $count; $j++)
    {
        $loc_id = $_POST["checkbox2"][$j];
        $query = "INSERT INTO service_locations(SID, Loc_Code) VALUES('$id', '$loc_id')";
        $result5 = mysql_query($query, $conn);
    }

我发现问题在于 loc_code 的值必须是您选择的最后一个位置。因为在这个循环中,loc_code 的值每次都会被替换。如果要插入所有位置,应该放在一句话上,如INSERT INTO service_locations(SID, Loc_Code) VALUES('$id', '$loc_id'),值$loc_id 应该是 CO,GQ,GL

【讨论】:

    【解决方案3】:

    发生这种情况是因为未勾选的复选框仍会被发布,它们只是具有空值。在您插入 service_locations 之前,只需检查 $loc_id 是否为空,如果不是,请仅插入。

    【讨论】:

    • 不正确。这是因为循环受到数据库中位置数量的限制。
    • 不,没有被勾选的复选框不会被浏览器提交。
    猜你喜欢
    • 1970-01-01
    • 2020-11-07
    • 2015-02-19
    • 2015-07-07
    • 1970-01-01
    • 1970-01-01
    • 2014-10-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多