0

何よりも前に、この例外に関して尋ねられた複数の質問を認識しています。それらを調べましたが、特定の問題に対する答えが見つかりませんでした。ほとんどの質問は を使用していますがZend_Db_Table::getDefaultAdapter();、私は使用していません。代わりに を使用してApplication_Model_DbTable_Nameいますが、それが可能かどうか疑問に思っています。

また、エラーが表示されたときに最初に確認したので、アクセスできます。データベースはローカルであり、MySqlWorkBench を介して同じユーザー/パスワードでアクセスします。

私の目標は、次のように、2 つの列がコントローラー アクションで設定された基準を満たすときにを削除することです。

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ía de Arte ULPGC') ) 2 番目の括弧があります。それが問題なのかどうかはよくわかりません (しかし、そうでなければ、何が間違っている可能性があるのか​​ わからないためだと思います)。

where条件(idなど)を1つだけ使用してみましたが、問題なく削除されました。私は本当にあなたの助けに感謝します、ありがとう!

4

1 に答える 1

0

ここでの問題は、getPart()返されるものとdelete()期待されるものとの間に不一致があることです。

既に指摘したようvar_dump($select->getPart(Zend_Db_Select::WHERE));に、where ステートメントで論理演算子も返しますが、delete()演算子は "field => value" の形式の配列または完全な where 句を含む文字列のいずれかを期待します。

したがって、問題を解決するための最も簡単な (テストされていない) アプローチは、処理できない配列ではなく、完全修飾された where 句を文字列として受け取るように渡す$db->delete(implode(' ', $select->getPart(Zend_Db_Select::WHERE)));ことです。delete()

于 2013-06-29T10:56:08.487 に答える