【问题标题】:For loop fetch array in phpphp中的for循环获取数组
【发布时间】:2015-08-23 19:46:49
【问题描述】:

我想删除带有复选框的 mySQL 行。这是一个应该根据互联网上的某人工作的代码,但由于某种原因它不适合我。当我单击删除时,它只会刷新,但该行不会消失。这与我在表格中的 ID 有关吗?

<body>
<?php
$host="localhost"; // Host name
$username="root"; // Mysql username
$password="*****"; // Mysql password
$db_name="test"; // Database name
$tbl_name="deviation"; // Table name

// Connect to server and select databse.
mysql_connect("$host", "$username", "$password")or die("cannot connect");
mysql_select_db("$db_name")or die("cannot select DB");

$sql="SELECT * FROM $tbl_name";
$result=mysql_query($sql);

$count=mysql_num_rows($result);

?>
<table width="400" border="0" cellspacing="1" cellpadding="0">
<tr>
<td><form name="form1" method="post" action="">
<table width="400" border="0" cellpadding="3" cellspacing="1" bgcolor="#CCCCCC">
<tr>
<td bgcolor="#FFFFFF">&nbsp;</td>
<td colspan="4" bgcolor="#FFFFFF"><strong>Delete multiple rows in mysql</strong> </td>
</tr>
<tr>
<td align="center" bgcolor="#FFFFFF">Åtgärda</td>
<td align="center" bgcolor="#FFFFFF"><strong>Chassinummer</strong></td>
<td align="center" bgcolor="#FFFFFF"><strong>Problem detail</strong></td>
<td align="center" bgcolor="#FFFFFF"><strong>Fault code</strong></td>
<td align="center" bgcolor="#FFFFFF"><strong>Position</strong></td>
<td align="center" bgcolor="#FFFFFF"><strong>Help object</strong></td>
<td align="center" bgcolor="#FFFFFF"><strong>Operation step</strong></td>
</tr>
<?php
while($rows=mysql_fetch_array($result)){
?>
<tr>
<td align="center" bgcolor="#FFFFFF"><input name="checkbox[]" type="checkbox"     id="checkbox[]" value="<?php echo $rows['id']; ?>"></td>
<td bgcolor="#FFFFFF"><?php echo $rows['chassi']; ?></td>
<td bgcolor="#FFFFFF"><?php echo $rows['problem_detail']; ?></td>
<td bgcolor="#FFFFFF"><?php echo $rows['fault_code']; ?></td>
<td bgcolor="#FFFFFF"><?php echo $rows['fault_code']; ?></td>
<td bgcolor="#FFFFFF"><?php  echo $rows['position']; ?></td>
<td bgcolor="#FFFFFF"><?php echo $rows['help_object']; ?></td>
<td bgcolor="#FFFFFF"><?php echo $rows['operation_step']; ?></td>
</tr>
<?php
}
?>

<tr>
<td colspan="5" align="center" bgcolor="#FFFFFF"><input name="delete"     type="submit"     id="delete" value="Delete"></td>
</tr>
<?php

**$checkbox = $_POST['checkbox'];**
**$delete = $_POST['delete'];**

// Check if delete button active, start this
if($delete){
for($i=0;$i<$count;$i++){
$del_id = $checkbox[$i];

**$sql = "DELETE FROM $tbl_name WHERE id='$del_id'";**
$result = mysql_query($sql);
}

// if successful redirect to delete_multiple.php
if($result){
echo "<meta http-equiv=\"refresh\" content=\"0;URL=deletetable.php\">";
}
}
mysql_close();
?>
</table>
</form>
</td>
</tr>
</table>
</body>

【问题讨论】:

  • 打印生成的 SQL 查询以查看发送到数据库的内容。而不是echo "&lt;meta http-equiv=\"refresh\" content=\"0;URL=deletetable.php\"&gt;"; 使用header('Location: deletetable.php'),清理所有用户输入,否则您将面临风险
  • “网上有人”忘了告诉你SQL injection attacks
  • 那个代码比 sin 更老。有已弃用的 align 属性、mysql_* 函数、无意义的双星号......这就是为什么你不相信“互联网上的某人”的代码,应该总是用细齿梳子(或更好,自己写)。

标签: php html checkbox


【解决方案1】:

我想将您的注意力引向某些事情:

1) PHP 中有许多行用无意义的双星号括起来。我很震惊 PHP 居然通过了这些。

2) 您在脚本顶部的全局范围内定义了一个$result(从mysql_query() 为其提供了一个资源指针)。这意味着在底部,您检查if($result),该检查将始终到达true(除非存在语法错误)。这也意味着无论删除是否实际发生,当您点击提交时页面总是会刷新。

正如我在 cmets 中提到的,该代码(坦率地说)是一团糟。它容易受到 SQL 注入的影响,代码实际上并没有做它应该做的事情,它使用了不推荐使用的属性和函数......代码无法做你想做的事情不是因为你的表中的 ID,而是因为您从 Internet 上复制的损坏的、无法运行的代码。

【讨论】:

    【解决方案2】:

    不要遍历整个表 替换这个

    for($i=0;$i<$count;$i++){
    $del_id = $checkbox[$i];
    
    **$sql = "DELETE FROM $tbl_name WHERE id='$del_id'";**
    $result = mysql_query($sql);
    }
    

    if(isset($_POST['checkbox']) && is_array($_POST['checkbox')){
        foreach($_POST['checkbox'] as $id){
            $id = (int)$id;
            $sql = "DELETE FROM $tbl_name WHERE id='$id'";
            $result = mysql_query($sql);
        }
    }
    

    【讨论】:

    • 但是如果您从头开始重写该代码会更好。 mysql_* 已弃用。我只是想让你知道它的样子。
    • 1.他没有遍历整个表!他正在遍历 $checkbox 数组!
    • @Besnik 如果您查看代码是如何生成的,您会发现forforeach 在这种情况下具有相同的效果。 -1 因为你没有考虑代码应该做什么。
    • @Besnik 睁开眼睛看看他从哪里得到$count
    • @Palladium 猜你的评论是针对我的,因为这是我的回答 :) 如果你看一下 OP 的代码,你会看到他为表中的$count 记录运行for 循环.在我的foreach 中,我只迭代$_POST 数组。
    猜你喜欢
    • 2015-06-13
    • 1970-01-01
    • 1970-01-01
    • 2018-05-09
    • 2021-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多