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

2019-10-21 14:50发布

希望当我使用动态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值为空

Answer 1:

你的情况,你可以构建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值,所以基本上整个表达式被抵消。



Answer 2:

你需要更多的条件:

$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(); 
}


Answer 3:

你也可以利用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 
    }


文章来源: $stmt->bind_param() dynamically if condition query
标签: php mysqli