Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 获取与发布最佳实践_Php_Html_Http_Forms_Rest - Fatal编程技术网

Php 获取与发布最佳实践

Php 获取与发布最佳实践,php,html,http,forms,rest,Php,Html,Http,Forms,Rest,对于我的web应用程序(PHP/MYSQL),我在每一行显示一个项目列表和一个删除项目的链接。现在,链接是 <a href='item.php?id=3&action=delete'>Delete Item</a> 如果我想用POST来代替。。。我该怎么做(这是一个动态生成的列表)?我可以不使用表单发送POST数据吗 或者,对于每一项,我都必须: <form action='item.php?id={$item_id}' method='POST'&g

对于我的web应用程序(PHP/MYSQL),我在每一行显示一个项目列表和一个删除项目的链接。现在,链接是

<a href='item.php?id=3&action=delete'>Delete Item</a>

如果我想用POST来代替。。。我该怎么做(这是一个动态生成的列表)?我可以不使用表单发送POST数据吗

或者,对于每一项,我都必须:

<form action='item.php?id={$item_id}' method='POST'>
    <input type='hidden' name='action' value='delete'>
    <input type='submit' value='delete item'>
</form>

并将提交按钮设置为与原始链接相同的样式


我不熟悉php CURL或REST,它们能帮助解决这个问题吗?

使用GET还是比较好的

如果您的问题是不喜欢链接的丑陋URL,那么您应该能够通过mod_rewrite(如果您使用ApacheWeb服务器)来解决这个问题

编辑: 没有任何理由在这里使用POST。不,原因

这里的人们谈论安全和不安全,好像选择方法会以任何方式影响安全。当然,无论选择何种方法,都应该对用户进行身份验证。如果你没有,那么你的软件已经坏了。如果您在没有表单、不需要表单、根本不需要任何javascript的情况下使用javascript模拟发送表单,那么您的软件已经坏了

实际上,大约90%的网络软件是坏的,因为人们不知道他们在做什么


忽略这些评论“被一些奇怪的人严重贬低”。避免javascript(无需)、避免POST(无原因)、验证用户(安全)、使用mod_rewrite或其他方式(友好)使href变得漂亮。

一般来说,让GET请求以某种方式修改系统状态(如删除项目)不是一个好主意

您可以让表单如下所示:

<form action='item.php' method='POST' id='form'>
    <input type='hidden' name='action' value='delete' />
    <input type='hidden' name='id' value='{item_id}' />
    <a href="" onclick="document.getElementById('form').submit(); return false;">Delete item</a>
</form>

您不应该从GET请求中更改数据库中的任何内容(除了日志信息或其他临时数据)。问题是有各种网络爬虫软件、网络加速器、反病毒程序等等,它们会对找到的每个URL执行GET请求;您不希望他们这样做时自动删除项目。GET也容易受到跨站点请求伪造的攻击;如果攻击者让您的一个用户单击执行错误操作的链接(例如,创建重定向到删除URL的tinyurl),则他们可以诱使用户使用其权限删除某些内容,而不让用户意识到

是的,您需要提交一份表格来创建POST请求。另一个选项是使用JavaScript和XMLHttpRequest,但这对禁用JavaScript的用户不起作用


您还应该确保一旦接受POST请求中的数据,就应该将用户重定向到GET请求访问的页面,而不是返回新页面来响应该请求。这样,如果在浏览会话中点击“重新加载”或稍后点击“返回”按钮,他们不会意外地重新发送POST请求。

请使用POST来修改数据库中的持久状态。你不希望爬虫访问你的删除链接
在W3C上进行阅读


编辑:有时需要使用GET。例如,在电子邮件中发送的成员资格激活URL是GET,需要以某种方式修改数据库。

您不想使用GET,因为REST原则是不允许GET更改系统状态。除非你喜欢搜索引擎删除你的所有内容

您不需要为每个项目都提供表单;您可以使用delete{id}输入类型为submit的方法=在列表周围发布表单。或者,更聪明地说。提交按钮上允许有名称

根据您在评论中的问题,它可能工作得更好,尽管它存在一些问题,这些问题对于本地化站点来说效果很差。您可以始终还原为HTML按钮,以便对演示文稿进行更多的控制。默认情况下,它的作用类似于提交按钮

当您只是查看列表时,您可能会在提交过程中收到额外的、不需要的信息,这一事实可以通过使用建议的“每项表单”解决方案发回的页面比所需页面大得多的平均情况得到缓解。您始终可以使用javascript来用支持javascript的客户端的更智能版本替换普通的旧html表单的行为


如果你要链接到一个“Get”进行删除,你应该返回一个确认页面,其中包含一个Get,该Get在确认后实际上会发布一篇文章。

正如其他人所说,使用Get进行破坏性操作(如删除)是一个非常糟糕的主意,尤其是在面向互联网的网站(或使用谷歌迷你设备的公司)上网络爬虫可能会意外删除您的所有数据

如果不想使用表单,请使用XMLHttpRequest将帖子发送到服务器。如果您的服务器支持,您甚至可以将该方法设置为DELETE

如果您不能使用JavaScript和XHR(您的用户生活在1999年),并且您不想在列表中使用表单,请使用指向单独页面的链接,在该页面上可以显示表单,并且可能会显示“确定吗?”消息


最好的做法可能是将上述两个选项结合起来:使用表单呈现指向单独页面的链接,但使用JavaScript将链接重写为XHR调用。这样,1999年或2009年的用户都可以获得最佳体验。

下面是一个很好的例子,说明为什么不使用GET来更改服务器状态:

关键部分是:

“它登录到管理区域,并按照“删除”链接进行删除 “每个条目,”管理员说


如果删除被编码为POST,那么这种情况就不会发生。(哦,我们会被一个有趣的系统管理员故事抢走。)

帖子并不像有些人暗示的那样,是一种防范所有恶意行为的保护。恶意用户仍然可以创建链接(包含用于发布的javascript),并导致与GET相同的跨站点脚本问题。()

也就是说,
<tr><td>Item 1</td><td><form action=/delete method=post><input type=hidden name=id value=1><input type=submit value=Delete></form></tr>
<tr><td>Item 2</td><td><form action=/delete method=post><input type=hidden name=id value=2><input type=submit value=Delete></form></tr>
<tr><td>Item 5</td><td><form action=/delete method=post><input type=hidden name=id value=5><input type=submit value=Delete></form></tr>