7

どうすればこれができるかわかりません。基本的に、コンボボックスで入力され、where 句を介して MQSQL クエリのフィルターを形成するために渡される変数があります。私がする必要があるのは、ユーザーがコンボ ボックスを空のままにし、その変数を where 句で無視できるようにすることです。これは可能ですか?

つまり、このコードから。$value1 を入力するコンボボックスが空のままであると仮定すると、これを無視して 2 番目のフィルターのみを適用する方法はありますか?

$query = "SELECT * FROM moth_sightings WHERE user_id = '$username' AND location = '$value1' AND english_name = $value2 ";
$result = mysql_query($query) or die(mysql_error());
$r = mysql_numrows($result);

助けてくれてありがとう。ハ

4

7 に答える 7

17

使用する

$where = "WHERE user_id = '$username'";

if(!empty($value1)){
$where .= "and location = '$value1'";
}

if(!empty($value2 )){
$where .= "and english_name= '$value2 '";
}


$query = "SELECT * FROM moth_sightings $where";
$result = mysql_query($query) or die(mysql_error());
$r = mysql_numrows($result);
于 2012-09-09T13:52:04.030 に答える
0

これを解決するために、他に 2 つの方法を考えました。

SELECT * FROM moth_sightings
WHERE
      user_id = '$username'
      AND location = '%$value1%'

      AND english_name = $value2 ";

これはuser_id、場所フィールドに が含まれる、この のみの結果を返します$value1$value1 が empty の場合、これは空白であろうとなかろうと、これに対するすべての行を返しますuser_id


また

SELECT * FROM moth_sightings
WHERE
      user_id = '$username'
      AND (location = '$value1' OR location IS NULL OR location = '')
      AND english_name = $value2 ";

これにより、場所または空の値user_idを持つすべての行が得られます。$value1

于 2012-10-07T19:14:40.767 に答える
0

もちろん、

$sql = "";
if(!empty($value1))
  $sql = "AND location = '{$value1}' ";
if(!empty($value2))
  $sql .= "AND english_name = '{$value2}'";

$query = "SELECT * FROM moth_sightings WHERE user_id = '$username' {$sql} ";
$result = mysql_query($query) or die(mysql_error());
$r = mysql_numrows($result);

SQL インジェクションと mysql_* の非推奨に注意してください。代わりに mysqli または PDO を使用してください

于 2012-09-09T13:49:07.883 に答える
0
if ( isset($value1) )
 $query = "SELECT * FROM moth_sightings WHERE user_id = '$username' AND location = '$value1' AND english_name = $value2 ";
else
 $query = "SELECT * FROM moth_sightings WHERE user_id = '$username' AND english_name = $value2 ";   

ただし、入力に基づいてクエリを返す関数を作成することもできます。$valuesまた、クエリを生成する前にyour をエスケープすることも忘れないでください。

于 2012-09-09T13:49:37.633 に答える
0

1.) 単純な mysql php 拡張機能を使用しないでください。高度な mysqli 拡張機能またはより安全な PDO / MDB2 ラッパーのいずれかを使用してください。

2.)そのような完全なステートメントを指定しないでください(それ以外は、指定された値をエンコードしてエスケープすることさえしません...)。代わりに、次のようなものを使用します。

sprintf("SELECT * FROM moth_sightings WHERE 1=1 AND %s", ...);

次に、フォームから実際に取得したすべての値を保持する配列を使用して、生のクエリを入力します。

$clause=array(
  'user_id="'.$username.'"',
  'location="'.$value1.'"',
  'english_name="'.$value2.'"'
);

この配列は、空の値などをテストするなど、任意の方法で操作できます。ここで、配列を内破して、上記の生の質問を完成させます。

sprintf("SELECT * FROM moth_sightings WHERE 1=1 AND %s", 
        implode(' AND ', $clause) );

大きな利点: 句配列が完全に空であっても、クエリ構文は有効です。

于 2012-09-09T13:53:00.207 に答える
0

まず、 SQL インジェクションについてお読みください。次に、$r = mysql_numrows($result) は $r = mysql_num_rows($result); である必要があります。

次のように、MySQL で IF を使用できます。

SELECT * FROM moth_sightings WHERE user_id = '$username' AND IF('$value1'!='',location = '$value1',1) AND IF('$value2'!='',english_name = '$value2',1); -- BUT PLEASE READ ABOUT SQL Injections. Your code is not safe.
于 2012-09-09T13:53:33.287 に答える