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

INディレクティブを使用して、準備されたステートメントで検索します

    準備する前にリストをステートメントに補間したため、準備されたステートメントにはパラメーターがありません。

    $array=array("item1","item2","item3","item4");
    //This is dynamically filled, this is just an example
    $in_list = "'".implode("','",$array)."'";//that's why i use implode
    
    $stmt = $this->db->prepare('SELECT libelle,activite,adresse,tel,lat,lng FROM etablissements where type IN ('.$in_list.')');
    

    この時点で、作成したSQLステートメントは次のとおりです。

    SELECT libelle,activite,adresse,tel,lat,lng 
    FROM etablissements where type IN ('item1','Item2','Item3','Item4')
    

    ステートメントにはパラメーターがないため、mysqli_stmt::bind_param 失敗します。アイテムをステートメントに補間する代わりに(インジェクションに対して脆弱です)、パラメーターの文字列を補間してから、値をバインドします(個別に保持する必要があります)。

    $array=array("item1","item2","item3","item4");
    
    if (count($in_list) > 0) {
        $query = $this->db->prepare('SELECT libelle,activite,adresse,tel,lat,lng FROM etablissements WHERE type IN (' . str_repeat('?, ', count($in_list)-1) . '?)');
    
        $args = $in_list;
        array_unshift($args, str_repeat('s', count($in_list)));
        call_user_func_array(array($query, 'bind_param'), $args);
        $query->execute();
        $query->bind_result($libelle,$activite,$adresse,$tel,$lat,$lng);
    }
    

    バインディングのためのPDOのインターフェースはより簡単です。

    $array=array("item1","item2","item3","item4");
    
    if (count($in_list) > 0) {
        $query = $this->db->prepare('SELECT libelle,activite,adresse,tel,lat,lng FROM etablissements WHERE type IN (' . str_repeat('?, ', count($in_list)-1) . '?)');
    
        foreach ($in_list as $i => $arg) {
            // query params are 1-based, so add 1 to the index
            // PDO::PARAM_STR is the default type, so no need to pass 3rd arg
            $query->bindValue($i+1, $arg);
        }
        $query->execute();
        // no need to bind the result
    }
    

    実際、 PDOStatement::executeであるため、PDOを使用するとさらに簡単になります。 パラメータ値のリストを取得できます:

    $array=array("item1","item2","item3","item4");
    
    if (count($in_list) > 0) {
        $query = $this->db->prepare('SELECT libelle,activite,adresse,tel,lat,lng FROM etablissements WHERE type IN (' . str_repeat('?, ', count($in_list)-1) . '?)');
    
        $query->execute($in_list);
    }
    



    1. SQLServerのSTATISTICSXMLとは何ですか?

    2. 読み取り/書き込みモードでデータベースを開くことができません

    3. プロシージャ内で別のPL/SQLプロシージャを呼び出す

    4. AmazonECSとAmazonFargateの使用を開始する方法