7

(php mysqli拡張機能を介して)使用しようとしている(半)単純なMySQLクエリがありますが、これを行う方法を完全に理解することはできません。

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

SELECT DISTINCT Col1 from `table1` where `col2`= ? and `col3`=? 
UNION SELECT DISTINCT Col1 from `table2` where `col2`=(?) and `col3`=(?)

マージを処理したくないテーブルが2つあり、元の2つの準備された「?」を再利用したいだけです。テーブルに値を挿入するときにこれに対してできることがあることは知っていますが、ドキュメントを検索するための私の努力はこれまでのところ役に立たないことが証明されています。

私はこれを行うことができますか、そしてどのように?

アップデート

これが私のコードです

$query='SELECT DISTINCT enginesizecc FROM `table1`  where year=? and vehicle_make= ? as UNION SELECT DISTINCT enginesizecc from `table2` WHERE year=(?) AND vehicle_make =(?)';     
$stmt=$sql->prepare($query);
echo $sql->error; //I'm in debug mode
$blank='';
if(array_key_exists('year', $_POST)){
    if(array_key_exists('make', $_POST)){
        $stmt->bind_param('ss', $_POST['year'], $_POST['make']);
    }
    else $stmt->bind_param('ss', $_POST['year'], $blank);
}
elseif(array_key_exists('make', $_POST)){
    $stmt->bind_param('ss', $blank, $_POST['make']);
}
else{
    //if(array_key_exists('model', $_POST)) $stmt->bind_param('sss', $blank, $blank);
    $stmt->bind_param('ss', $blank, $blank);
}
$stmt->execute();
$modelItem='';
$stmt->bind_result($modelItem);
$models=array();
while($stmt->fetch()){      
    $models[]=$modelItem;
}
sort($models);
return $models;

同じ変数を2回バインドできることは知っていますが、それはかなり非効率的なようです。

4

2 に答える 2

6

PDOでは、このようにパラメータに具体的に名前を付けることができますが、MySQLiは名前付き変数をサポートしていません。

"SELECT x FROM y WHERE name = :name and key = :key"

PDOでは、これにより、タイプを指定した後、:name再利用できます。:keyMySQLiでも同じことができるので、どちらが良いかについては議論していません。

重要なのは、MySQLiでは、「Do n't Repeat Yourself(DRY)」の方法論に固執するのがかなり難しいということです。(DRYが好きな場合は、カスタム関数を検討してください)。

これが、MySQLiよりもPDOを好む人がいる理由ですが、いくつかのファンキーな回避策があります(call_user_func_arrayカスタム関数など)。

そして、あなたの「効率」コメントに関しては、変数を繰り返すことは実際には違いはありません。MySQL API呼び出しで2回パラメーター化されますが、パフォーマンスに大きな影響を与えることはほとんどありません。PDOはMySQLを使用せずに内部的にパラメーター化され(明示的にMySQLを使用させない限り)、MySQLiはMySQLAPIをパラメーター化させます。

于 2013-02-21T22:23:40.337 に答える
-2

パラメータをクエリにバインドする方法の例を次に示します。

global  $dbconnection;

    $sql = "INSERT INTO Sales(order_id,client_id,sale_date,status) VALUES (?,?,?,?)";

    if ($stmt = $dbconnection->prepare($sql)) 
    {   
        /* Bind our params */ 
            $stmt->bind_param('iisi',$order_id,$client_id,$today,$status);  
        $stmt->execute();  
        $stmt->close();
    }
    else
    {
        print "ERROR";
    }
于 2013-02-21T22:04:37.003 に答える