db_select 当列名是 mysql 关键字时
db_select when column name is a mysql keyword
选择使用 db_select
并且数据库列恰好是 reserved mysql word(在本例中为 when
)会导致错误。
Table:
+-----------------------------------+------------+--------+
| sort_id | when | user |
+-----------------------------------+------------+--------+
| 1 | 1448270950 | 123 |
| 3 | 1448270955 | 12 |
| 50 | 1448270959 | 45 |
+-----------------------------------+------------+--------+
标准 drupal7 select 使用 db_select
:
$query = db_select('naughty_table', 'd')
->fields('d', array('sort_id', 'when', 'user'))
->condition('user', $uid)
->limit($limit)
->execute();
名为 when
的列是这里的问题。
我知道我可以使用普通 SQL:
编写查询
db_query("SELECT sort_id, user, `when` FROM {naughty_table} WHERE user = :user", array(":user" => $user_id));
但是 应该 有办法使用常规 db_select 来解决这个问题吗?
您的查询应该是这样的:
$query = db_select('naughty_table', 'd')
->fields('d', array('`sort_id`', '`when`', '`user`'));
->condition('`user`', $uid)
->limit($limit)
->execute();
注意字段周围的反引号。事实上,phpMyAdmin 总是使用这些反引号来避免 运行 进入保留字问题。
话虽如此,在您的 table 中避免将字段命名为保留字始终是一个好主意(我知道您没有创建它,而只是一个注释)。
where()
应该改用:
$query = db_select('my_table', 'd')
->fields('d', array('sort_id', '`when`', 'user'))
->condition('user', '123')
->where('`when` = :timestamp', array(':timestamp' => 1448160590))
->execute();
选择使用 db_select
并且数据库列恰好是 reserved mysql word(在本例中为 when
)会导致错误。
Table:
+-----------------------------------+------------+--------+
| sort_id | when | user |
+-----------------------------------+------------+--------+
| 1 | 1448270950 | 123 |
| 3 | 1448270955 | 12 |
| 50 | 1448270959 | 45 |
+-----------------------------------+------------+--------+
标准 drupal7 select 使用 db_select
:
$query = db_select('naughty_table', 'd')
->fields('d', array('sort_id', 'when', 'user'))
->condition('user', $uid)
->limit($limit)
->execute();
名为 when
的列是这里的问题。
我知道我可以使用普通 SQL:
编写查询db_query("SELECT sort_id, user, `when` FROM {naughty_table} WHERE user = :user", array(":user" => $user_id));
但是 应该 有办法使用常规 db_select 来解决这个问题吗?
您的查询应该是这样的:
$query = db_select('naughty_table', 'd')
->fields('d', array('`sort_id`', '`when`', '`user`'));
->condition('`user`', $uid)
->limit($limit)
->execute();
注意字段周围的反引号。事实上,phpMyAdmin 总是使用这些反引号来避免 运行 进入保留字问题。
话虽如此,在您的 table 中避免将字段命名为保留字始终是一个好主意(我知道您没有创建它,而只是一个注释)。
where()
应该改用:
$query = db_select('my_table', 'd')
->fields('d', array('sort_id', '`when`', 'user'))
->condition('user', '123')
->where('`when` = :timestamp', array(':timestamp' => 1448160590))
->execute();