📜  php 从数组构建查询 - PHP (1)

📅  最后修改于: 2023-12-03 15:33:36.677000             🧑  作者: Mango

PHP 从数组构建查询

在 PHP 当中,我们通常使用 SQL 语句来查询数据库。但是,有时候我们需要根据一些特定的条件来构建查询,而这些条件可能是不确定的,难以直接在 SQL 语句中使用。这时候,从 PHP 数组构建查询就成为了一个很好的解决方案。

使用数组构建查询

PHP 提供了一种方便的方式来使用数组构建查询:我们可以使用一个数组来表示查询条件。这个数组的格式可以非常灵活,例如:

$query = [
    'table' => 'users',
    'conditions' => [
        'name' => 'John',
        'age >' => 25,
        'gender' => ['male', 'female'],
        'city !=' => null,
        'email LIKE' => '%@example.com',
    ],
    'fields' => ['name', 'age'],
    'limit' => 10,
    'order' => 'age DESC',
];

这个数组包含了一个查询所需要的所有条件:

  • table 表示要查询的表名;
  • conditions 是一个关联数组,表示各种查询条件;
  • fields 表示要获取的字段名;
  • limit 表示查询结果的最大数量;
  • order 表示查询结果的排序方式。

需要注意的是,conditions 数组中每个元素的格式也非常灵活:

  • 如果键名是一个字符串,表示查询条件的字段名,键值是一个标量,表示查询条件的值;
  • 如果键名是一个字符串,并且以一个空格和大于号(" >")结尾,表示查询条件为大于指定值;
  • 如果键名是一个字符串,并且以一个空格和小于号(" <")结尾,表示查询条件为小于指定值;
  • 如果键名是一个字符串,并且以一个空格和等于号(" =")结尾,表示查询条件为等于指定值;
  • 如果键名是一个字符串,并且以一个空格和不等于号(" !=")结尾,表示查询条件为不等于指定值;
  • 如果键名是一个字符串,并且以一个空格和 LIKE 运算符结尾(例如 " LIKE"),表示查询条件为匹配指定字符串。
构建 SQL 查询语句

有了上面的数组,我们就可以方便地构建 SQL 查询语句了。下面是一个使用上面的数组构建查询语句的例子:

$sql = "SELECT " . implode(",", $query['fields'])
    . " FROM " . $query['table']
    . " WHERE " . buildConditions($query['conditions'])
    . " ORDER BY " . $query['order']
    . " LIMIT " . $query['limit'];

在上面的语句中,我们使用了一个 buildConditions 函数来将查询条件数组转换为 SQL 查询语句的 WHERE 子句。这个函数的实现可以相当复杂,因为它需要处理各种不同的查询条件。下面是一个简单的实现,仅供参考:

function buildConditions($conditions)
{
    $parts = [];
    foreach ($conditions as $field => $value) {
        if (is_scalar($value)) {
            $parts[] = "$field = " . sqlValue($value);
        } elseif (is_array($value)) {
            $valueList = implode(",", array_map("sqlValue", $value));
            $parts[] = "$field IN ($valueList)";
        } elseif (preg_match("/^(.*) (>|<|!=) /", $field, $matches)) {
            $op = $matches[1];
            $field = substr($field, strlen($op) + 2);
            $parts[] = "$field $op " . sqlValue($value);
        } elseif (preg_match("/^(.*) LIKE$/", $field, $matches)) {
            $field = $matches[1];
            $parts[] = "$field LIKE " . sqlValue($value);
        }
    }
    return implode(" AND ", $parts);
}

在上面的函数中,我们使用了一个 sqlValue 函数来将查询条件的值转换为 SQL 查询语句的字符串形式。这个函数的实现也相当简单:

function sqlValue($value)
{
    if ($value === null) {
        return "NULL";
    } elseif (is_string($value)) {
        return "'" . mysql_real_escape_string($value) . "'";
    } else {
        return $value;
    }
}

这样,我们就可以使用类似上面所示的数组来非常方便地构建 SQL 查询语句了!

总结

在 PHP 中,我们可以使用数组来方便地构建查询语句。这种方法非常灵活,并且让我们能够更加方便地构建复杂的查询条件。