1

ADOdb の PHP ライブラリ ( https://sourceforge.net/projects/adodb/ ) と MSSQL Server 2012で問題が発生しています。

次のように、プレースホルダーを使用して単純な更新ステートメントを実行していますが、Execute 関数に十分なパラメーターを指定していないと言って失敗します。

UPDATE report SET custom='Is this ok?' WHERE ID = ?

私はadodb-mssql.inc.phpをチェックし、Prepare関数では単純にすべてを置き換えますか? プレースホルダーとそうでないものをチェックする代わりに、MSSQL の @P 構文を使用します。

function Prepare($sql)
{
    $sqlarr = explode('?',$sql);
    if (sizeof($sqlarr) <= 1) return $sql;
    $sql2 = $sqlarr[0];
    for ($i = 1, $max = sizeof($sqlarr); $i < $max; $i++) {
        $sql2 .=  '@P'.($i-1) . $sqlarr[$i];
    }
    return array($sql,$this->qstr($sql2),$max,$sql2);
}

したがって、私のクエリでは、2つの@Pパラメーター(引用符内の@P0(プレースホルダーとして意図されていない)、@P1は実際のプレースホルダーとして)を取得します。 2。

これは ADOdb ライブラリの既知の制限ですか? クエリを実行する前に、すべてのフィールドを確認し、プレースホルダーとして使用されていない疑問符を別のものに置き換える必要がありますか?それとも何か不足していますか?

4

2 に答える 2

1

私はコードを閲覧してきました。このライブラリはひどく時代遅れで (PHP/4 用に書かれています!)、mssql ドライバーは特にひどいものです。PDO または SQLSRV ドライバーを使用できる場合 (少なくともネイティブのプリペアド ステートメントを使用しているように見えます) は運が良いかもしれませんが、それは既存のレガシー アプリであるか、そもそもそのようなライブラリを使用していないでしょう。

ドライバーを切り替えることができない場合 (または切り替えても問題が解決しない場合) は、バグに対処し、静的文字列もパラメーターとして渡す必要があると思います。

$sql = "UPDATE report SET custom='Is this ok?' WHERE ID = ?";

...これに:

$sql = "UPDATE report SET custom = ? WHERE ID = ?";
于 2016-03-31T15:20:41.600 に答える