0

私のウェブサイト検索機能についてあなたの助けが必要です。私は、ユーザーが特定の基準または基準の組み合わせに基づいて他の登録ユーザーを検索できるメンバーエリアを開発しています。

私の問題は、検索基準の各組み合わせのニーズに合わせて動的mysqlクエリを構築する方法です。ここで、基準の数は可変です。

通常、私はを使用して事前に決定された基準のセットで書くことができます

   WHERE param1 = '$param1'
   AND param2 = '$param2'
   AND param3 = '$param3'

この問題を解決するにはどうすればよいですか?

4

7 に答える 7

2

問題が、ユーザーがどの基準を選択するかわからないが、「空白」の基準の結果を返したいということである場合は、次を使用できます。

$criteria_1 = $_POST['criteria_1'];
$criteria_2 = $_POST['criteria_2'];
$criteria_3 = $_POST['criteria_3'];

if(!$criteria_1 && !$criteria_2 && !$criteria_1) {

     echo "You must select at least one criteria!";

} else {

   // Run query mentioned below and return results.       

} 

クエリは次のようになります。

SELECT * from mytable
WHERE
(criteria1 = '$criteria_1' OR '$criteria_1' = '') AND
(criteria2 = '$criteria_2' OR '$criteria_2' = '') AND
(criteria3 = '$criteria_3' OR '$criteria_3' = '')

これにより、空白の (選択されていない) パラメータは空白として扱われ、無視されます。上記では、条件が指定されていない場合、すべての結果が返されることに注意してください。

上記の別の書き方は次のとおりです。

SELECT * from mytable
WHERE
criteria1 IN ('$criteria_1', '') AND
criteria2 IN ('$criteria_2', '') AND
criteria3 IN ('$criteria_3', '')

繰り返しますが、すべての基準 1 の結果を返すためにエントリをまったく許可しません。

于 2012-04-30T21:45:56.143 に答える
1

これがあなたが求めているものの一般的な例です:

$query = "SELECT * FROM mytable";

if ($_POST['name'] == "Jack") {
   $query .= " WHERE name = 'Jack'";
}
if ($_POST['name'] == "Bob") {
   $query .= " WHERE name = 'Bob'";
}

if ($_POST['state'] != "") {
   $query .= " AND state = '" . mysql_real_escape_string($state) . "'";
}

//So now, in total, your query might look like this
//"SELECT * FROM mytable WHERE name = 'Bob' AND state = '$state'"    

$result = mysql_query($query);

$queryステートメントを使用して文字列に追加し、すべての変数ifをチェックしたらクエリを実行します。$_POST

于 2012-04-30T21:36:02.887 に答える
1

このようなクエリを見たことがあります。特定の列に値を入れたくない場合は、その列に NULL を渡します。

SELECT *
FROM users
WHERE param1 = :param1
UNION
SELECT *
FROM users
WHERE param2 = :param2
UNION
SELECT *
FROM users
WHERE param3 = :param3

これは、各列にインデックスが付けられ、ブール AND 検索を実行している (および PDO を使用している) ことを前提としています。

于 2012-04-30T21:50:54.800 に答える
0

スクリプト言語(php)を使用して入力をループします...

次に、次のような構造になります。

WHERE 1=1

次に、

AND paramx = '$px' 

それに...

于 2012-04-30T21:36:46.540 に答える
0
$criteria = array();

//Populate your criteria and parameter arrays with input from the web page here
...
// $criteria should now have stuff in it

$sql = "SELECT * FROM mytable ";//Or whatever your sql query is
$count = 0;
foreach ($criteria as $key => $parameter) {
  if ($count == 0) {
    $sql = $sql."WHERE ".$key." = ".$parameter;
  } else {
    $sql = $sql."AND ".$key." = ".$parameter;
  }
  $count++;
}

とはいえ、これはSQLインジェクション攻撃に対して非常に脆弱です。PHPPDOを使用してみてください

于 2012-04-30T21:40:07.073 に答える
0

オプションとして、php/aspまたはこのように操作しているものからクエリを作成することもできます。

$param1 = (isset($searchParam1) ? "param1 = $searchParam2" : "1");
$param2 = (isset($searchParam2) ? "param2 = $searchParam2" : "1");
$param3 = (isset($searchParam3) ? "param3 = $searchParam3" : "1");

クエリは次のようになります

SELECT ... WHERE $ param1 $ param2 $ param3

于 2012-04-30T21:40:45.337 に答える
0

このコードを共有して、PHP Thx で動的 mysql クエリを構築したいと思います。

$vocabulary = (($page == "vocabulary") ? "image_name <> ''" : ""); 
$groupcat = (($group != "") ? "group = $group" : ""); 

$var = array($vocabulary, $groupcat);   

$counter = "0";
$param = "";
for ($i=0;$i<count($var);$i++)
{
    if ($counter == "0" && $var[$i] != "" )     $param = "WHERE ";
    if ($counter > "0" && $var[$i] != "" ) $param = " AND ";

    if ($param  != "") 
    {
        $condition .= $param . $var[$i];
        $param="";
        $counter++;
    }
}   
echo "Condition : ". $condition;
于 2013-07-16T00:02:38.987 に答える