列名是mysql关键字时的db_select

时间:2015-10-06 13:40:39

标签: php mysql drupal-7

使用db_select选择,当数据库列恰好是reserved mysql word时(在这种情况下为when)会导致错误。

表:

+-----------------------------------+------------+--------+
|               sort_id             |    when    |  user  |
+-----------------------------------+------------+--------+
| 1                                 | 1448270950 |    123 |
| 3                                 | 1448270955 |     12 |
| 50                                | 1448270959 |     45 |
+-----------------------------------+------------+--------+

使用db_select选择标准drupal7:

$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来解决这个问题的方法吗?

1 个答案:

答案 0 :(得分:-1)

您的查询应该是:

@Component
@ConfigurationProperties("security.http")
public class ForceHTTPSFilter implements Filter {

    public static final String X_FORWARDED_PROTO_HEADER = "x-forwarded-proto";
    private boolean forceHttps = false;

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
        FilterChain chain) throws IOException, ServletException {

        if(forceHttps && !request.getProtocol().toUpperCase().contains("HTTPS") && request instanceof HttpServletRequest) {
            Optional<String> protocol = Optional.ofNullable(((HttpServletRequest)request).getHeader(X_FORWARDED_PROTO_HEADER));
            if(!protocol.orElse("http").equals("https")){
                ((HttpServletResponse)response).sendError(HttpStatus.FORBIDDEN.value(), "Please use HTTPS when submitting data to this server.");
            return;
            }
        }

        chain.doFilter(request, response);
    }

    @Override
    public void destroy() {

    }

    public boolean isForceHttps() {
        return forceHttps;
    }

    public void setForceHttps(boolean forceHttps) {
        this.forceHttps = forceHttps;
    }
}

注意田野周围的反叛。事实上,phpMyAdmin总是使用这些反引号来避免遇到保留字问题。

话虽如此,避免在表格中将字段命名为保留字总是一个好主意(我知道你没有创建它,只是一个注释)。