当我使用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
}
如果$produkname
或$produkcode
值之一为空,则无法bind_param
答案 0 :(得分:0)
在您的情况下,您可以构造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 ?
(由绑定变量提供)的条件。如果变量为空,那么另一方面,将对此表达式OR ProdukName LIKE '%'
的另一侧进行评估。匹配任何 ProdukName
值,因此基本上整个表达式都被取消了。
答案 1 :(得分:0)
您需要更多条件:
$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();
}
答案 2 :(得分:0)
您还可以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
}