【问题标题】:Why is DBAL returning a SQL Syntax Error?为什么 DBAL 返回 SQL 语法错误?
【发布时间】:2013-08-28 02:16:34
【问题描述】:

我正在使用 Doctrine 2 和 CodeIgniter。

我的某些函数中有一个查询会触发 SQL 错误。而且我找不到原因

函数如下:

private function _key_exists($key)
    {
        $this->CI->load->library('doctrine');
        $em = $this->CI->doctrine->em;
        echo "<br />Key : ".$key;

        $key_object = $em->getRepository( 'Entity\Key' )->findOneBy( array( 'key' => $key ) );

        if( $key_object )
        {
            return TRUE;
        }
        else
        {
            return FALSE;
        }
        // return $this->db->where(config_item('rest_key_column'), $key)->count_all_results(config_item('rest_keys_table')) > 0;
    }

当关键实体是:

<?php

namespace Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * Keys
 *
 * @ORM\Table(name="keys")
 * @ORM\Entity
 */
class Key
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer", precision=0, scale=0, nullable=false, unique=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(name="key", type="string", length=40, precision=0, scale=0, nullable=false, unique=false)
     */
    private $key;

    /**
     * @var integer
     *
     * @ORM\Column(name="level", type="integer", precision=0, scale=0, nullable=false, unique=false)
     */
    private $level;

    /**
     * @var boolean
     *
     * @ORM\Column(name="ignore_limits", type="boolean", precision=0, scale=0, nullable=false, unique=false)
     */
    private $ignoreLimits;

    /**
     * @var boolean
     *
     * @ORM\Column(name="is_private_key", type="boolean", precision=0, scale=0, nullable=false, unique=false)
     */
    private $isPrivateKey;

    /**
     * @var string
     *
     * @ORM\Column(name="ip_addresses", type="text", precision=0, scale=0, nullable=true, unique=false)
     */
    private $ipAddresses;

    /**
     * @var integer
     *
     * @ORM\Column(name="date_created", type="integer", precision=0, scale=0, nullable=false, unique=false)
     */
    private $dateCreated;

/* Getters and Setters ... */

}

错误信息是:

Doctrine\DBAL\DBALException: 执行时发生异常 'SELECT t0.id AS id1, t0.key AS key2, t0.level AS level3, t0.ignore_limits AS ignore_limits4, t0.is_private_key AS is_private_key5, t0.ip_addresses AS ip_addresses6, t0.date_created AS date_created7 FROM keys t0 WHERE t0.key = ? LIMIT 1' 带参数 {“1”:“0fedfa4d50653317df76a4dba79f9f07cd7a8273”}:SQLSTATE[42000]: 语法错误或访问冲突:1064 您的 SQL 中有错误 句法;检查与您的 MySQL 服务器版本相对应的手册 在 'keys t0 WHERE t0.key = 附近使用正确的语法 '0fedfa4d50653317df76a4dba79f9f07cd7a8273' LIMIT 1' 在第 1 行 E:\Programmes\wamp\www\myapp\application\libraries\Doctrine\DBAL\DBALException.php 在第 47 行

我确实在输出中看到:Key : c242c67787bd0b9a9b11a54fc942fde50f099235

非常感谢您的帮助

【问题讨论】:

  • 你确定你粘贴了正确的sql代码吗?您的用户实体是否存储在名为键的表中?
  • 正如我在之前的评论中提到的,如果您需要共享学说实体,请切换到绕过整个 orm 问题的 yaml。我已经使用 D2 大约 4 年了(alpha 版本),它非常稳定。
  • 谢谢你,你完全正确,这不是导致这个问题的语法,让我稍后更新问题。非常感谢您指出这一点:)
  • 所以我的理解是,当表是键时,它正在以某种方式寻找一个键 t0 表('keys t0 WHERE t0.key =' 就在 SQL 中的 FROM 之后)?跨度>

标签: php sql codeigniter symfony doctrine-orm


【解决方案1】:

这个特定查询失败的原因是因为 'key' 是 mysql 中的保留字。

从键 t0 WHERE t0.key = ?限制 1'

http://dev.mysql.com/doc/refman/5.5/en/reserved-words.html

所以我猜你在改变 orm 之前没有这个工作?

将属性重命名为 value。无论如何,$key->value 比 $key->key 更好读。

【讨论】:

    【解决方案2】:

    引用表和列名需要在定义中使用刻度明确地完成,例如:

    /**
     * @ORM\Column(name="`key`", type="string", length=255, nullable=false)
     */
    protected $key;
    

    http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/basic-mapping.html#quoting-reserved-words

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-15
      • 2015-03-23
      • 1970-01-01
      • 2018-05-23
      • 1970-01-01
      • 2015-02-11
      • 1970-01-01
      • 2014-01-26
      相关资源
      最近更新 更多