构建MySQL查询,需要可变操作员PHP PDO



php PDO数据库类中是否有任何标准或最佳方法可以将操作员从" ="更改为",而我不知道我是否要通过的值是否为无效。这是我的意思的示例。

我有两个变量。我想要匹配结果的计数。有时,一个或两个变量可能为null。但是mySQL需要其他操作员才能找到空(为null)。

我目前只是为操作员创建另一个变量,当我构建查询时,我会将其注入:

  // First create a variable "=" or "is" depending on whether var1 and var2 are NULL or not
  if($var1 == NULL) $var1_operator = "IS";
  else $var1_operator = "=";
  if($var2 == NULL) $var2_operator = "IS";
  else $var2_operator = "=";
  // Build the query
  $query = 'SELECT count(*) as count FROM table 
  WHERE var1 '.$var1_operator.' :var1 AND var2 '.$var2_operator.' :var2';
  //  Conduct the query
  $prepare = $db_connection->prepare($query);
  $prepare->bindValue(':var1', $var1, PDO::PARAM_STR);
  $prepare->bindValue(':var2', $var2, PDO::PARAM_STR);
  $prepare->execute();
  $results = $prepare->fetch();

还有另一种方法吗?即使值为null而不是真正的字符串,这也可以使用param_str bindvalue。查询返回正确的值计数。只是不确定是否有更好的练习。

在使用mysql时,您可以使用其太空飞船操作员<=>

$query = 'SELECT count(*) FROM table WHERE var1 <=> ? AND var2 <=> ?';
$prepare = $db_connection->prepare($query);
$prepare->execute([$var1, $var2]);
$count = $prepare->fetchColumn();

,但通常,如果您需要可变操作员或其他查询零件,则有条件的查询建筑是唯一的方法。

在我的文章中可以找到一个更广泛的解决方案,如何动态创建pdo的Where子句:

// always initialize a variable before use!
$conditions = [];
$parameters = [];
// conditional statements
if (!empty($_GET['name']))
{
    // here we are using LIKE with wildcard search
    // use it ONLY if really need it
    $conditions[] = 'name LIKE ?';
    $parameters[] = '%'.$_GET['name']."%";
}
if (!empty($_GET['sex']))
{
    // here we are using equality
    $conditions[] = 'sex = ?';
    $parameters[] = $_GET['sex'];
}
if (!empty($_GET['car']))
{
    // here we are using not equality
    $conditions[] = 'car != ?';
    $parameters[] = $_GET['car'];
}
// the main query
$sql = "SELECT * FROM users";
// a smart code to add all conditions, if any
if ($conditions)
{
    $sql .= " WHERE ".implode(" AND ", $conditions);
}
// the usual prepare/execute/fetch routine
$stmt = $pdo->prepare($sql);
$stmt->execute($parameters);
$data = $stmt->fetchAll();

因此,在这些条件下,都可以实现任何逻辑,包括操作员更改或任何内容。

相关内容

  • 没有找到相关文章

最新更新