希望当我使用动态bind_param时,我有一个PHP的问题SELECT
这是我的PHP代码
$sql = 'SELECT ProductName, ProductId FROM Product WHERE 1=1'
if($produkname != ''){
$sql .= ' AND ProdukName Like ?';
}
if($produkcode != ''){
$sql .= ' AND Produkcode Like ?';
}
if($stmt = $mysqli->prepare($sql)){
$stmt->bind_param ('ss', $produkname, $produkcode)
$stmt->execute();
//else code
}
我不能bind_param如果一个$produkname
或$produkcode
值为空
你的情况,你可以构建WHERE
子句,使得它不需要动态参数。 使用布尔AND
条件,以验证该变量的值是<> ''
的SQL,而不是在PHP,因此,您可以在使用四个完成?
(每个变量绑定两次)和没有动态绑定。
$sql = "
SELECT ProductName, ProductId
FROM Product
WHERE 1=1
AND ((? <> '' AND ProdukName LIKE ?) OR ProdukName LIKE '%')
AND ((? <> '' AND Produkcode LIKE ?) OR Produkcode LIKE '%')
";
// Then bind each variable *twice*
if($stmt = $mysqli->prepare($sql)){
$stmt->bind_param ('ssss', $produkname, $produkname, $produkcode, $produkcode)
$stmt->execute();
//else code
}
这是如何工作:
AND ((? <> '' AND ProdukName LIKE ?) OR ProdukName LIKE '%')
这将创建一个条件,其中第一?
(由一个约束变量提供)如果<> ''
将使AND ProdukName Like ?
要还评价。 如果该变量是空的,在othre另一方面,这种表达的另一侧OR ProdukName LIKE '%'
将代替评估。 任何匹配ProdukName
值,所以基本上整个表达式被抵消。
你需要更多的条件:
$sql = 'SELECT ProductName, ProductId FROM Product WHERE ';
if($produkname !== ''){
$sql .= 'ProdukName Like ?'; $pdn = 1;
}
if($produkcode !== ''){
if(isset($pdn))$sql .= ' && ';
$sql .= 'Produkcode Like ?'; $pdc = 1;
}
if($stmt = $mysqli->prepare($sql)){
if(isset($pdn, $pdc)){
$stmt->bind_param('ss', $produkname, $produkcode);
}
elseif(isset($pdn)){
$stmt->bind_param('s', $produkname);
}
elseif(isset($pdc)){
$stmt->bind_param('s', $produkcode);
}
$stmt->execute();
}
你也可以利用call_user_func_array
与$stmt->bind_param
做这样的事情:
<?php
$sql = 'SELECT ProductName, ProductId FROM Product WHERE 1=1'
$types = '';
$params = array(&$types);
if($produkname != ''){
$sql .= ' AND ProdukName Like ?';
$types .= 's';
$params[] = $produkname;
}
if($produkcode != ''){
$sql .= ' AND Produkcode Like ?';
$types .= 's';
$params[] = $produkcode;
}
if($stmt = $mysqli->prepare($sql)){
if (!empty($types)) {
call_user_func_array(array($stmt, 'bind_param'), $params);
}
$stmt->execute();
//else code
}