Php 如何在mysql中重用预置语句参数

Php 如何在mysql中重用预置语句参数,php,mysql,mysqli,Php,Mysql,Mysqli,我尝试使用一个(半)简单的MySQL查询(通过php mysqli扩展),但我不太明白如何做到这一点 我的问题看起来像 SELECT DISTINCT Col1 from `table1` where `col2`= ? and `col3`=? UNION SELECT DISTINCT Col1 from `table2` where `col2`=(?) and `col3`=(?) 我有两个表,我不想处理合并,我只想重用原来的两个准备好的“?”s。我知道在向表中插入值时,我可以为此做

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

我的问题看起来像

SELECT DISTINCT Col1 from `table1` where `col2`= ? and `col3`=? 
UNION SELECT DISTINCT Col1 from `table2` where `col2`=(?) and `col3`=(?)
我有两个表,我不想处理合并,我只想重用原来的两个准备好的“?”s。我知道在向表中插入值时,我可以为此做一些事情,但我在搜索文档方面的努力到目前为止证明是徒劳的

我能这样做吗?怎么做

更新 这是我的密码

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

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

下面是一个如何将参数绑定到查询的示例

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";
    }

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

"SELECT x FROM y WHERE name = :name and key = :key"
在PDO中,这将允许您在指定其类型后重新使用
:name
:key
。我不是在争论哪个更好,因为你可以在MySQLi中实现同样的效果

问题是MySQLi使得坚持“不要重复你自己(DRY)”的方法变得相当困难。(如果您喜欢干货,请考虑定制功能)

这就是为什么有些人更喜欢PDO而不是MySQLi,但也有一些很时髦的解决方法(比如自定义函数中的
call\u user\u func\u array


至于你的“效率”评论,重复这些变量真的没有什么区别。它将在MySQL API调用中参数化两次,但几乎不会显著影响性能。PDO在内部参数化而不使用MySQL(除非您明确地让它使用MySQL),MySQLi为它参数化MySQL API。

PHP代码是什么样子的?通常您只需保留
->prepare
d
$stmt
并使用
->execute()多次调用它
和不同的值。不过,我想在一个查询中指定相同的值两次。对于同一变量,另一种用法是
其中value>?-1和value<?+1