2013-02-01 23 views
0

我使用MeekroDB(http://www.meekro.com/quickstart.php)構建在PHP MySQL的簡單查詢,拒查詢語法。即使簡單的查詢由於語法不正確而被拒絕。我注意到了在phpMyAdmin手動編寫查詢,如果他們使用此語法的查詢被拒絕:MySQL的基於單引號字符

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") 

沒有。

+2

不要使用工具/教老棄用MySQL庫教程....學習的MySQLi或PDO預處理語句 –

+3

瞭解三種類型的報價和何時/何地使用它們。 –

+0

@ÁlvaroG.VicarioMeekroDB允許您在查詢字符串中使用佔位符(請參閱快速入門鏈接),但似乎將它們用錯誤的引號括起來。 – Owen

回答

2

我沒有聽說過MeekroDB,但它似乎是一個簡單的數據庫抽象層。第二個示例:

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

...無效,因爲「列」和「表」都不是您要注入的文字字符串。它們是作爲SQL語句一部分的列/表名稱,而不是用戶提供的參數。

這是大多數編程語言的基本概念。 SELECT foo是從SQL出於同樣的原因SELECT 'foo'不同的是echo md5(1);是從PHP echo 'md5(1)';不同。

更新:

我懷疑我是不太清楚。使用預先準備好的語句來綁定語言結構或對象名稱是濫用任何數據庫庫,MeekroDB與否。你應該綁定代表的參數,尤其是,那些由最終用戶輸入的數據,所以你的值不會泄漏到SQL中,並打破查詢或改變它的含義。但是,通常是沒有工具注入SQL命令 -they'd是沒有多大用處的:如果你允許用戶建立任意SQL查詢,他已經被授權做幾乎任何事情,他希望電力。

+0

+1爲編程語言比喻。 –

+0

@alvaro好的,只是爲了清楚,這可能是MeekroDB框架本身的一個問題,而不是我對它的使用? – Owen

-4

好,因爲PHP不把字符串以同樣的方式其他語言做,這是一個有點壞主意。實質上,他們試圖讓開發者更容易,但並不總是如此。實際上你可以做的是

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

PHP不像其他語言那樣對待字符串?你什麼意思? –

+0

我的意思是一般變量。與其他語言(如c或java)相比,它要嚴格得多。我不是衝刺的狂熱粉絲,因爲根據我的經驗,它往往是一個緩慢的解決方案,即使它通常安全使用。 – alxkls

+0

我仍然不知道你的意思,但是在這個上下文中'%s'不是'printf()'格式的代碼,它是MeekroDB的預處理語句的語法。你的回答是錯誤的,因爲它沒有指出基本錯誤,它甚至建議用...來替換綁定參數。 –