我有從PHP頁面執行以下MySQL查詢麻煩與LIKE MySQL查詢
SELECT * FROM servers WHERE name LIKE '%$value%'
在被執行時,選擇0行(但是,查詢成功運行,所以我不能使用mysql_error()來調試)。當我在PHPMyAdmin中運行查詢時,它會選擇適當的行。其他查詢,如
SELECT * FROM servers
工作正常。如果它有幫助,我可以把我的代碼放在這裏。
我有從PHP頁面執行以下MySQL查詢麻煩與LIKE MySQL查詢
SELECT * FROM servers WHERE name LIKE '%$value%'
在被執行時,選擇0行(但是,查詢成功運行,所以我不能使用mysql_error()來調試)。當我在PHPMyAdmin中運行查詢時,它會選擇適當的行。其他查詢,如
SELECT * FROM servers
工作正常。如果它有幫助,我可以把我的代碼放在這裏。
編輯:這裏的東西提供基於以下馬立克氏答案的改善。請參閱關於將變量直接放入查詢的練習的評論,並考慮使用預準備語句。無論如何,在這裏。
把它們一起,你可以寫:
$q = "SELECT * FROM servers WHERE name LIKE '%$value%'"; //Fine
你不能寫:
$p = 'SELECT * FROM servers WHERE name LIKE "%$value%"'; //Broken!
$q
的作品,因爲它是一個雙引號字符串,和省略號都只是普通字符。 $p
不起作用,因爲它是單引號字符串。
正如下面的GoodFather所指出的那樣,您也可以說${value}
以避免環境字符串含糊不清,例如, $r = "ABC${value}DEF";
。
你真的需要看看更安全地做這個查詢。這也將有助於解決您的問題。就目前而言,您很容易受到SQL注入攻擊。看從PHP手冊中的例子如何做是正確的:
http://php.net/manual/en/function.mysql-query.php
編輯:從您的評論你提到你已經照顧字符串的正確,這是偉大的。下面的代碼應該可以解決你的問題。
例如,你可以重寫你的查詢語句(在PHP)像這樣:
$query = sprintf("SELECT * FROM servers WHERE name LIKE '%". mysql_real_escape_string($value) . "%'");
這將清理你的代碼,它也將與你的LIKE語句不正常處理有關問題。
下面是關於這個問題的另一個很好的文章:
http://joshhighland.com/blog/2008/07/06/php-sprintf-sql-like/
不能回答他的問題,代碼安全規則不會解決他的語法問題。如果這是內部腳本管理的一部分,則根本沒有安全風險 –
@Marek - 我正在使用代碼示例更新我的答案,以便在發佈此評論時對其進行進一步解釋。至於你對使用這個作爲內部腳本而沒有危險的看法,我的觀點是你永遠不會編寫易受攻擊的代碼。即使現在在內部使用它,也可能會有一天代碼的用途發生變化。此外,即使是內部代碼也應該受到保護以免出現這些類型的問題誰知道初級管理員實際執行這個腳本。如果你不小心,他們可能會造成真正的傷害。第一次做對吧總是更好。 – IAmTimCorey
與你同意,但當你需要創建可用的代碼時,不需要關注代碼漏洞。在創建工作系統後,安全和優化是進一步步驟的一部分。當然,我同意需要安全,我們不能說他現在如何使用此代碼,但不工作,並且SECURE代碼無法使用;) –
您是否期待區分大小寫或不區分大小寫的查詢?我打賭不區分大小寫,因爲你期待的結果,但沒有看到它們。查看數據庫的默認排序規則或表的特定排序規則,並確保它以_ci結尾,不管它是什麼。
那麼你有什麼問題? – rackemup420
這將有助於查看您正在談論的代碼。另外,養成[引用你的標識符]的習慣並不會造成傷害(http://dev.mysql.com/doc/refman/5.0/en/identifiers.html)。 –
'$ value'中有什麼? – Ryan