2013-06-29 5 views
0

Прежде всего я знаю о нескольких вопросах, заданных в отношении этого исключения. Я просмотрел их, но не нашел ответа по моей конкретной проблеме. Большинство вопросов используют Zend_Db_Table::getDefaultAdapter();, и я не использую это. Вместо этого я использую Application_Model_DbTable_Name, и мне осталось интересно, возможно ли это сделать.Zend_Framework 1.12 SQLSTATE [42000]: Ошибка синтаксиса или нарушение доступа: 1064 У вас есть ошибка в синтаксисе SQL

Кроме того, у меня есть доступ, так как это первое, что я проверил, когда увидел ошибку. База данных является локальной, и я получаю доступ к ней с тем же пользователем/паролем через MySqlWorkBench.

Моя цель состоит в том, чтобы удалить строку, когда два столбца соответствуют критериям, установленным в действии контроллера, например, так:

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 

Вот что вызывает мое внимание И (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)" } 

Просто для удовольствия, я попытался переключая порядок п где:

$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 

Там снова, И (unidad = 'Galería de Arte ULP GC ') ) эта вторая скобка. Я действительно не знаю, если это проблема (но я полагаю, что это потому, что иначе я не знаю, что может быть ошибочно).

Я пробовал просто использовать одно условие (например, id), и он просто удалился. Я очень ценю вашу помощь, спасибо!

ответ

0

Проблема здесь в том, что существует несоответствие между тем, что возвращает getPart() и что delete() ожидает.

Как уже указывалось, var_dump($select->getPart(Zend_Db_Select::WHERE)); также возвращает логические операторы в операторе where, но оператор delete() либо ожидает массив в форме «field => value», либо строку, содержащую предложение full where.

Таким образом, самый простой (непроверенный) подход, чтобы исправить вашу проблему, состоял бы в том, чтобы передать $db->delete(implode(' ', $select->getPart(Zend_Db_Select::WHERE)));, так что delete() получает полностью квалифицированное предложение where как строку вместо массива, с которым он не может справиться.

 Смежные вопросы

  • Нет связанных вопросов^_^