【问题标题】:Deleting MySQL records using checkboxes in PHP使用 PHP 中的复选框删除 MySQL 记录
【发布时间】:2015-08-29 05:41:29
【问题描述】:

我正在尝试使用复选框删除 PHP 中的 MySQL 记录。我回应了每一行,一切似乎都很好。变量和数组的值和格式是否正确。

但是当我尝试使用VAR_DUMP() 回显$delete(这是DELETE 查询)时,它显示bool(false)(这意味着它没有得到传递给它的变量$emailID 的值, 正确的?)。为什么?

if (isset($_POST['deleteUser']) && isset($_POST['marked_user']))
{

    $marked_user = $_POST['marked_user'];


    foreach($marked_user as $user => $emailID)
    {
        $emailID = (int)$emailID;
        $delete = $base -> query( "DELETE FROM tickets.allowed_users WHERE allowed_users.emailID = '$emailID'");

    }
        header('Location: viewTickets.php?viewType=U');
}

这是来自一个单独的 PHP 文件的 HTML 部分:

echo "<form action='addUser.php' method='POST'><table class='results3' align='center' cellspacing='0'>
            <tr><th class='head' id='headleft'  width='10%'></th>
                <th class='head' id='headright' colspan='4'>E-mail</th></tr>";

            while( $row = mysqli_fetch_array($sql) )
            {
                $email = $row['email'];
                $emailID = $row['emailID'];
                echo "<tr><td width='1%' class='results'><input type='checkbox' name='marked_user[]' value='$emailID'></td>
                        <td class='results' colspan='4'>" . $row['email']."</td></tr>";
            }
                echo "<td colspan='3'><input type='submit' class='button' name='deleteUser' value='Delete'></td></form>";

这是我的桌子:

CREATE TABLE allowed_Users
(
 emailID INT UNSIGNED NOT NULL AUTO_INCREMENT,
 email VARCHAR(50) NOT NULL,
 PRIMARY KEY( emailID )
);

【问题讨论】:

  • SQL 注入漏洞。使用查询绑定而不是直接插入用户提供的值,特别是删除。您可以为您的块 1 提供更多代码吗?我在那里看到一个关闭脚本标记,几乎没有上下文。
  • $base 是一个合适的 MySQLi 对象吗?可以通过print_r($base)查看。
  • 脚本标签不属于那里。它只是放错了地方。 $base 属于处理 php 连接的单独文件中的一个类。我要问的代码只是我正在开发的票务系统的一部分。 Block1 代码就是这样。我在该 php 文件中的某个位置有另一个 if isset 函数,它属于它,它可以做其他事情(插入用户),它工作得很好。
  • 我编辑了我的代码并删除了INSERT 语句以避免混淆,因为这些只是示例记录。我还发布了一个工作代码作为我的问题的答案。我成功了。

标签: php mysql checkbox foreach sql-delete


【解决方案1】:

我认为你需要像这样连接一个字符串:

foreach($marked_user as $user => $emailID)
    {
        $emailID = (int)$emailID;
        $delete = $base -> query( "DELETE FROM tickets.allowed_users WHERE allowed_users.emailID = " . $emailID);

    }

【讨论】:

    【解决方案2】:
    for ($i = 0; $i < count($_POST["marked_user"]); $i++) {
     $base -> query("DELETE FROM tickets.allowed_users WHERE allowed_users.emailID = '".$_POST["marked_user"][$i]."'");
    }
    

    检查是否有效。如果是这样,请操作输入数据,这样您的代码就不会受到 SQL 注入的攻击。

    【讨论】:

      【解决方案3】:

      更改此代码

      $delete = $base -> query( "DELETE FROM tickets.allowed_users WHERE allowed_users.emailID  = '$emailID'"); 
      

      $delete = $base->query( "DELETE FROM tickets.allowed_users WHERE allowed_users.emailID = '$emailID'");
      

      【讨论】:

      • 删除-&gt; 之间的空格不会改变任何内容。我的其他查询看起来像这样,并且运行良好。
      【解决方案4】:

      我无法让foreach 工作,所以我使用了for 循环。所以在那里。我想我可以更多地依赖for 循环。

      if(isset($_POST['delete']))
      {       
          for($i=0;$i<count($_POST['marked']);$i++)
          {
              $del_id=$_POST['marked'][$i];
              $delete = $base -> query( "DELETE FROM allowed_users WHERE emailID = '$del_id'");   
          }
          header('Location: viewTickets.php?viewType=U');
      }
      

      【讨论】:

      • 根据问题上的 cmets,此代码不安全,可能允许匿名用户的任意查询在您的数据库上运行。至少,使用这个漏洞完全清空这个表是微不足道的。
      猜你喜欢
      • 1970-01-01
      • 2016-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-15
      • 1970-01-01
      • 2012-04-26
      • 1970-01-01
      相关资源
      最近更新 更多