【问题标题】:Correct way to use an if statement and a $GET in PHP在 PHP 中使用 if 语句和 $GET 的正确方法
【发布时间】:2012-09-06 18:56:14
【问题描述】:

我对 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 但我已经将它用于其他东西,另一个查询/功能。我希望大家都明白,谁能告诉我我哪里出错了?

【问题讨论】:

  • 你只是想删除服务器上的文件吗?
  • 你检查过你输出的 HTML 以确保它是正确的吗?
  • 警告您的代码容易受到 sql 注入攻击。
  • 是的,我知道它不是一个非常安全的查询,我可以写得更安全,它只是用于基本测试和功能。不过感谢您的提醒:)
  • Psst,= 是赋值,== 是一般相等。另外,read up on prepared statements 保护自己免受上述 SQL 注入漏洞的侵害。

标签: php html sql-server if-statement


【解决方案1】:

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

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

改为:

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

【讨论】:

  • 另外,'==' - 你得到了,但它是错误的重要部分。
  • 留意 Danial A. White 的评论。切勿直接在 SQL 语句中使用输入数据,无论是 $_GET 还是 $_POST。始终过滤数据,以便您准确了解将要请求的信息类型。尝试使用mysql_real_escape_string($_GET['cid']) 并确保它是is_int($_GET['cid']) 的整数。
  • 它是一个 MSSQL 数据库,而不是 MySQL 数据库。所以我不认为 mysql-real_escape 会起作用,据我所知,没有 MSSQL 等价物吗?我确实使用字符串格式来保护我的大部分查询,但不是在我只是测试功能时。懒惰,我知道。 :p 谢谢 :)
  • 不客气。尝试阅读本文仅供参考stackoverflow.com/questions/574805/…
【解决方案2】:

还有一些需要考虑的事情:

1) 不要在 mysql 查询中直接使用来自 $_GET 的未经处理的值

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

通过一些时髦的 sql 注入很容易利用这一点(请参阅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 请求来更改服务器上的数据

想象一个 google bot 浏览您的网站并跟踪您用来删除图片的所有链接。其他场景涉及用户的浏览器预取插件(例如 Fasterfox)。此外,GET 请求可能会被代理和浏览器缓存,因此如果您单击链接,请求不会到达服务器。

HTTP 规范附带了许多请求方法,其中最重要的有:

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

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

【讨论】:

    【解决方案3】:

    试试这个

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多