如果条件查询,则动态$ stmt-> bind_param()

时间:2015-01-13 00:52:49

标签: php mysqli

当我使用SELECT

时想要bind_param时,我遇到了php问题

这是我的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

3 个答案:

答案 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 
    }