【问题标题】:php mysql query condition oopphp mysql 查询条件oop
【发布时间】:2012-10-30 08:47:30
【问题描述】:

我想知道如何从 PHP 中的 SelectQuery 对象为 SELECT mysql 查询创建一个通用函数。 SelectQuery 扩展了 Query,这意味着它继承了数据库连接、一个 realescape 方法(即 mysqli_real_escape_string())和一个执行查询的查询方法。除此之外,它还获得一个名为 _sql 的受保护变量,这是 query() 方法传递给数据库的 SQL。它还获得一个名为 _table 的受保护变量,其中包含它正在处理的表的(转义)名称。

我的代码:

public function select($columns = array('*'), $known = null, $limit = null, $offset = null, $orderby = null, $asc = true) {
    if (!is_array($columns)) {
        new Error('Parameter is not an array.');
        return;
    }

    $select = '';
    foreach($columns as $column) {
        $select .= (($select != '')?', ':'') . '`' . $this->realescape($column) . '`';
    }
    $conditions = '';
    if (is_array($known)) {
        foreach($known as $column => $value) {
            $conditions .= (($conditions != '')?' AND ':'WHERE ') . '`' . $this->realescape($column) . '` = ' . ((is_string($value))?'\'':'') . $this->realescape($value) . ((is_string($value))?'\'':'');
        }
    }
    $domain = '';
    if ($limit !== null) {
        $domain = 'LIMIT ' . $this->realescape($limit);
        if ($offset !== null) {
            $domain .= ' OFFSET = ' . $this->realescape($offset);
        }
    }
    $order = '';
    if ($orderby !== null) {
        $order = 'ORDER BY `' . $this->realescape($orderby) . '` ' . (($asc)?'ASC':'DESC');
    }

    $this->_sql = 'SELECT ' . $select . ' FROM `' . $this->_table . '`';
    if ($conditions != '') {
        $this->_sql .= ' ' . $conditions;
    }
    if ($domain != '') {
        $this->_sql .= ' ' . $domain;
    }
    if ($order != '') {
        $this->_sql .= ' ' . $order;
    }
    return $this->query();
}

$known 变量可能已设置,如果设置它应该是一个数组,其中包含我们选择的行的所有“已知”元素。

我的问题:我怎样才能做到这一点,以便条件如 age < 18date > 5120740154 容易制作吗?

另外,如果您认为我制作这项工作的方式是错误的,请说出来。

提前致谢

【问题讨论】:

  • 我的自定义 DB 类中没有用于选择的方法,因为正如您的代码所示,您通常最终在函数调用中编写与编写整个查询一样多的内容。我也不需要担心你提到的条件等更复杂的事情。
  • @G-Nugget:嗯,谢谢分享,我可能会将其更改为更简单的查询执行方式。我看到的唯一问题是转义,因为 MySQLi 需要数据库连接标识符逃跑(我不知道为什么)。

标签: php mysql sql oop conditional-statements


【解决方案1】:

动态构建可以使用任何运算符的 WHERE 条件

创建一个 $where 数组来保存你的 where 条件。

$where = array (
    'age <' => 18,
    'date >' => 5120740154
);

您可以使用如下函数将其构建到您的 SQL 查询中:

private function buildWhereConditions($where) {
    $conditions = 'WHERE 1=1';
    /*1=1 is just so you can easily append ANDs */
    foreach ($where as $key => $value) {
        $conditions .= " AND $key $value ";
    } 
    return $conditions;
}

这将返回要附加到查询的 where 条件:

WHERE 1=1 AND age < 18 AND date > 5120740154

【讨论】:

  • 感谢您的解决方案。我不是 WHERE 1=1 的忠实粉丝,但另一部分很好。唯一困扰我的是,我必须在列名中包含运算符(?)。我怎样才能做到这一点?也许创建条件对象,以便它可以包含 3 个值而不是 2 个(key=>value)?
  • 您可以使用三元运算符摆脱 1=1:($conditions != '')?' AND ':'WHERE ' 为什么在列名中包含运算符会出现问题?除了有点难看之外,它还有效。您可以创建一个包含 3 个值的对象,但这很麻烦。如果它没有坏,就不要修理它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-18
  • 2011-07-12
  • 2013-03-05
  • 1970-01-01
  • 2015-05-05
  • 1970-01-01
相关资源
最近更新 更多