2012-09-06 297 views
1

对于PHP来说相当新颖,我正在制作一个基本的CRUD样式管理系统。我有一个更新页面,它显示来自新闻表的数据,并用它填充表单。当前图片?(参考)被拖动并显示在表单上。但是,如果用户想要更改图片,他们可以按'删除'按钮,然后我写了一些PHP来显示上传按钮,将数据库中的值设置为空,并隐藏删除按钮,从而允许用户上传一张新照片。

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

这是用于显示图像和删除按钮的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> 

正如你可以看到,当点击它设置变化= 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但我已经将其用于其他查询/功能。我希望所有的意义,谁能告诉我哪里会出错?

+0

你只是想删除服务器上的文件? – David

+0

您是否检查过要输出的HTML以确保其全部正确? – andrewsi

+4

**警告**您的代码容易受到sql注入攻击。 –

回答

4

你缺少一个括号+你必须单独注明:

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

更改为:

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

另外,'==' - 这是你得到的,但是是错误的一个重要部分 – FrankieTheKneeMan

+0

注意Danial A. White的注释,不要在SQL语句中直接使用输入数据,无论是通过'$ _GET'还是'$ _POST',总是过滤数据,所以你完全知道将要请求的信息的类型,尝试使用'mysql_real_escape_string($ _ GET ['cid'])'并且确保它是一个带有'is_int($ _ GET ['cid'])的整数' 。 – user1477388

+0

它是一个MSSQL数据库,而不是MySQL。所以我不认为mysql-real_escape可以工作,并且据我所知,没有MSSQL的等价物?我确实使用字符串格式化了大部分查询,但不是当我只是测试功能。懒惰,我知道。:p谢谢:) – Bohdi

0

试试这个

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

?> 
+1

'if(isset($ _ GET ['change'] ==“image1”)'不正确 –

+0

我已经准备好更新我的答案请看看 –

2

做更多的事情要考虑:

1)不要在MySQL查询

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

这是很容易与一些时髦的SQL注入利用此使用直接从$ _GET unsanitized值(见http://xkcd.com/327/)。

如果您正在使用CID数值,你应该投你的$ _GET价值为整数,以防止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更新现有在服务器上的信息

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