sql >> データベース >  >> RDS >> Mysql

フォーム送信が10f5フィールドに一致する可能性がある複数の変数選択をチェックするmysqlクエリを作成する方法

    私は個人的にMySQLクエリ文字列を実行するのがあまり得意ではありません。私は通常これに似たSQLコンパイラクラスを使用します(これは簡単なものであることに注意してください)。これにより、特に$_GETで必要なバインディングが可能になります。 あなたが持っているような値:

    class ItemQueue
        {
            protected   $sql;
            protected   $wherevals;
            public      $bind;
            public      $compiled;
    
            public function select($values = false)
                {
                    $this->sql[] = "select";
                    if($values == false)
                        $this->sql[]    =   "*";
                    else
                        $this->sql[]    =   $values;
    
                    return $this;
                }
    
            public function from($table = false)
                {
                    if($table ==false)
                        return $this;
    
                    $this->sql[] = "from `$table`";
    
                    return $this;
                }
    
             public function where($values = array(),$op = 'and')
                {
                    if(!empty($values)) {
                            $this->sql[]    =   'where';
                            foreach($values as $key => $values) {
                                    $this->wherevals[]      =   $key.' = :'.$key;
                                    // Bind values for injection protection
                                    $this->bind[":$key"]    =   $values;
                                }
    
                            $this->sql[]        =   implode(" $op ",$this->wherevals);
                            // This part is a bit jenky but you get the idea
                            $this->sql[]        =   "and active = '1'";
                        }
    
                    return $this;
                }
    
            public  function customsql($values = false)
                {
                    if($values != false) {
                            $this->sql[]    =   $values;
                        }
    
                    return $this;
                }
    
            public  function Fetch()
                {
                    // Implode entire sql statement
                    $this->compiled =   implode(" ", $this->sql);
    
                    return $this;
                }
        }
    
        // Post/Get values
        $_POST['cat']   =   'cattest';
        $_POST['city']  =   'Reno';
        $_POST['state'] =   'Nevada';
    
        // Arbitrary limits
        $limit          =   1;
        $limitvalue     =   1;
        // Create instance
        $tester =   new ItemQueue();
        // Just set some array filtering/validating
        if(isset($_POST['cat']) && !empty($_POST['cat']))
            $array['cat']   =   $_POST['cat'];
    
        if(isset($_POST['city']) && !empty($_POST['city']))
            $array['city']  =   $_POST['city'];
    
        if(isset($_POST['state']) && !empty($_POST['state']))
            $array['state'] =   $_POST['state'];
    
        // Make the query
        $query  =   $tester->select()->from("items")->where($array,"or")->customsql("ORDER BY item_id DESC LIMIT $limitvalue, $limit");
    
        // Here is the sql statement
        echo $query->Fetch()->compiled;
    
        // Bind array
        print_r($query->bind);
    

    あなたに:

    select * from `items` where cat = :cat or city = :city or state = :state and active = '1' ORDER BY item_id DESC LIMIT 1, 1
    
    Array
        (
            [:cat] => cattest
            [:city] => Reno
            [:state] => Nevada
        )
    

    注:これには、適切な接続を使用する必要があります(この場合、PDOが最適に機能します)。



    1. MariaDBでSHOWLOCALESを実行する方法

    2. 外部サーバーに参加/プッシュダウンする前にサブクエリの評価を強制する方法

    3. OracleDatabaseのネイティブ動的SQLの概要

    4. GROUPBYとORDERBYでMySQLの間違った結果