0

オオカミの名前をクリックすると、オオカミがクリックしたオオカミに関する情報をパーソナライズするために使用するページに移動するように、小さなテスト プロジェクトをセットアップしました。このページは wolf.php と呼ばれます。$_GET メソッドに変数を渡して、URL にオオカミ ID、つまり www.testsite.com/wolf.php?id=1 を割り当てようとしていますが、エラーが発生していなくても、ページには何も表示されません。

ホームページはこちら(home.php)

<?php
$username = $_SESSION['username'];
$result = @mysql_query("SELECT * FROM wolves WHERE owner = '$username'");
while($wolf = mysql_fetch_array($result))
{
echo "<a href= wolf.php?id=$wolf[id]>$wolf[name]</a>";
};
?>

このリンクをクリックすると、www.testsite.com/wolf.php?id=1 (または ID が何であれ) に移動します。wolf.php には次のようなものがあります。

<?php
$id = $_GET['id'];
$result = @mysql_query("SELECT name FROM wolves WHERE id = '$id'") or die("Error: no  
such wolf exists");
echo .$result['name'].
;
?>

どこが間違っていたのかわかりませんが、これは機能していないようです。オオカミの ID に関する情報は表示されません。事前に助けてくれてありがとう。

4

4 に答える 4

3

開発中のエラー報告をオンにerror_reporting(E_ALL); ini_set('display_errors', 1);して、コード内の致命的な構文エラーを確認します。@呼び出しからエラー抑制演算子を削除することもお勧めしますmysql_*()

最後の行に構文の問題があります。予期しない.連結演算子:

// Wrong:
// Parse error: syntax error, unexpected '.'
echo .$result['name'].
;

// Should be:
echo $result['name'];

次に、クエリから行をフェッチしていません。

// mysql_query() won't error if there are no rows found.  Instead you have to check mysql_num_rows()
$result = mysql_query("SELECT name FROM wolves WHERE id = '$id'") or die("Query error: " . mysql_error());
// Zero rows found, echo error message.
if (mysql_num_rows($result) < 1) {
  echo "No such wolf.";
}
else {
  // Row found, fetch and display.
  $row = mysql_fetch_assoc($result);
  echo $row['name'];
}

このスクリプトは、SQL インジェクションに対して広く開かれていることに注意してください。少なくとも、mysql_real_escape_string()クエリ入力変数を呼び出します。

$id = mysql_real_escape_string($_GET['id']);

最終的には、古い関数の代わりに PDO または MySQLi を使用することを検討しmysql_*()てください。これらは、変数を手動でエスケープするよりもセキュリティを強化するために準備済みステートメントをサポートしているためです。関数はmysql_*()非推奨になる予定です。

于 2012-07-22T20:53:57.723 に答える
1

最初に結果行をフェッチする必要があります。

バリエーション 1 - 連想配列 (値はフィールド名として使用可能)

$result = mysql_fetch_assoc($result);
echo $result['name'];

バリアント 2 - 列挙型配列 (インデックスによる、ゼロから開始)

$result = mysql_fetch_row($result);
echo $result[0];
于 2012-07-22T21:13:13.153 に答える
0
<?php
$username = $_SESSION['username'];
$result = @mysql_query("SELECT * FROM wolves WHERE owner = '$username'");

あなたは最初に を忘れましsession_start();た。$usernameは "" であり、SQL はおそらく 0 レコードを返しています。

于 2012-07-22T20:54:08.147 に答える
0

$result2 番目のスニペットでは、配列のように扱うことはできません。これはリソース識別子です。配列を取得するには、次のようにします。

$row = mysql_fetch_assoc($result);
echo $row['name'];

SQL インジェクションの脆弱性についてもお読みください。

于 2012-07-22T21:00:59.313 に答える