0

3 つの列を持つ MySQL データベースがあります。

id  |  articletitle  | articleorganization

そして、2 つのフィールドと送信ボタンを備えた単純な PHP フォーム: 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="title" type="text" id="articletitle" size="50" /></td>
    </tr>
    <tr>
      <td align="right">Author or Organization:</td>
      <td align="left"><input name="organization" 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');

$title = mysql_real_escape_string($_POST['title']);
$organization = mysql_real_escape_string($_POST['organization']);

$sql = "SELECT * FROM articles WHERE 1 "
     . (isset($title) ? "AND articletitle LIKE '$title%' " : "")
     . (isset($organization) ? "AND articleorganization LIKE '$organization%'" : "");

while ($row = mysql_query($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/>';
    }

?>

コメンターの助けを借りて修正した後、問題は変わりました。

ここで、検索を送信すると、結果ページは searchdb.php によって作成されたテーブルを何度もスクロールし始めますが、テーブルには結果がありません。

4

3 に答える 3

1

クエリをエコーすると、次のように出力されます。

select * from articles where articletitle like '%%'

そのため、コードがテーブルからすべての行を返します。<input>希望どおりに機能させるには、列と一致するように名前を変更します。

<input type="text" name="title" />
<input type="text" name="organization" />

これらのタグを指定すると、次の$_POSTような配列が含まれます。

Array
(
  [title] => 'some value',
  [organization] => 'another value',
)

また、クエリでいくつかのロジックを実行する必要があります。だけtitleが供給された場合、

SELECT * FROM articles WHERE articletitle LIKE '%$title%'

だけorganizationが供給された場合、

SELECT * FROM articles WHERE articleorganization LIKE '%$organization%'

両方が提供されている場合は、

SELECT * FROM articles
WHERE articletitle LIKE '%$title%' AND 
      articleorganization LIKE '%$organization%'

上記のような SQL を作成する PHP は次のとおりです。

// Don't forget to properly escape your input
$title = mysql_real_escape_string($_POST['title']);
$organization = mysql_real_escape_string($_POST['organization']);

// Build the SQL
// Echo this string to make sure the SQL is correct
$sql = "SELECT * FROM articles WHERE 1 "
     . (strlen($title) ? "AND articletitle LIKE '%$title%' " : "")
     . (strlen($organization) ? "AND articleorganization LIKE '%$organization%'" : "");

$qry = mysql_query($sql);
于 2012-06-14T02:35:42.290 に答える
1

基本的に、ある種の配列を参照する同じ名前のアイテムがいくつかある場合、後で取得するのは実際の配列です。

つまり、入力ボックスが「a」と「b」で満たされている場合、変数$_POST['term']は に等しくなりarray("a", "b")ます。

インデントに関しては、コード スタイルの一部です。コード ベース全体で一貫している限り、快適に感じられる方法で行ってください。

編集:ユーザー入力とそのデータをクエリに追加する方法にもっと注意する必要があるという他の人に同意します

于 2012-06-14T02:10:14.260 に答える
0

$_POST[term] は、キーが 0,1 のような配列になります。SQL クエリのフィールド参照を失う。

入力フィールドで次の名前を使用します。

<input name="articletitle" type="text" id="articletitle" size="50" />
<input name="articleorganization" type="text" id="articleorganization" size="50" />

次のようにクエリを作成できます。

$sql = mysql_query("select * from articles WHERE articletitle LIKE '%".mysql_real_escape_string($_POST['articletitle'])."%' OR articleorganization LIKE '%".mysql_real_escape_string($_POST['articleorganization'])."%'");

注: mysql インジェクションを防ぐために、最初にエスケープせずにクエリで $_POST (ユーザー入力) 変数を使用しないでください。

PS インデントに関する私の個人的な好みは、一致する HTML 要素のすべてのブロックを常にインデントすることです。そうです、テーブルを 1 タブさらにインデントします。

于 2012-06-14T02:46:34.810 に答える