我是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"> <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']." ";
}
?>