Html 表中的项目删除按钮?

Html 表中的项目删除按钮?,html,Html,这是一个简单的html问题,但我想知道正确的方法 我的页面中有一个表格,其中包含表格数据,它是数据库中项目的显示。我用php动态构建表,只输出html 我想添加一个列“删除此条目”,每行上都有一个按钮/链接/图片,当它被单击时,我的页面会刷新,php知道应该删除哪个itemID 问题不在于php,而在于html部分 如何使“删除”按钮符合标准?这里有一个不正确的解决方案: <table> <form action='#' method='post'> <tr>

这是一个简单的html问题,但我想知道正确的方法

我的页面中有一个表格,其中包含表格数据,它是数据库中项目的显示。我用php动态构建表,只输出html

我想添加一个列“删除此条目”,每行上都有一个按钮/链接/图片,当它被单击时,我的页面会刷新,php知道应该删除哪个itemID

问题不在于php,而在于html部分

如何使“删除”按钮符合标准?这里有一个不正确的解决方案:

<table>
<form action='#' method='post'>
<tr>
<td>Item 1</td>
<td><input type='hidden' name='id' value='1'><input type='submit' value='X'></td>
</tr>
</form>
<form action='#' method='post'>
<tr>
<td>Item 2</td>
<td><input type='hidden' name='id' value='2'><input type='submit' value='X'></td>
</tr>
</form>
</table>

项目1
项目2
有人有好的解决方案吗?如果可以避免的话,我宁愿不使用太多javascript。 提前谢谢


编辑:事实上,我还有一个秘密的第二个问题:如果我想进行内联编辑(在按下编辑按钮后),比如:使具有值的单元格包含框,并在最后一个单元格中包含提交按钮,该怎么办?

您可以使用一个简单的验证的获取过程,如下所示:

<a href="showResults.php?action=delete&item=112">Delete</a>

您可以使用一个简单的认证的获取过程,如下所示:

<a href="showResults.php?action=delete&item=112">Delete</a>

向每个表单添加一个提交按钮,并将要执行的操作作为每个按钮的值属性发送

<table>
    <form action='#' method='post'>
        <tr>
            <td>Item 1</td>
            <td><input type='hidden' name='id' value='1'><input type='submit' value='X'></td>
            <td><button type="submit" value="remove" name="op">Remove</button></td>
            <td><button type="submit" value="edit" name="op">Edit</button></td>
        </tr>
    </form>
</table>

项目1
去除
编辑

向每个表单添加一个提交按钮,并将要执行的操作作为每个按钮的值属性发送

<table>
    <form action='#' method='post'>
        <tr>
            <td>Item 1</td>
            <td><input type='hidden' name='id' value='1'><input type='submit' value='X'></td>
            <td><button type="submit" value="remove" name="op">Remove</button></td>
            <td><button type="submit" value="edit" name="op">Edit</button></td>
        </tr>
    </form>
</table>

项目1
去除
编辑

为什么不隔离表单并将ID传递到操作页面

<table>
    <tr>
        <td>Item 1</td>
        <td><form action='action.php?id=1' method='post'><input type='submit' value='X'></form></td>
    </tr>
    <tr>
        <td>Item 2</td>
        <td><form action='action.php?id=2' method='post'><input type='submit' value='X'></form></td>
    </tr>
</table>

项目1
项目2

为什么不隔离表单并将ID传递到操作页面

<table>
    <tr>
        <td>Item 1</td>
        <td><form action='action.php?id=1' method='post'><input type='submit' value='X'></form></td>
    </tr>
    <tr>
        <td>Item 2</td>
        <td><form action='action.php?id=2' method='post'><input type='submit' value='X'></form></td>
    </tr>
</table>

项目1
项目2

这有点乱,但如果不按照代理所说的,您也可以这样做以获得文本输入:

<form action='action.php?id=1' method='POST'>
<table>
    <tr>
       <td>Item 1</td>
       <td><input type="text" value="" /></td>
       <td><input type='submit' value='X'></td>
    </tr>
</table>
</form>

<form action='action.php?id=2' method='POST'>
<table>
    <tr>
       <td>Item 2</td>
       <td><input type="text" value="" /></td>
       <td><input type='submit' value='X'></td>
    </tr>
</table>
</form>

项目1
项目2

这有点乱,但如果不按照代理所说的,您也可以这样做以获得文本输入:

<form action='action.php?id=1' method='POST'>
<table>
    <tr>
       <td>Item 1</td>
       <td><input type="text" value="" /></td>
       <td><input type='submit' value='X'></td>
    </tr>
</table>
</form>

<form action='action.php?id=2' method='POST'>
<table>
    <tr>
       <td>Item 2</td>
       <td><input type="text" value="" /></td>
       <td><input type='submit' value='X'></td>
    </tr>
</table>
</form>

项目1
项目2

您可以将提交按钮的名称写为一组事实及其值,例如name='set1(fact1:value2,fact2:value2,…')。然后搜索提交的集合并获取事实值。下面的PHP类PageFacts可以做到这一点。您可以使用条件if(PageFacts::is('del'))检查集合是否已过帐,并使用语句$itemID=PageFacts::get('del',id')获取事实值。 带有提交按钮的表单可以如下所示:

<form method="post">
    ... item [0] text/input
    <input type="submit" name="del(id:0)" value="Del">
    ... item [1] text/input
    <input type="submit" name="del(id:1)" value="Del">
    ... item [2] text/input
    <input type="submit" name="del(id:2)" value="Del">
    ...
    ...
    <input type="submit" name="chng" value="Chng">
</form>
PageFactsPHP代码:

class PageFacts {

    // Gets fact value from posted set
    // $s ... name of a set
    // $f ... name of a fact
    // returns - value of fact $f in set $s
    //         - TRUE  if set $s exists but fact $f doesn't exist
    //         - FALSE if set $s doesn't exist
    public static function get($s, $f = NULL) {
        // Regex pattern to search for set $s
        $ps = "/^\s*$s\s*\((.*)\)\s*$/";
        // Search POSTed names (variable $v is not used)
        foreach ($_POST as $key => $v) {
            $ok = preg_match($ps, $key, $matches);
            if ($ok && isset($matches[1])) {
                // If $f is not passed return TRUE, means set $s exists regardless of fact $f
                if (!isset($f)) {
                    return TRUE;
                }
                // Otherwise return value of fact $f
                // use regex pattern to search in list of fact:value items separated by a comma
                $pf = "/^\s*$f\s*\:\s*(.+)\s*$/";
                foreach (explode(',', $matches[1]) as $fv) {
                    $ok = preg_match($pf, $fv, $matches);
                    if ($ok && isset($matches[1])) {
                        return $matches[1];
                    }
                }
            }
        }
        return FALSE;
    }
    // Checks if set $s is posted
    public static function is($s) {
        return self::get($s);
    }
}

您可以将提交按钮的名称写为一组事实及其值,例如name='set1(fact1:value2,fact2:value2,…')。然后搜索提交的集合并获取事实值。下面的PHP类PageFacts可以做到这一点。您可以使用条件if(PageFacts::is('del'))检查集合是否已过帐,并使用语句$itemID=PageFacts::get('del',id')获取事实值。 带有提交按钮的表单可以如下所示:

<form method="post">
    ... item [0] text/input
    <input type="submit" name="del(id:0)" value="Del">
    ... item [1] text/input
    <input type="submit" name="del(id:1)" value="Del">
    ... item [2] text/input
    <input type="submit" name="del(id:2)" value="Del">
    ...
    ...
    <input type="submit" name="chng" value="Chng">
</form>
PageFactsPHP代码:

class PageFacts {

    // Gets fact value from posted set
    // $s ... name of a set
    // $f ... name of a fact
    // returns - value of fact $f in set $s
    //         - TRUE  if set $s exists but fact $f doesn't exist
    //         - FALSE if set $s doesn't exist
    public static function get($s, $f = NULL) {
        // Regex pattern to search for set $s
        $ps = "/^\s*$s\s*\((.*)\)\s*$/";
        // Search POSTed names (variable $v is not used)
        foreach ($_POST as $key => $v) {
            $ok = preg_match($ps, $key, $matches);
            if ($ok && isset($matches[1])) {
                // If $f is not passed return TRUE, means set $s exists regardless of fact $f
                if (!isset($f)) {
                    return TRUE;
                }
                // Otherwise return value of fact $f
                // use regex pattern to search in list of fact:value items separated by a comma
                $pf = "/^\s*$f\s*\:\s*(.+)\s*$/";
                foreach (explode(',', $matches[1]) as $fv) {
                    $ok = preg_match($pf, $fv, $matches);
                    if ($ok && isset($matches[1])) {
                        return $matches[1];
                    }
                }
            }
        }
        return FALSE;
    }
    // Checks if set $s is posted
    public static function is($s) {
        return self::get($s);
    }
}

是的,我可以,但那很糟糕,因为谷歌在抓取链接时会访问该链接。我承认它可能不会刮取动态页面,但在我看来,它仍然不是一个好的解决方案。Tominator,除非用户浏览经过身份验证,否则不会显示链接。在这种情况下,GET方法的缺点是GET请求意味着浏览器可以访问,而delete请求会更改状态。。这意味着它不应该被缓存!请不要在GET请求中删除某些内容。无论您是否在HTML中包含该链接(在某些情况下,某些机器人会通过发送GET请求找到地址并删除所有内容),这都无关紧要。使用DELETE或(即,在仅支持GET和POST的HTML表单中)POST作为后备方法。没有机器人会向您的地址发送HTTP POST/PUT/DELETE。@Jonathan Sampson:让它成为“不应该”。我知道你的意思,你是对的,但我仍然不会滥用GET来修改数据(GET方法应该是const),因为这是不对的。任何HTTP客户端都可以向任何资源发送大量GET请求。如果它不是一个谷歌机器人,它可能是某个正在进行预取的浏览器插件,它预取了一个删除数据库中某些内容的页面。我知道这在普通PHP中不像在某些PerlWeb框架中那么简单,但作为删除的替代方法,使用POST;是的,我可以,但那很糟糕,因为谷歌在抓取链接时会访问该链接。我承认它可能不会刮取动态页面,但在我看来,它仍然不是一个好的解决方案。Tominator,除非用户浏览经过身份验证,否则不会显示链接。在这种情况下,GET方法的缺点是GET请求意味着浏览器可以访问,而delete请求会更改状态。。这意味着它不应该被缓存!请不要在GET请求中删除某些内容。无论您是否在HTML中包含该链接(在某些情况下,某些机器人会通过发送GET请求找到地址并删除所有内容),这都无关紧要。使用DELETE或(即,在仅支持GET和POST的HTML表单中)POST作为后备方法。没有机器人会向您的地址发送HTTP POST/PUT/DELETE。@Jonathan Sampson:让它成为“不应该”。我知道你的意思,你是对的,但我仍然不会滥用GET来修改数据(GET方法应该是const),因为这是不对的。任何HTTP客户端都可以向任何资源发送大量GET请求。如果它不是一个谷歌机器人,它可能是某个正在进行预取的浏览器插件,它预取了一个删除数据库中某些内容的页面。我知道