2

php GETを使用してURL内のIDを確認し、そのIDに一致するデータベースからtekstを取得します。これは、それを行うコードのスニペットです。

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部分です。"else {header}〜"。

Stackoverflowから、これは<html><head>パーツがすでにページに出力されているためであることがわかりました。したがって、これを変更することはできません。正解です?

以前、else〜の部分がなかったとき、空白のページが表示されました。この場合、どうすれば404を適切に送信できますか?一番近いオプションがわからない場合はどうすればよいですか?

4

7 に答える 7

6

ロジックをプレゼンテーションから分離する必要があります。

function getLyric() {
    $id = (int)$_GET['id'];
    $query = mysql_query("SELECT * FROM lyrics WHERE id = ".$id."") 
                 or die(mysql_error());
    return mysql_fetch_assoc($query);
}

...それから:

<?php
$row = getLyric();

if (!$row) {
    header("HTTP/1.1 404 Not Found");
    exit;
}

include 'includes/header.php' 
?>

<h1><?= $row['title']; ?> lyrics</h1>
<h2><?= $row['author']; ?></h2>

<pre><?= $row['lyrics']; ?></pre>

<?php 
include 'includes/footer.php'
?>
于 2012-04-23T20:06:32.533 に答える
2

いいえ、できません。ヘッダーが最初に表示されるので、テキストを送り返すと、ヘッダーはいわばドアの外に出ています。

ヘッダーを含める前にクエリを実行し、データが返されたことを確認するためのチェックを実行してから、印刷することをお勧めします。

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)) {
    include 'includes/header.php'; 
  ?>
      <h1><?= $row['title']; ?> lyrics</h1>
      <h2><?= $row['author']; ?></h2>

      <pre><?= $row['lyrics']; ?></pre>
      <?php }
  else { header("HTTP/1.1 404 Not Found"); }
}

<?php getLyric(); ?>
<?php include 'includes/footer.php' ?>
于 2012-04-23T20:01:58.443 に答える
2

HTMLコードを送信すると、ヘッダーを変更することはできません。ヘッダーは、要求されたページをどう処理するかをブラウザに指示します。すでにHTMLを受信して​​いる場合は、content-type:text \ htmlを想定して、ページのレンダリングを開始します。その時点でヘッダーが定義され、戻ることはできません。

于 2012-04-23T20:01:31.453 に答える
0

一度送信されたヘッダーは送信できなくなります。できることは、出力バッファリングを有効にすることです。これは、基本的に、スクリプトが実行されるまで待機してから出力します。これにより、スクリプトの任意の時点でヘッダーを設定できますが、スクリプトによってはいくつかの小さな影響があります。盲目的に有効にする前に、ヘッダーをよく読んでおく必要があります。

また、SQLの挿入についても読んでください。あなたのサイトは悪用されることに対して非常に脆弱です。

于 2012-04-23T20:03:58.157 に答える
0

スクリプトで出力バッファリングを有効にできます。

例:

<?php
ob_start();
echo 'Hi';
header('Location: http://someurl');
exit;
?>

使用する前に、出力バッファリングが何であるかを確認してください。

于 2012-04-23T20:06:00.663 に答える
0
ob_start();
header("location:somepage.php");
ob_end_flush();

実際、出力バフレンをオンにしている場合は、フラッシュする前に何も送信されません。ヘッダーも送信されません。

于 2012-04-23T20:08:10.380 に答える
0

ご覧のとおり、コンテンツがすでに送信されている場合、404は送信できません。2つのオプション、IMOがあります

  • コードを変更して、出力バッファリングを有効にします。これは基本的に、エコーアウトするか、PHPタグの外側のコンテンツがバッファに入り、クライアントに送信されないことを意味します。ここでそれについて読んでください

  • UIではなくデータを提供するように関数を変更します。これは、関数getLyrics()が関係する行を提供する必要があることを意味します。ヘッダーを作成する前にinclude、関数がレコードが存在することを示しているかどうかを必ず確認してください。それ以外の場合は、いつでも404を送信できます。これは実際に推奨されており、ロジックをUIから本質的に分離しているため、優れた設計です。

于 2012-04-23T20:08:57.217 に答える