【发布时间】:2012-05-04 11:14:52
【问题描述】:
我使用 php GET 来检查 URL 中的 ID,然后从与该 ID 匹配的数据库中检索 tekst。这是执行此操作的代码的 sn-p:
function getLyric() {
$id = (int)$_GET['id'];
$query = mysql_query("SELECT * FROM lyrics WHERE id = ".$id."") or die(mysql_error());
if ($row = mysql_fetch_assoc($query)) { ?>
<h1><?= $row['title']; ?> lyrics</h1>
<h2><?= $row['author']; ?></h2>
<pre><?= $row['lyrics']; ?></pre>
<?php }
else { header("HTTP/1.1 404 Not Found"); header("Status 404 Not Found"); }
}
这就是我调用此函数时页面的外观:
<?php include 'includes/header.php' ?>
<?php getLyric(); ?>
<?php include 'includes/footer.php' ?>
很遗憾,函数中的 404 部分不起作用。我收到以下警告。Warning: Cannot modify header information - headers already sent by [redacted] functions.php on line 61。第61行是404部分; “其他{标题}〜”。
我从 Stackoverflow 了解到这是因为 <html><head> 部分已经在页面上输出,所以我不能再更改它了。这是对的吗?
以前当我没有else~部分时,我只是得到一个空白页。在这种情况下如何正确发送 404?如果我不能,最接近的选择是什么?
【问题讨论】:
-
仅供参考,您的代码对 SQL 注入完全开放,如果您还没有被黑客入侵,那么您将被黑客入侵。学习使用 PDO 进行准备好的查询,以完全避免这个问题。
-
将字符串类型转换为 int 只会返回
0。除非从他的数据库中请求一个 id 0 神奇地打开了它的入侵,我不认为这有那么大的威胁。现在,如果他习惯以同样的方式直接使用字符串,我可以看出问题出在哪里。 -
谢谢,我会调查的。 PDO 代表什么? @MetalFrog:我的字符串首先通过
mysql_real_escape_string。我已经读过那会做的。 -
@Brad:不,输入已经过类型转换。
-
够了。 PDO 是 PHP Data Objects 的缩写,它是一个与数据库交互的通用接口类。它不像 Brad 所说的那样是灵丹妙药,但如果您使用多个 DBM,它肯定会让事情变得更容易。 us.php.net/PDO
标签: php mysql http-headers http-status-code-404