Zend_Framework 1.12 SQLSTATE [42000]:语法错误或访问冲突:1064 SQL语法错误

时间:2013-06-29 08:54:17

标签: zend-framework zend-db zend-db-table zend-db-select

在此之前,我知道有关此例外的多个问题。我已经浏览了他们但没有找到我的特定问题的答案。大多数问题都使用Zend_Db_Table::getDefaultAdapter();,我没有使用它。相反,我使用的是Application_Model_DbTable_Name,我想知道是否可以这样做。

另外,我确实有访问权限,因为这是我在看到错误时检查的第一件事。数据库是本地的,我通过My​​SqlWorkBench使用相同的用户/密码访问它。

我的目标是在两列符合控制器操作中设置的条件时删除一行,如下所示:

public function deleteAction(){
        $request = $this->getRequest();
        $this->_validateDigit($request->getParam('id'));
        // _validateDigit(..) checks that the variable is numeric and if it´s not it redirects to 
        // an error page

        $db = new Application_Model_DbTable_BecasPerfiles();
        $select = $db->select();
        $select->where('unidad=?', $this->_getUnit())
                ->where('id=?', (int) $request->getParam('id'));

        $db->delete($select->getPart(Zend_Db_Select::WHERE));
        $this->_redirect('/profile/view-profiles/unit/'.$this->_getUnit());
    }

 private function _getUnit()
    {
        return Zend_Registry::getInstance()['session']->unit;
                  //unit is nothing but a string
    }

这是我的DbTable类(非常简单):

class Application_Model_DbTable_BecasPerfiles extends Zend_Db_Table_Abstract
{

    protected $_name = 'becas_perfiles';

}

这是吐出的错误:

Message: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in 
your SQL syntax; check the manual that corresponds to your MySQL server version for 
the right syntax to  use near 'AND (id=7))' at line 1

以下是我的注意力 AND(id = 7)),请参阅额外的括号?来自哪里?

以下是var_dump($select->getPart(Zend_Db_Select::WHERE));

的结果
array(2) { [0]=> string(33) "(unidad='Galería de Arte ULPGC')" [1]=> string(10) "AND (id=7)" }

为了它的乐趣,我尝试切换where子句的顺序:

$select->where('id=?', (int) $request->getParam('id'))
        ->where('unidad=?', $this->_getUnit());

这是输出:

Message: SQLSTATE[42000]: ...
 syntax to use near 'AND (unidad='Galería de Arte ULPGC'))' at line 1

再次, AND(unidad ='GaleríadeArte ULPGC') 第二个括号。我不知道这是不是问题(但我认为这是因为否则我不知道什么可能是错的)。

我尝试使用一个条件(如id),它删除就好了。非常感谢你的帮助,谢谢!

1 个答案:

答案 0 :(得分:0)

问题在于getPart()返回的内容与delete()期望的内容之间存在不匹配。

正如您已经指出的那样,var_dump($select->getPart(Zend_Db_Select::WHERE));也返回where语句中的逻辑运算符,但delete()运算符要么需要“field => value”形式的数组,要么包含一个字符串完整的where子句。

因此,解决问题的最简单(未经测试)方法是传递$db->delete(implode(' ', $select->getPart(Zend_Db_Select::WHERE)));,以便delete()接收一个完全限定的where子句作为字符串而不是它无法处理的数组。