首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在PHP中使用关联数组构造UPDATE语句

问在PHP中使用关联数组构造UPDATE语句
EN

Stack Overflow用户
提问于 2012-11-07 19:43:07
回答 2查看 1.9K关注 0票数 1

在PHP中使用关联数组构造UPDATE语句的最佳方法是什么?

例如,假设我有一个如下所示的函数:

代码语言:javascript
复制
/**
 * For update queries
 * 
 * @param string $tableName Name of the table we're wanting to update.
 * @param array $values Associative array of columns / values to update. e.g. array('name' => 'John', 'age' => 29)
 * @param array $conditions Associative array of conditions. e.g. array('user_id' => 1) equates to "WHERE user_id = 1"
 */
 public function update($tableName, $values, $conditions = array()){
      //Construct SQL
 }

到目前为止,我已经能够构造简单的UPDATE语句,例如:

代码语言:javascript
复制
UPDATE `myTableName` SET `name` = :name, `age` = :age WHERE `user_id` = :user_id

现在我想知道:构造WHERE子句的最佳方法是什么?在其他库和代码库中是否有类似的实现可供我参考?例如:如何构造具有OR、and和IN()等的WHERE子句?

代码语言:javascript
复制
UPDATE example SET col = :val WHERE user_id = :user_id AND (age = :age OR name = :name)
EN

回答 2

Stack Overflow用户

发布于 2012-11-07 19:57:41

代码语言:javascript
复制
public function update($tableName, $values, $conditions = array()) {
    if (empty($values)) {
        throw new Exception('Nothing to update');
    }
    $valueStrings = array();
    foreach ($values as $name => $value) {
        $valueStrings[] = $name . ' = :' . $name;
    }
    $conditionStrings = array();
    foreach ($conditions as $column => $value) {
        $conditionString = $column;
        $conditionString .= is_array($value)
            ? ('IN ("' . implode('","', $value) . '")')
            : (' = "' . $value . '"')
        ;
        $conditionStrings[] = $conditionString;
    }
    $sql = 'UPDATE ' . $tableName
        . ' SET ' . implode(', ', $valueStrings)
        . ' WHERE ' . implode(' AND ', $conditionStrings)
    ;
    // execute query
}

但实际上,您应该使用ORM:

Doctrine 2: Update query with query builder

票数 1
EN

Stack Overflow用户

发布于 2012-11-07 19:54:09

我认为一个简单的解决方案是使用implode(),并使用'AND‘作为分隔符:

代码语言:javascript
复制
$columnCArrayValues = array(1, 2, 3, 4);
$conditions = array(
    'column_a = :column_a',
    'column_b <> :column_b',
    'column_c IN (' . implode(',', $columnCArrayValues) . ')'
);

// ..

$where = '(' implode(') AND (', $conditions) . ')';
// result: (column_a = :column_a) AND (column_b <> :column_b) 
// AND (column_c IN (1,2,3,4))

或者,Zend Framework在框架的both版本中有一个非常好的Db组件。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13269067

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档