1

ページで取得した検索機能の MySQL ロジックを考え出そうとしています。ユーザーが検索基準を入力することを選択できるシンプルなフォームです。条件は、mysql ロジックを生成する関数に引数として送信されます。これは、PHP コントローラー ファイル内の内容です。

   case 'search':
         if((empty($_POST['username'])) && (empty($_POST['firstname'])) && (empty($_POST['lastname']))
                && (empty($_POSt['agemin'])) && (empty($_POST['agemax'])) && (empty($_POST['country']))){
                $members = get_all_username();
         } else {
            if(isset($_POST['username'])){
                $otheruser = $_POST['username'];
            } else { $otheruser = null; }
            if(isset($_POST['agemin'])){
                $ageMin = $_POST['agemin'];
            } else { $ageMin = null; }
            if(isset($_POST['agemax'])){
                $ageMax = $_POST['agemax'];
            } else { $ageMax = null; }
            if(isset($_POST['country'])){
                $country = $_POST['country'];
            } else { $country = null; }
            //if(isset($_POST['isonline']))

        $members = search_members($otheruser, $ageMin, $ageMax, $country);
        }
        include('displaySearch.php');
        break;

したがって、何も設定されていない場合、すべてのメンバーの完全なリストが生成されて表示されます。これは、入力のいずれかが設定されている場合に呼び出される関数です。

function search_members($username, $ageMin, $ageMax, $country){
    global $db;
    $query = "SELECT username FROM profiles WHERE username = :username 
        AND age > :ageMin AND age < :ageMax AND country = :country";
    $statement = $db->prepare($query);
    $statement->bindValue(':username', $username); $statement->bindValue(':ageMin', $ageMin);
    $statement->bindValue(':ageMax', $ageMax); $statement->bindValue(':country', $country);
    $statement->execute();
    if($statement->rowCount() >= 1){
        return $statement->fetchAll();
    } else {
        return false;
    }
}

mysql のロジックは明らかに間違っています。PHP 変数の値をチェックする一連の条件 (可能であれば MySQL ロジック内) が必要です。値が存在しない場合は、データベースのクエリ時に考慮されるべきではありません。そのため、ユーザー名のみがフォームに設定されている場合、他の変数は SQL ロジックに含めるべきではありません。

MySQL IF() 条件を調べましたが、必要なことを実行する適切なコードをまだ見つけることができません。誰かが私を正しい方向に向けることができれば、残りは自分でできるでしょう。この種の問題を解決するための他のアプローチも大歓迎です。

4

1 に答える 1

0

私があなたの問題を理解している場合、簡単な方法は if else を使用して SQL クエリを作成することです。たとえば、

$sql = "SELECT username FROM profiles WHERE 1 "
if (!is_null($username)) {
    $sql .= " AND username = :username ";
}
// All other checks
于 2012-09-19T16:48:04.760 に答える