-1

我又回来了,尝试创建一个“自定义”博客系统。或者 CMS,正如人们所说的那样。这是我当前的代码:

<?php
//include stuff here
$pid = $_GET['pageid'];
$data = mysql_query("SELECT * FROM entries WHERE id='$pid'") or die("MySQL died.");
mysql_real_escape_string($pid);
while($info = mysql_fetch_array( $data )) 
{
if (!empty($info)) {
echo $info['data'];
}
else {
echo 'This page no existo.';
}
}
?>

发生的事情是它没有显示“此页面不存在”。作为'404'文本。假设有人试图直接输入我的网站但犯了一个错误:localhost/blog/?pageid=10 它没有显示 404 文本!

我在 MySQL 中有一行名为“data”。它由——嗯……博客文章的数据组成。我还有一个名为 ID 的行,它是一个自动增量 ID 系统。“真实”的工作页面 ID 为 1。

谢谢,RBLXDev。

编辑:$info 的 Vardump:vardump:

array (size=10)
0 => string '1' (length=1)
'id' => string '1' (length=1)
1 => string 'Testing potatoCMS... and the title.' (length=35)
'title' => string 'Testing potatoCMS... and the title.' (length=35)
2 => string 'This is a test.
This is a new line.
This is a cookie.
You are getting fat.
FAT.<br />lol' (length=88)
'data' => string 'This is a test.
This is a new line.
This is a cookie.
You are getting fat.
FAT.<br />lol' (length=88)
3 => string '2013-02-02' (length=10)
'date' => string '2013-02-02' (length=10)
4 => string 'Unspecified' (length=11)
'author' => string 'Unspecified' (length=11)

是的,嗯...我有奇怪的占位符。

4

3 回答 3

1

我会尝试这样的事情......

<?php

        $pid = $_GET['pageid'];
        mysql_real_escape_string($pid);

        $data = mysql_query("SELECT * FROM entries WHERE id='$pid'") or die("MySQL died.");

        $num_rows = mysql_num_rows($data);

        if ($num_rows == NULL) {

              echo 'This page no existo.';

        } else {

                  $info = mysql_fetch_array( $data );
                  echo $info['data'];
        }
?>

未测试

更新!!

于 2013-02-03T01:25:23.163 回答
1

首先,让我们从您来这里的目的开始:

如果记录不存在,mysql_fetch_array( $data )将返回false,因此,它甚至不会再进入while块。所以,你的逻辑是错误的。

其次,你用mysql_real_escape_string()错了。您需要在执行 SQL 查询之前调用它,并且需要在要注入 SQL 查询的变量中捕获其输出:

$pid = mysql_real_escape_string($pid);
$data = mysql_query("SELECT * FROM entries WHERE id='$pid'") or die("MySQL died.");

第三,您可能需要考虑mysql_*完全放弃函数,因为该库正在被弃用,因为它提供的缓解 SQL 注入的能力很差。考虑使用改进的mysqli_*库函数,或PDO.

于 2013-02-03T01:27:16.880 回答
0
  1. 请不要mysql_*在新代码中使用函数。它们不再被维护并被正式弃用。看到红框了吗?改为了解准备好的语句,并使用PDOMySQLi -本文将帮助您决定使用哪个。如果您选择 PDO,这里有一个很好的教程

  2. 在查询中使用数据之前,您必须先转义数据。

  3. mysql_num_rows()是判断您的查询是否有任何结果的最佳方式。

  4. 如果您只期望查询中的行,则不需要遍历所有结果。

  5. 如果$_GET['pageid']将始终是一个数字,则应将其转换为整数以减少 SQL 注入的机会

.

<?php
//include stuff here
$pid = $_GET['pageid'];
mysql_real_escape_string($pid);
$data = mysql_query("SELECT * FROM entries WHERE id='$pid'") or die("MySQL died.");
if (mysql_num_rows() > 0) {

    $info = mysql_fetch_array( $data );
    echo $info['data'];
}
else {
    echo 'This page no existo.';
}
?>
于 2013-02-03T01:23:05.220 回答