0

現在、次のようなニュースレターを購読および購読解除できるフォームがあります。

ここに画像の説明を入力

下部 (サブスクリプション部分) のコードは次のとおりです。

 <?php 
$i = 0;  
while($objResult1 = mysql_fetch_array($objQuery1))  
 {  
$i++;  
?>  
<tr>  
   <td><div align="center"><?=$objResult1["ID"];?><input type="hidden" name="mailid" value="<?=$objResult1["ID"];?>"> </div></td>
   <td><div align="center"><?=$objResult1["Titel"];?> </div></td>  
   <td><div align="center"><input type="checkbox" name="sub" value="10"> </div></td>  
   <td><div align="center"><input type="checkbox" name="sub" value="90"> </div></td>
</tr>  
<?php  
 }  
?>  

データベースに値を挿入するコードは次のとおりです。

<?php
mysql_connect('localhost','root','root');
mysql_select_db('NAW') or die (mysql_error());

$Klant_ID = $_POST['klantid'];
$Mail_ID  = $_POST['mailid'];
$Status   = $_POST['sub'];
$Datum    = date("d-m-Y");


$sql = mysql_query(
    "INSERT INTO Subscriptions (
        Klant_ID,
        Mail_ID,
        Status,
        Datum
    ) VALUES (
        '".$Klant_ID."',
        '".$Mail_ID."',
        '".$Status."',
        '".$Datum."'
    )"
);

if ($sql === false) {
    die (mysql_error());
} else {
    echo 'Je gegevens zijn succesvol in de database geplaatst.<br><br>Om de gegevens uit de database te bekijken klik <A HREF="klanten.php">hier</A>. <br>Om meer gegevens in te voeren klik <A HREF="index.html">hier</A>.';
}
?>

データベースは次のとおりです。

ID   Klant_ID  Mail_ID  Status Datum 
1     6        1               test
2     6        1        test   test
3     10       10       10     19-03-13
16    6        4        90     20-03-2013
17    6        4        10     20-03-2013
18    7        4        90     20-03-2013

これで、チェックボックスをオンにしたデータベースに 1 行だけ追加されます。たとえば、データベースに3行を追加するように動作させたいと思います。たとえば、次のようにボックスを選択すると: ここに画像の説明を入力

これらの行をデータベースに追加したい:

ID  Klant_ID  Mail_ID  Status  Datum
20  6         1        10      20-03-2013
21  6         2        90      20-03-2013
22  6         4        10      20-03-2013

私の質問は、mysql_fetch_array で while ループを使用してこれが可能かどうかです。私はまだ学生であり、この問題を自分で解決することはできません。私の質問が十分に明確であることを願っていますが、質問がある場合はコメントで質問してください^^ 誰かがそれがどのように行われたかを示したり、正しい方向に私を押したりできれば、それは素晴らしいことです!

(もう mysql_* を使うべきではないことはわかっていますが、それはここでのポイントではありません^^)

4

2 に答える 2

2

$_POST['sub'] をループして、そのループで挿入を行うことができます。

まず、sub を配列にする必要があるため、次のように置き換えますname="sub"name="sub[]"

これで、チェックされた値を簡単にループできるようになりました。

foreach($_POST['sub'] as $subscription){
    mysql_query("INSERT INTO Subscriptions (Klant_ID, Mail_ID, Status, Datum) VALUES   ('".$Klant_ID."', '".$Mail_ID."', '".$subscription."', '".$Datum."')") or die (mysql_error());
}

mysql_ 関数は非推奨であるため、使用しないことをお勧めします。代わりに、MySQLi または PDO (私のお気に入り) を調べてください。:)

PDO を使用すると、ループの前にクエリを準備し、ループ内で実行できます。そうすれば、PHP はクエリを 1 回準備するだけで済みます。

$insert = $db->prepare("INSERT INTO Subscriptions (Klant_ID, Mail_ID, Status, Datum) VALUES   (?, ?, ?, ?)")
foreach($_POST['sub'] as $subscription){
    $db->execute(array($Klant_ID, $Mail_ID, $subscription, $Datum));
}

そうすれば、スクリプトもインジェクションに対して安全になります。現在のクエリでは、インジェクションに対して非常に脆弱です。

于 2013-03-20T08:44:50.740 に答える
2

変化する:

<input type="checkbox" name="sub" value="10">
<input type="hidden" name="mailid" value="<?=$objResult1["ID"];?>">

に:

<input type="checkbox" name="sub[]" value="10">
<input type="hidden" name="mailid[]" value="<?=$objResult1["ID"];?>">

そしてphpで行います:

$sql = mysql_query("INSERT INTO Subscriptions (Klant_ID, Mail_ID, Status, Datum) VALUES   ('".$Klant_ID."', '".$Mail_ID."', '".$Status."', '".$Datum."')") or die (mysql_error());

に:

foreach($_POST['sub'] as $i=>$s){
    $sql = mysql_query("INSERT INTO Subscriptions (Klant_ID, Mail_ID, Status, Datum) VALUES   ('".$Klant_ID."', '".$_POST['mailid'][$i]."', '".$s."', '".$Datum."')") or die(mysql_error());
}

:これは、インジェクションやその他のチェックなしのソリューションであり考える方向を示すためだけに作成されています。

于 2013-03-20T08:49:41.393 に答える