0

私のウェブサイトは phpbb フォーラムと統合されており、1 つの php ファイルと 1 つのテンプレートを使用して、データベース内のさまざまな行を使用して一意のページを表示しようとしています。サンプル ファイルは次のようになります。

php ファイル:

<?php
include "includes/phpbb.php";

$template->set_filenames(array(
'body'  => 'people.html',
));

$name = $_GET['name'];
$result = $db->sql_query("SELECT * FROM people WHERE name = $name");
while($row = $db->sql_fetchrow($result))
{
$template->assign_vars(array(
'NAME'          => $row['name'],
'AGE'           => $row['age'],
    ));
}

$site->page_footer();

?>

html テンプレートは次のとおりです。

<!-- INCLUDE overall_header.html -->

{NAME} is {AGE} years old.

<!-- INCLUDE overall_footer.html -->

テーブルに 2 つの行があります。一人は「51」歳の「ウォルト」、もう一人は「25」歳の「ジェシー」。people.php?name=Walt のような URL を入力すると、エラー ページが表示されます。

SQL ERROR [ mysqli ]

Unknown column 'Walt' in 'where clause' [1054]

SQL

SELECT * FROM people WHERE name = Walt

任意の種類の数値を入力すると、ページは正常に表示されますが、変数が入力されていないため、ページには「歳です」と表示されます。?name=name と入力すると、データベース テーブルの 2 番目の行が表示され、「ジェシーは 25 歳です」と表示されます (これには本当に困惑します)。

これを引き起こすために何が間違っていますか?私は明らかに、URL に「Walt」または「Jesse」を入力して、それらの情報の行だけでページ全体を取得できるようにしたいと考えています。

4

2 に答える 2

1

変数を文字列で囲む必要があるだけです。そう:

$result = $db->sql_query("SELECT * FROM people WHERE name = '$name'");

トリックを行う必要があります。

非常に非常に注意してください。$dbオブジェクトはphpbbから来ていると思います.実行する前に、データベースクエリをサニタイズします. しかし、無防備な状態で盲目的にユーザー入力を取得し、データベースに対してクエリを実行すると、SQL インジェクションと苦痛の世界につながります。PHP でユーザー入力をサニタイズするための最良の方法は何ですか?を参照してください。

于 2013-07-20T20:10:31.860 に答える
0

名前は引用符で囲む必要があります:

$result = $db->sql_query("SELECT * FROM people WHERE name = '$name'");
于 2013-07-20T20:11:08.327 に答える