0

このウェブサイトは、司法管轄区ごとに特定の法律/規則を表示することを目的としています。

郡を検索し、郡名を画面に表示する単純な mysqli クエリがあります。

echo "><a href=\"index.php?sel_subj=" . urlencode($subject["county_name"]) . "\">
{$subject["county_name"]}</a></li>";

次に郡名 (リンクに埋め込まれている) をクリックすると、mysqli クエリがその郡名のテーブルを検索し、その郡内のすべての管轄区域を取得することになっています。

if (isset($_GET['sel_subj'] )){
  $query2 = "SELECT * FROM $sel_subj";
  $result2 = $mysqli2->query($query2) or die($mysqli2->error.__LINE__);
    while ($subject = mysqli_fetch_array($result2)) {
      echo "<li";
      echo "><a href=\"index.php?sel_page=" . urlencode($subject["muni_name"]);
      echo "&sel_subj=" . urlencode($sel_subj). "\">
      {$subject["muni_name"]}</a></li>";
    }
}

問題は、一部の郡名にスペースやハイフンが含まれていることです。そのため、ハイフンまたはスペースのある郡をクリックすると、エラーが発生します。

ハイフンがあるとこのエラーが発生します (例: Miami-Dade): SQL 構文にエラーがあります。173 行目の「-Dade」付近で使用する正しい構文については、MySQL サーバーのバージョンに対応するマニュアルを確認してください。

スペースがある場合のエラー (例: Palm Beach): Table 'florida.palm' does not exist73

郡が特殊文字を含まない単なる文字列である場合、管轄区域は問題なく表示されます。

これに対する簡単な解決策はありますか?

4

2 に答える 2

0

データベース構造が間違っています。

国が他の列のフィールドである 1 つのテーブルである必要があります。

したがって、コードは次のようにする必要があります

if (isset($_GET['sel_subj'] )){
  $query = "SELECT * FROM documents WHERE country = ?";
  $stmt  = $mysqli->prepare($query) or trigger_error($mysqli->error);
  $stmt->bind_param('s',$_GET['sel_subj']);
  $stmt->execute();
  $res = $stmt->get_result();
  while ($subject = mysqli_fetch_array($res)) {
      echo "<li";
      echo "><a href=\"index.php?sel_page=" . urlencode($subject["muni_name"]);
      echo "&sel_subj=" . urlencode($sel_subj). "\">
      {$subject["muni_name"]}</a></li>";
    }
}
于 2013-05-30T13:36:39.210 に答える
-1

郡名にそのような文字が含まれている場合は、郡名をラップする必要があります。ただし、入力をサニタイズする必要もあります。

$query2 = "SELECT * FROM `".mysqli_real_escape_string ($sel_subj)."`";

編集:

また、 SQL インジェクションを回避するために、準備済みステートメントを調べる必要があります。

定義できるテーブル名を郡情報を含むも​​のに制限することで、入力をさらにサニタイズする必要があります。

于 2013-05-30T14:07:47.180 に答える