将多个复选框值插入MySQL

时间:2012-08-25 12:56:50

标签: php mysql checkbox

我知道这里有关于同样问题的SO有多个问题,我已经调查过但是并没有得到令人满意的答案。所以这就是我的问题,

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

enter image description here

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

enter image description here

一个服务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>

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

enter image description here

我选择了4个复选框并保存。 4个位置代码与服务ID一起保存。但正如您从上面的屏幕截图中看到的那样,也插入了一堆空行。

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

谢谢。

3 个答案:

答案 0 :(得分:9)

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

//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();

答案 1 :(得分:1)

从这句话:

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

答案 2 :(得分:-4)

这种情况正在发生,因为未勾选的复选框仍会发布,它们只有空值。在插入service_locations之前,只需检查$loc_id是否为空,只有在插入时才进行插入。