0

ODBCを介してリモートMSSQLサーバーに接続するCakePHPアプリケーションがありますが、計画どおりに機能していません。識別子の周りにバッククォートを配置しようとしているため、すべてのクエリが停止しますが、これはMSSQLでは正しくありません。

Item例として、と呼ばれるテーブルitemsを呼び出すモデルがあります。

$this->Item->find('all')

クエリを使用しようとします

SELECT `Item`.`id`, `Item`.`name`, `Item`.`descrtiption` FROM `items` AS `Item` WHERE 1

`...そして、1行目付近で無効な構文に関するエラーが発生します。
この動作を防ぎ、バッククォートを削除する方法はありますか?または、SQL Serverのように角かっこを使用しますか?

4

2 に答える 2

2

私は最近、CakePHP1.3のMSSQL2008に対して使用することを意図して、odbcドライバーをよく調べました。あなたがかなりの量の仕事をする準備ができていない限り、それは現在実行可能ではありません。

差し迫った問題は、デフォルトの引用符を[と]でオーバーライドする必要があることです。これらは、ここのdbo_odbc.phpファイルの先頭に設定されています

var $startQuote = "[";
var $endQuote = "]";

これを実行すると、次に発生する問題はLIMITのデフォルトの使用であるため、オーバーライドするためにdbo_mssqからコピーされた独自の制限関数を提供する必要があります。

/**
 * Returns a limit statement in the correct format for the particular database.
 *
 * @param integer $limit Limit of results returned
 * @param integer $offset Offset from which to start results
 * @return string SQL limit/offset statement
 */
    function limit($limit, $offset = null) {
        if ($limit) {
            $rt = '';
            if (!strpos(strtolower($limit), 'top') || strpos(strtolower($limit), 'top') === 0) {
                $rt = ' TOP';
            }
            $rt .= ' ' . $limit;
            if (is_int($offset) && $offset > 0) {
                $rt .= ' OFFSET ' . $offset;
            }
            return $rt;
        }
        return null;
    }

次に、2つの問題が発生しますが、どちらも解決しませんでした。

  1. describe関数で、odbc_field_type呼び出しがフィールドタイプを返していません。モデルのフィールドを説明する場合、これがどれほど重要かはわかりませんが、有望ではありません。
  2. さらに重要なことに、フィールドリストを生成するために使用されるfields関数では、を再帰的に展開することでケーキが機能します。一連のASエイリアスを生成するための構文。再帰レベルがゼロの場合はこれで問題ありませんが、再帰が深くなると、「this.that.other AS this_dot_that.other AS this_dot_that_dot_other」のようなフィールドリストが作成されます。これは、無効なMSSQL構文です。

これらはどちらも解決できませんが、この時点で、ODBCドライバーで問題を追跡し続けるよりも、サーバーをリロードしてMSSQLドライバーを使用する方が簡単であると判断しましたが、YMMV

追加:この質問は少し注目を集めているようです。したがって、これをさらに進める人は誰でも、この回答にコードを追加できます。うまくいけば、私たちの間で解決策を組み立てることができます。

于 2011-09-12T17:01:37.183 に答える
0

なぜmssqldboを使用しないのですかhttps://github.com/cakephp/cakephp/blob/master/cake/libs/model/datasources/dbo/dbo_mssql.php

于 2011-02-15T09:21:48.497 に答える