2

PHP を使用して MySQL データベースを検索するフォームがあります。現在、ユーザーが 2 つのフィールドのいずれかに検索を入力すると、データベースの内容全体が表示されます。また、ユーザーが両方のフィールドを空白のままにすると、データベースの内容全体が表示されます。

ただし、ユーザーが両方のフィールドにランダムな情報を入力すると、結果ページは空白になります。

このフォームの想定される使用法は、ユーザーが記事のタイトル、記事の著者または組織、または記事のタイトルその著者または組織に基づいて、フィールドの 1 つまたは両方に入力して記事を検索できることです。

私が理解しようとしているのは次のとおりです。

結果ページにすべてのデータベース コンテンツが表示され続ける理由。

コーディング エラーによって単にダンプされるのではなく、データベースが実際にクエリされていることを確認する方法。

コードは以下のとおりです。

search.php:

<div class="content">
    <form id="form1" name="form1" method="post" action="searchdb.php">
        <table width="100%" border="0" cellpadding="6">
            <tr>
              <td width="29%" align="right">Article Title:</td>
              <td width="71%" align="left"><input name="articletitle" type="text" id="articletitle" size="50" /></td>
            </tr>
            <tr>
              <td align="right">Author or Organization:</td>
              <td align="left"><input name="articleorganization" type="text" id="articleorganization" size="50" /></td>
            </tr>
        </table>


        <table width="100%" border="0" cellpadding="6">
          <tr>
            <td><input type="submit" name="submit" value="Submit" /></td>
          </tr>
        </table>
    </form>
</div>

searchdb.php

<?php

include('settings.php');
$query = "select * from articles";
$where = array();
if (!empty($_POST['articletitle'])) {
   $where[] = "articletitle LIKE '%".mysql_real_escape_string($_POST['articletitle'])."%'";
}
    if (!empty($_POST['articleorganization'])) {
       $where[] = "articleorganization LIKE  '%".mysql_real_escape_string($_POST['articleorganization'])."%'";
}
    if (!empty($where)) {
        $query .= " WHERE " . implode(" OR ", $where);
        $sql = mysql_query($query);
    } else {
        // No results
}
while ($row = mysql_fetch_array($sql)){
    echo '<br/> Article Title: '.$row['articletitle'];
    echo '<br/> Article Organization: '.$row['articleorganization'];
    echo '<td><a href="edit.php?id=' . $row['id'] . '">Edit</a></td>';
    echo '<td><a href="delete.php?id=' . $row['id'] . '">Delete</a></td>';
    echo '<td><a href="entry.php?id=' . $row['id'] . '">View Full Entry</a></td>';
    echo '<br/><br/>';
}

?>
4

3 に答える 3

3

両方が空白の場合、クエリは次のように述べています。

WHERE field LIKE '%%'

すべてにマッチします。

ORを使用して where 句を結合しているため、いずれかが空白の場合も同じことが起こります。

入力が空白でないことを確認することで、これを防ぐことができます。

<?php
if (!((empty($_POST['field1']) || empty($_POST['field2']))) {
  //run your query
}
于 2012-06-14T05:47:43.123 に答える
2

@sberry の投稿に続きます。

if (isset($_POST['articletitle']) && $_POST['articletitle'] != "")

変数は設定できますが、空の文字列のままです。

@xbonez が使用する方法は、次のように単純です。

if (!empty($_POST['articletitle']))2 つのテストが必要な上記の例と同じです。

xbonezメソッドは試しましたか?

完了するには、少なくとも 1 つのフィールドが入力されていることを確認します。

if (!empty($_POST['articletitle']) || !empty($_POST['articleorganization'])) {
   $query = "SELECT * from `articles` WHERE ";

   $query .= "`articletitle` LIKE '%" . mysql_real_escape_string($_POST['articletitle']) . "%' ";

   $query .= "OR `articleorganization` LIKE '%" . mysql_real_escape_string($_POST['articleorganization']) . "%'";

    $sql = mysql_query($query);

} else {
    // No results
}

フィールドの 1 つが次のように入力されている場合にのみ使用されるもの:

$query = "SELECT * from `articles` WHERE ";

if() ステートメント内に配置されます。そうしないと、不必要に解析されます。

配列を作成してから文字列に変換する必要はありません。".=" は、文字列フラグメントを最終的なクエリ文字列に連結します。

個人的な好みの問題:
MySql キーワードはフル キャップで記述されているため、ステートメントが読みやすくなります。
それについては多くの議論があります。
sql 大文字のキーワード スタイル」を検索します。

テーブル名とフィールド名をバッククォートで囲む: テーブル
名またはフィールド名に予約済みのキーワード (カウント、ケース、デフォルト、div、インデックス、キー、リミット、オプション、オーダーなど) を使用できます。
mysql パーサーの作業を軽減します。予約語の競合があるかどうかをチェックする必要はありません。
テーブルまたはフィールド名が将来予約済みキーワードになった場合の問題を回避します。

繰り返しますが、多くの議論。「 mysql バックティック」を検索します。

MySQL ドキュメント:
9.3。予約語

9.2. スキーマ オブジェクト名
このページで「引用された識別子」を探します。
また、将来別のデータベース アプリに移行する可能性がある場合は、バッククォートの代わりに二重引用符を使用できます。「ANSI_QUOTES」を探してください。

9.2.4. 関数名の解析と解決
このページで「引用された識別子」を探します。

于 2012-06-14T06:31:44.877 に答える
1

これをテストしましたが、まさにあなたが望むことをするはずです。

$query = "select * from articles";
$where = array();
if (!empty($_POST['articletitle'])) {
   $where[] = "articletitle LIKE '%".mysql_real_escape_string($_POST['articletitle'])."%'";
}
if (!empty($_POST['articleorganization'])) {
   $where[] = "articleorganization LIKE '%".mysql_real_escape_string($_POST['articleorganization'])."%'";
}
if (!empty($where)) {
    $query .= " WHERE " . implode(" OR ", $where);
    $sql = mysql_query($query);
} else {
    // No results
}

編集
フォームが空の値を渡しているように見えるので、 check の代わりにissetcheck !empty. 上記のコードを更新しました。

于 2012-06-14T05:52:18.377 に答える