【问题标题】:Help with deleting items in a list, using PHP使用 PHP 帮助删除列表中的项目
【发布时间】:2010-11-05 19:47:59
【问题描述】:

我在一个表中有一个电子邮件地址列表,该列表是通过 SQL 查询填充的。在每个电子邮件地址旁边,我放置了一个提交按钮,我想用它来删除出现在该特定表格行中的电子邮件地址。

我想将电子邮件地址附加到每个删除按钮的名称中,希望它会带我走向正确的方向。

while($row = mysql_fetch_array($result))
    echo "<tr><td>".$row['email_adress']."</td><td><input type=\"submit\" value=\"Delete\" name=\"delete".$row['email_adress']."\"></td></tr>";

我想知道如何为每个条目使用删除按钮。有什么帮助吗?

【问题讨论】:

  • 让它name="delete[1]"。而且我宁愿使用复选框

标签: php


【解决方案1】:

我认为问题在于您试图使用提交按钮来包含数据,而提交按钮并不意味着包含数据。好吧,他们可以并且人们确实以这种方式使用它们,但我更喜欢使用提交按钮来确定如何处理数据,而不是成为提交中的数据。我认为有两种基本方法可以很好地扩展您正在尝试做的事情。

1.) 使用链接发出删除 2.) 使用提交按钮发出删除,但包括一个隐藏的表单字段以包含要删除的电子邮件地址。

在使用链接的情况下,您不必处理表单,但我不知道页面的其余部分。如果您要发送任何其他数据,那么表单是理想的方式。如果您只是发送一条数据来删除电子邮件,那么我建议您使用链接。我的建议来自功能的角度。您可能有一个我不知道的按钮的 UI 原因。

在使用表单的情况下,隐藏字段应该包含主键(未测试):

while($row = mysql_fetch_array($result)) {
    echo "<tr>
           <td>".$row['email_adress']."</td>
           <td><form action="some/uri/to/something">
              <input type=\"hidden\" 
                 name=\"emailAddress\" value=\"{$row['email_adress']}\"/>
              <input type=\"submit\" value=\"Delete\"
                name=\"delete".{$row['email_adress']}."\">";
              </form>
            </tr>
          </td>";
        }

您必须围绕每个提交创建一个表单,否则表单中的每个隐藏字段都将被提交,不会告诉您要删除哪封电子邮件。您可以使用 Javascript 对提交做更多的事情,但简单的方法是只使用一个链接——忘记表单。

【讨论】:

    【解决方案2】:

    如果按钮是绝对必须的,您可以为每个按钮输出一个小表单,并添加一个包含 id 的隐藏字段(或电子邮件,如果您坚持的话)。该表单将在隐藏字段中提交 id 或地址,您可以在处理脚本中选择并运行删除查询。

    已编辑以删除被确定为不明智方法的部分答案

    【讨论】:

    • 切勿使用链接更改您的数据。
    • @Col。弹片:你更喜欢隐藏表单域的方式吗?这对我来说似乎很好。
    • 哎呀,没想到会有这样的反应!我只是给出了一个快速的解决方案,没有过多考虑安全隐患。对不起,乔恩,我不是故意让你误入歧途的。
    • @Jon 没关系。只要您使用 POST 方法,任何字段类型。但是我认为这里的隐藏字段没有用。我宁愿使用带有复选框的单一表单。但是如果你想要单独的表格,隐藏就可以了。
    • 正如我在另一条评论中所写的,我认为这没什么大不了的。但是,我同意更改数据的所有内容都应该是 POST,而指定要检索哪些数据的所有内容都应该是 GET。
    【解决方案3】:

    所以我一直在搞乱这段代码,试图获得一个“预取浏览器插件”来触发某些东西并杀死我的数据库......但我还没有能够触发任何东西......但我一定会喜欢的。

    <?php
    //CREATE AND POPULATE DB
    if(!file_exists('a.sqlite')){
        $db = new SQLite3('a.sqlite');
        $db -> exec("CREATE TABLE test (idx INTEGER PRIMARY KEY, number INTEGER NOT NULL);");
        for($i=0;$i<9;$i++){
        $db -> exec("INSERT INTO test (number) VALUES (".(rand(1000,9999)).");");
        }
    }else{
        $db = new SQLite3('a.sqlite');
    }
    //PERFORM DELETE FROM HREF
    if(isset($_REQUEST['delete'])){
        $db -> exec("DELETE FROM test WHERE idx = ".$_REQUEST['delete'].";");
    }
    
    //SHOW CONTENTS OF BASE OR DELETE DB FILE
    $result = $db->query('SELECT * FROM test');
    while ($row = $result->fetchArray()) {
        echo "<a href='test.php?delete=".$row['idx']."'>".$row['number']."</a></br>";
    }
    ?>
    

    【讨论】:

      【解决方案4】:

      是的,您可以这样做,但这需要在表单的目标页面上再次执行查询,然后检查 "delete".$row['email_adress'] 的每个组合或使用这样的结构:

      foreach ($_REQUEST as $key => $dummy)
          if (substr($key,0,6) == 'delete')
              delete_entry(substr($key,6));
      

      但是,如果您只是交换值和名称...

      <input type=\"submit\" name=\"Delete\" value=\"".$row['email_adress']."\">
      

      ...您只需检查 $_REQUEST['Delete'] 即可了解单击了哪个地址按钮。

      【讨论】:

        【解决方案5】:

        ...我仍然不确定是否要在网页上显示人们的电子邮件,除非它是公司内部的。我猜我们是在一个安全的公司后台? 我会去:

        <a href=my_page.php?delete_email_id=456>email</a>
        

        可能有一些烦人的 javascript 用于确认

        <a href=my_page.php?delete_email_id=456 onClick="return confirm('Do you want to delete this email address ?')">email</a>
        

        然后用 a 抓住它

        if(isset($_REQUEST['delete_email_id']){ SQL UPDATE ENTRY...}
        

        在 my_page.php 的顶部

        【讨论】:

        • 永远不要使用默认返回 TRUE 的 JS 确认。机器人不运行 JS
        • 我不明白为什么不...我的意思是您可以通过其他方式保护您的网页。
        • 您无法通过自己的浏览器保护您的页面。 Google 桌面搜索、各种预取等。
        • 我要运行一些测试......我不使用前面提到的任何东西,但我想删除所有数据的预取东西会很混乱。 Ajax-ing href 怎么样?我想这会保护它。
        • 我认为不存在这样的预取。它会使每一个 Web 应用程序(和浏览器历史记录)都变得毫无用处。从未听说过“我的浏览器点击了所有链接”的问题。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多