在PHP中使用if语句和$GET的正确方法


Correct way to use an if statement and a $GET in PHP

我是PHP的新手,正在制作一个基本的CRUD风格的管理系统。我有一个更新页面,它显示新闻表中的数据,并用它填充表单。当前图片?(reference)被拉过并显示在表单上。但是,如果用户想更改图片,他们可以按下"删除"按钮,然后我写了一些PHP来显示上传按钮,将数据库中的图像值设置为null并隐藏删除按钮,允许用户上传新图片。

"删除"按钮仅从数据库中删除图片的引用(路径),而不会删除实际图片。

这是用于显示图像和删除按钮的HTML控件。它还显示了删除按钮的工作原理:

 <td align="right">Image 1:</td>
 <td align="left"><img src="uploads/newsimages/<?php echo $row["Image"]; ?>" width="230" border="0">&nbsp;<a href="UpdateNews.php?change=imagex&cid=<?php echo $row["NewsID"]; ?>">delete</a></td>

正如您所看到的,当点击时,它设置change=imagex和cid=当前新闻id。

然后我写了一个if语句,但它似乎并不是只有在单击删除按钮时才被激活。因为我总是得到一个错误,"cid"是未定义的。如下所示:

<?php
if (isset($_GET['change'] = "image1") {
    $query = "UPDATE  Table_Name SET Image = '' WHERE NewsID =".$_GET['cid']." ";
}
?>

我确信我对PHP知识的缺乏让我失望了,我试图用错误的方式来处理这件事,因为无论我如何更改if语句,它总是会给我一个错误。首先是cid未定义,所以我改为id,但我已经将其用于其他查询/函数。我希望有人能告诉我哪里出了问题吗?

您缺少一个括号+您必须单独指定:

if (isset($_GET['change'] = "image1") {

更改为:

if (isset($_GET['change']) && $_GET['change'] == "image1") {

需要考虑的更多事项:

1) 不要在mysql查询中直接使用$_GET中的未初始化值

WHERE NewsID =".$_GET['cid']."

通过一些时髦的sql注入可以很容易地利用这一点(请参阅http://xkcd.com/327/)。

如果您对cid使用数值,则应该将$_GET值强制转换为integer以防止sql注入:

$cid = (int)$_GET['cid];
$query = '(...)WHERE NewsID = '.$cid.' limit 1';

甚至更好:

$cid = (int)(array_key_exists('cid', $_GET) ? $_GET['cid'] : 0);
if ($cid) {
  $query = (...)
}

如果你在不同的地方需要这种清理,你应该考虑为它编写一个助手函数,以保持代码的可读性。

2) 不要使用GET请求更改服务器上的数据

想象一下,一个谷歌机器人浏览你的网站,并关注你用来删除图像的所有链接。其他场景涉及用户为其浏览器使用预取插件(例如Fasterfox)。此外,GET请求可能由代理和浏览器缓存,这样,如果您单击链接,请求就不会到达服务器。

HTTP规范提供了许多请求方法,其中最重要的是:

  • GET从服务器获取内容
  • PUT在服务器上存储新信息
  • POST更新服务器上的现有信息

要更新您的新闻记录(通过删除图像),合适的方法是POST。要发送POST请求,可以使用<form method="POST">标记。

尝试这个

<?php
if (isset($_GET['change']) && $_GET['change'] == "image1") {
    $query = "UPDATE  Table_Name SET Image = '' WHERE NewsID =".$_GET['cid']." ";
}
?>