1

データベースからいくつかのレコードを選択する次のクエリがあります。

$select_person = $this->select()
        ->setIntegrityCheck(false)
        ->from(array('a' => 'tableA'), 
                array(new Zend_Db_Expr('SQL_CALC_FOUND_ROWS a.id'),
                        'a.cid',  
                        'a.email',
                        'final' => new Zend_Db_Expr( "concat( '<div 
                            style=\"color:#1569C7; font-weight:bold\">',
                            a.head , ' ' ,  a.tail,  '</div>')" ),
                        'a.red_flag'
                )
        )   
        ->joinLeft(array('b' => 'tableb'), ... blah blah)
        ->where('blah blah')
        ->order('a.head ASC')

'final'の値に応じて異なる値を選択するように上記のクエリを変更したい

a.red_flag.

true または false の値を持つことができます。

mysql の CASE ステートメントを使用できることを理解しています。たとえば、次のようなものです。

'final' => new Zend_Db_Expr("CASE a.red_flag WHEN 'true' THEN '$concatstr1'
                        ELSE '$concatstr2' END")

の値$concatstr1 = "concat( '<div style=\"color:red; font-weight:bold\">', a.head , ' ' , a.tail, '</div>')" ;

の値$concatstr2 = "concat( '<div style=\"color:blue; font-weight:bold\">', a.head , ' ' , a.tail, '</div>')" ;

ただし、次のエラーがスローされます

メッセージ: SQLSTATE[42000]: 構文エラーまたはアクセス違反: 1064 SQL 構文にエラーがあります。1 行目の 'div style="color:red; font-weight:bold">', a.head , ' ' , ' 付近で使用する正しい構文については、MySQL サーバーのバージョンに対応するマニュアルを確認してください。

このクエリを機能させるにはどうすればよいですか? どんな助けでも大歓迎です。

ありがとう

4

2 に答える 2

3

個人的には、DB からの回答として HTML を取得するのは好きではありません。後でデバッグして変更するのが混乱し、難しくなります。さらに、' と "、および MySQL のすべての予約文字 (<、>、;、...) との混同により、いくつかのエラーが発生する可能性があります。これを試すことをお勧めします。

'final' => new Zend_Db_Expr("CASE a.red_flag WHEN 'true' THEN 1
                        ELSE 0 END")

次に、a.red_flag の値をチェックします。

if($this->final) {
    $output .= '<div style=\"color:red; font-weight:bold\">';
} else {
    $output .= '<div style=\"color:blue; font-weight:bold\">';
}
$output .= $this->head.' '.$this->tail;
$output .= '</div>';

それでもクエリが機能しない場合。試す

echo $select->__toString; exit();

クエリを確認します。データベースで __toString を使用して取得した出力を試し、機能するかどうかを確認してください。そのように修正する方が簡単です。ここにクエリ文字列を表示することもできます。これにより、デバッグが容易になります。

于 2012-07-27T10:10:28.307 に答える
1

最後に、私は自分の声明に誤りを見つけました。犯人は、ステートメント内とステートメント内で引用符を使用して$concatstr1$concatstr2$select_personことです。正しいクエリは次のように作成する必要があります。

$select_person = $this->select()
        ->setIntegrityCheck(false)
        ->from(array('a' => 'tableA'), 
                array(new Zend_Db_Expr('SQL_CALC_FOUND_ROWS a.id'),
                        'a.cid',  
                        'a.email',
                        final' => new Zend_Db_Expr("CASE a.red_flag WHEN 'true' THEN $concatstr1 ELSE $concatstr2 END"),
                        'a.red_flag'
                )
        )   
        ->joinLeft(array('b' => 'tableb'), ... blah blah)
        ->where('blah blah')
        ->order('a.head ASC');

これにより、' final'の適切な値が返されます。それ以外のconcatstr1場合red_flagtrue、私が返されますconcatstr2

于 2012-08-07T23:04:08.987 に答える