5

に渡す値/データ型のペアに関係なく$pdo->quote($value, $type);、常に文字列として引用されます。

echo $pdo->quote('foo', PDO::PARAM_STR); /* 'foo', as expected */

echo $pdo->quote(42, PDO::PARAM_INT);    /* '42', expected 42 unquoted */

これが意図した機能であるかどうかを知りたいだけです。実際のクエリの実行には準備されたステートメントを使用しますが、最終的なクエリ文字列を取得 して (デバッグ/キャッシュ用に)作成しようとしており、それらを手動で作成しています。

タイトルの通り、$pdoMySQL ドライバーで作成した場合です。入手不可能のため、他のものは試していません。

4

2 に答える 2

6

OracleSQLiteMSSQL、およびFirebirdドライバーはすべてPDO MySQL driverとして引用され、param タイプは無視されます。PostgreSQL ドライバーは、バイナリ ラージ オブジェクトとその他すべてを区別するだけです。ODBC ドライバーはクォーターを実装していません。あなたが期待する (欠けている) 動作はバグとして報告され、「偽物」としてクローズされました。つまり、動作は設計によるものです。ドキュメントが次のように述べている場合、おそらく誤解を招く可能性があります。

PDO::quote() は入力文字列を引用符で囲みます (必要な場合)

これは、値が引用符で囲まれていない場合があることを示唆していますが、絶対にあるとは言いませんし、それらのインスタンスが何であるかについても述べていません。これがドキュメントのバグであると思われる場合は、バグ レポートを提出してください。

于 2011-03-18T19:16:13.167 に答える
0
  public static function quote($value, $pdotype = PDO::PARAM_STR)
    {
        if ($pdotype == PDO::PARAM_INT)
            return (int)$value;
        return Db::pdo()->quote($value, $pdotype);
    }

PDO 開発者によると、これはコードとドキュメントの意図的なエラーです。
彼らはそれを修正する予定はないようです。そのため、エラーのある関数をラップし、必要に応じて動作を置き換えることで自分で修正できます。
場合によっては、数値の正しい引用動作が必要な場合があるため、実際には選択の余地がありません。SQLがそれを受け入れない可能性があるため、どこでも文字列引用を使用することはできません。

補足として、上記の関数は不正なデータを 0 にします。
SQL インジェクションは不可能ですが、エラーはスローされません。エラーをキャッチしたい場合は、両方の変数で「strlen」を実行できます。それが異なる場合は、問題または侵入の試みがあったことがわかります。

于 2016-10-17T19:34:19.587 に答える