0

我正在使用 MeekroDB ( http://www.meekro.com/quickstart.php ) 在 PHP 中构造简单的 MySQL 查询。由于语法不正确,即使是简单的查询也会被拒绝。通过在 phpMyAdmin 中手动编写查询,我注意到如果使用以下语法,查询将被拒绝:

SELECT * FROM 'table name'

但如果他们使用以下语法则被接受:

SELECT * FROM `table name`

唯一的区别是撇号略有不同。MeekroDB 似乎默认生成第一个语法,这导致查询被拒绝。有没有人遇到过这个问题?有什么解决办法吗?我正在使用 WAMP 服务器和 MySQL 5.5.24。

注意:如果 MeekroDB 生成的查询不包含撇号或手动插入第二个撇号类型,则它们可以正常工作。所以:

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

有效,但:

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

没有。

4

2 回答 2

2

我没有听说过 MeekroDB,但它似乎是一个简单的数据库抽象层。你的第二个例子:

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

... 无效,因为“列”和“表”都不是您要注入的文字字符串。它们是作为 SQL 语句一部分的列/表名称,而不是用户提供的参数。

这是大多数编程语言中的基本概念。SELECT fooSELECT 'foo'SQL 不同,原因echo md5(1);与 PHP 不同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 回答