0

関数に多数の値を渡し、SQL クエリを作成してデータベース内のこれらの値を検索したいと考えています。

これに対する入力はドロップダウン ボックスです。これは、ワイルドカードとして作成したい入力が ALL または * である可能性があることを意味します。

問題は、次のことができないことです。

$result = mysql_query("SELECT * FROM table WHERE something1='$something1' AND something2='*'") or die(mysql_error());

開始しましたが、それを機能させるための論理ループがわかりません。これは私がこれまでに持っているものです:

public function search($something1, $something2, $something3, $something4, $something5) {

    //create query
    $query = "SELECT * FROM users";

    if ($something1== null and $something2== null and $something3== null and $something4== null and $something5== null) {
        //search all users
        break 
    } else  {

        //append where
         $query = $query . " WHERE "; 

                if ($something1!= null) {
                    $query = $query . "something1='$something1'"
                }
                if ($something2!= null) {
                    $query = $query . "something2='$something2'"
                }
                if ($something3!= null) {
                    $query = $query . "something3='$something3'"
                }
                if ($something4!= null) {
                    $query = $query . "something4='$something4'"
                }
                if ($something5!= null) {
                    $query = $query . "something5='$something5'"
                }

    $uuid = uniqid('', true);

    $result = mysql_query($query) or die(mysql_error());
}

これの問題は、順番にしか機能しないことです。たとえば、something3 を最初に入力すると、正しい場所に AND が追加されません。

どんな助けでも大歓迎です。

4

3 に答える 3

0

私はこのようなことをします

criteria = null
if ($something1!= null) {
      if($criteria != null)
      {
          $criteria = $criteria . " AND something1='$something1'"
      }
      else
      {
           $criteria = $criteria . " something1='$something1'"
      }
}
   ... other criteria


$query = $query . $criteria
于 2012-11-28T18:10:01.910 に答える
0

WHERE 句を動的に作成する例を次に示します。また、PDO とクエリ パラメータの使用も示しています。非推奨のmysqlAPI の使用をやめて、PDO の使用を開始する必要があります。

public function search($something1, $something2, $something3, $something4, $something5)
{
    $terms = array();
    $values = array();

    if (isset($something1)) {
       $terms[] = "something1 = ?";
       $values[] = $something1;
    }

    if (isset($something2)) {
       $terms[] = "something2 = ?";
       $values[] = $something2;
    }

    if (isset($something3)) {
       $terms[] = "something3 = ?";
       $values[] = $something3;
    }

    if (isset($something4)) {
       $terms[] = "something4 = ?";
       $values[] = $something4;
    }

    if (isset($something5)) {
       $terms[] = "something5 = ?";
       $values[] = $something5;
    }

    $query = "SELECT * FROM users ";

    if ($terms) {
        $query .= " WHERE " . join(" AND ", $terms);
    }

    if (defined('DEBUG') && DEBUG==1) {
      print $query . "\n";
      print_r($values);
      exit();
    }

    $stmt = $pdo->prepare($query);
    if ($stmt === false) { die(print_r($pdo->errorInfo(), true)); }

    $status = $stmt->execute($values);
    if ($status === false) { die(print_r($stmt->errorInfo(), true)); }
}

上記をテストしましたが、動作します。関数の 5 つの引数のいずれかに null 以外の値を渡すと、null 以外の用語に対してのみ WHERE 句が作成されます。

テスト:

define('DEBUG', 1);
search('one', 'two', null, null, 'five');

このテストの出力は次のとおりです。

SELECT * FROM users  WHERE something1 = ? AND something2 = ? AND something5 = ?
Array
(
    [0] => one
    [1] => two
    [2] => five
)

これをより動的にする必要がある場合は、個々の引数の代わりに配列を関数に渡します。

于 2012-11-28T18:14:59.457 に答える
0

配列で試してください。

 function search($somethings){

     $query = "SELECT * FROM users";           
     $filters = '';
     if(is_array($somethings)){

        $i = 0;
        foreach($somethings as $key => $value){
           $filters .= ($i > 0) ? " AND $key = '$value' " : " $key = '$value'";
           $i++;
        }
     }
     $uuid = uniqid('', true);
     $query .= $filters;
     $result = mysql_query($query) or die(mysql_error());
 }

 // demo
 $som = array(
      "something1" => "value1",
      "something2" => "value2"
 ); 

 search( $som );
于 2012-11-28T18:20:36.233 に答える