7

我有一个(半)简单的 MySQL 查询,我正在尝试使用(通过 php mysqli 扩展),但我不太清楚如何做到这一点。

我的查询看起来像

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

我有两个不想处理合并的表,我只想重用原来准备好的两个“?”。我知道在向表中插入值时我可以为此做一些事情,但迄今为止我在搜索文档方面的努力被证明是无用的。

我可以这样做吗,怎么做?

更新

这是我的代码

$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;

我知道我可以将相同的变量绑定两次,但这似乎效率很低。

4

2 回答 2

6

PDO 允许您专门命名参数,就像这样,但 MySQLi 不支持命名变量:

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

在 PDO 中,这将让您在指定它们的类型后:name重新使用。:key我不争论哪个更好,因为您可以在 MySQLi 中实现相同的目标。

问题是 MySQLi 很难坚持“不要重复自己 (DRY)”的方法。(如果您喜欢 DRY,请考虑自定义函数)。

这就是有些人更喜欢 PDO 而不是 MySQLi 的原因,但是有一些时髦的解决方法(例如call_user_func_array在自定义函数中等)。

至于您的“效率”评论,重复变量确实没有区别。它将在 MySQL API 调用中被参数化两次,但它几乎不会显着影响性能。PDO 在内部不使用 MySQL 进行参数化(除非您明确使其使用 MySQL),并且 MySQLi 为它进行 MySQL API 参数化。

于 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 回答