【问题标题】:While loop to insert values into database? [closed]While循环将值插入数据库? [关闭]
【发布时间】:2013-03-09 06:19:16
【问题描述】:

我目前有一个表单,我可以在其中订阅和取消订阅时事通讯的用户,如下所示:

底部(订阅部分)的代码是这样的:

 <?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 循环?我不是 php 专业人士,因为我仍然是学生,我无法自己解决这个问题。我希望我的问题足够清楚,但是如果您有任何问题,请在 cmets 中提问^^ 如果有人可以告诉我它是如何完成的或将我推向正确的方向,那就太好了!

(我知道我不应该再使用 mysql_* 但这不是重点^^)

【问题讨论】:

  • 只需做一会儿($row=mysql_fetch_array($result)){ mysql_query("insert query".$row["values"].")") }
  • 顺便说一句,您是否考虑过使用单选按钮而不是复选框?一个用户不能同时订阅和取消订阅,对吧?
  • 这里没有什么可以获取的,因为你只是在向数据库中添加数据。
  • 您的代码容易受到 SQL 注入的攻击。阅读How to prevent SQL injection in PHP? 了解如何防止这种情况发生。
  • 关于如何在 mysql 数据库中插入数据有很多问题。其中之一是:insert a php array into mysql

标签: php mysql database while-loop


【解决方案1】:

变化:

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

注意: 这是WITHOUT注入和其他检查的解决方案,只是为了向您展示思考的方向。

【讨论】:

  • 当其中一个用户既没有订阅也没有取消订阅时,此解决方案可能会导致问题。邮件 id 将移动并为错误的邮件 ID 插入错误的值。
  • 你刚刚解决了我的问题,thnx!^^
  • @SavasVedova 你说得对,这是一个非常糟糕的解决方案,但这只是在输入中考虑数组的方向。
【解决方案2】:

您可以循环遍历 $_POST['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 只需准备一次查询。

$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));
}

这样,您的脚本也将是注入安全的,就像您当前的查询一样,它很容易被注入。

【讨论】:

    猜你喜欢
    • 2020-05-13
    • 2015-12-22
    • 2017-02-15
    • 2012-04-23
    • 2019-01-21
    • 2019-04-30
    • 2012-08-21
    • 2013-09-14
    • 1970-01-01
    相关资源
    最近更新 更多