4

SO には、この同じ問題に関してすでに複数の質問があることを知っており、それらを調査しましたが、満足のいく答えが得られませんでした。では、私の質問は次のとおりです。

いくつかのテキストボックスとチェックボックスで構成されるフォームがあります。このように見えます。

ここに画像の説明を入力

ユーザーは複数のチェックボックスを選択できます。これらのチェックボックスの値(表示されているテキスト文字列ではない) を MySQL テーブルに挿入しようとしています。このように見えるはずです。

ここに画像の説明を入力

1 つのサービス 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 とともに保存されます。しかし、上のスクリーンショットからわかるように、多数の空の行も挿入されます。

私の質問は、これが起こらないようにするにはどうすればよいですか? 選択したチェックボックスのみからデータを挿入するにはどうすればよいですか?

ありがとうございました。

4

3 に答える 3

10

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インジェクションの警告です。ステートメントを準備してから、パラメーターを使用して実行する方がはるかに良いでしょう。INSERTPDOを使用すると、次のようになります。

//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();
于 2012-08-25T13:03:56.633 に答える
0

これらの文から:

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') のように 1 つの文に配置する必要があります。$loc_id の値はCO,GQ にする必要があります。 、GL

于 2012-08-25T13:14:48.087 に答える
-5

これは、チェックされていないチェックボックスがまだ投稿されており、値が空であるために発生しています。service_locations空であるかどうかを確認するために挿入を行う前に$loc_id、空でない場合にのみ挿入を行ってください。

于 2012-08-25T13:04:17.940 に答える