0

PHP で単純な MySQL クエリを作成するためにMeekroDB ( http://www.meekro.com/quickstart.php ) を使用しています。単純なクエリでさえ、構文が正しくないために拒否されています。phpMyAdmin でクエリを手動で書いていると、次の構文を使用するとクエリが拒否されることに気付きました。

SELECT * FROM 'table name'

ただし、次の構文を使用する場合は受け入れられます。

SELECT * FROM `table name`

唯一の違いは、わずかに異なるアポストロフィです。MeekroDB はデフォルトで最初の構文を生成しているようで、クエリが拒否される原因となっています。誰もこれに直面したことがありますか?解決策はありますか?WAMP サーバーと MySQL 5.5.24 を使用しています。

注: MeekroDB によって生成されたクエリは、アポストロフィが含まれていない場合、または 2 番目のアポストロフィ タイプが手動で挿入されている場合に機能します。そう:

$result = DB::query("SELECT DISTINCT `column` FROM `table`")

動作しますが:

$result = DB::query("SELECT DISTINCT %s FROM %s", "column","table")

しません。

4

2 に答える 2

2

MeekroDB については聞いたことがありませんでしたが、単純なデータベース抽象化レイヤーのようです。2番目の例:

$result = DB::query("SELECT DISTINCT %s FROM %s", "column","table")

...「列」も「テーブル」も注入したいリテラル文字列ではないため、無効です。これらは、ユーザー指定のパラメーターではなく、SQL ステートメントの一部である列/テーブル名です。

これは、ほとんどのプログラミング言語の基本概念です。PHPと異なるSELECT fooSELECT 'foo'と同じ理由で、SQL とは異なります。echo md5(1);echo 'md5(1)';

アップデート:

私は十分に明確ではなかったと思います。準備済みステートメントを使用して言語構造またはオブジェクト名をバインドすることは、MeekroDB であろうとなかろうと、データベース ライブラリの誤用です。を表すパラメーターをバインドすることになっています。特に。したがって、値が SQL に漏れたり、クエリが壊れたり、その意味が変わったりすることはありません。しかし、通常、SQLコマンドテーブル名を挿入するツールはありません。それらはほとんど役に立ちません。ユーザーが任意の SQL クエリを作成できるようにすると、ユーザーは、自分が望むほとんどすべてのことを実行する権限を既に与えられています。

于 2013-02-01T12:17:10.177 に答える
-4

PHP は他の言語と同じように文字列を処理しないため、これはやや悪い考えです。本質的に、彼らは開発者にとってより簡単にしようとしましたが、常にそうであるとは限りません。実際にあなたができることは

$result = DB::query(sprintf("SELECT DISTINCT %s FROM %s", "column","table"));
于 2013-02-01T12:16:40.610 に答える