【问题标题】:Building MySQL query with need for variable operators PHP PDO使用变量运算符 PHP PDO 构建 MySQL 查询
【发布时间】:2017-12-07 07:22:10
【问题描述】:

当我不知道要传递的值是否为 NULL 时,PHP PDO 数据库类中是否有任何标准或最佳方法可以将运算符从“=”更改为“IS”。这是我的意思的一个例子。

我有两个变量。我想要计算匹配的结果。有时,一个或两个变量可以为 NULL。但是 MySQL 需要不同的运算符来查找 NULL (IS 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 绑定值。查询返回正确的值计数。只是不确定是否有更好的做法。

【问题讨论】:

  • 这是使用 PDO 的最佳解决方案

标签: php mysql pdo null


【解决方案1】:

当你使用mysql时,你可以使用它的spaceship operator<=>

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

但总的来说,如果您需要变量运算符或其他查询部分,那么构建这样的条件查询是唯一的方法。

更通用的解决方案可以看我的文章How to create a WHERE clause for PDO dynamically

// 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();

所以在上述这些条件下,可以实现任何逻辑,包括操作员更改或任何事情。

【讨论】:

    猜你喜欢
    • 2017-12-24
    • 2020-07-31
    • 2016-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-10
    • 2013-03-25
    相关资源
    最近更新 更多