2009-12-03 192 views
1

這是我的第一個問題,我希望它很簡單,以得到一個快速的答案!

基本上,我有以下代碼:

$variable = curPageURL(); 
$query = 'SELECT * FROM `tablename` WHERE `columnname` LIKE '$variable' ; 

如果我回聲$變量,它打印當前頁面的URL(這是我的網頁上一個javascript)

歸根結底,我想,能夠搜索哪個搜索項是當前頁面的URL,前後都帶有通配符。我不確定這是否可能,或者如果我只是有一個語法錯誤,因爲我沒有錯誤,根本沒有結果!

我想:

$query = 'SELECT * FROM `tablename` WHERE `columnname` LIKE '"echo $variable" ' ; 

但同樣,我可能丟失或使用放錯地方的'「;等等

請告訴我,我在做什麼錯

+0

這是什麼語言?字符串引用看起來有點奇怪。 – 2009-12-03 23:01:31

+0

@Joe:代碼是PHP。 – 2009-12-03 23:02:37

+0

你會在http://stackoverflow.com/questions/1318028/php-different-quotes找到解決方案 – 2009-12-03 23:09:58

回答

20

Ultimately, what I want, is to be able to make a search for which the search-term is the current page's url, with wildcards before and after.

的SQL通配符是百分號。因此:

$variable = curPageURL(); 
$variable = mysql_real_escape_string($variable); 
$query = "SELECT * FROM `tablename` WHERE `columnname` LIKE '%{$variable}%'"; 

注意:我已經添加了一些額外的代碼。 mysql_real_escape_string()將保護您免受用戶故意或意外放置會破壞您的SQL語句的字符。你最好使用參數化查詢,但這是一個比這個簡單修復更爲複雜的話題。

另請注意:我也修復了您的字符串引用。如果該字符串是雙引號,則只能直接在字符串中使用變量,並且在$query末尾缺少引號。

編輯2015年1月17日:剛剛得到的給予好評,所以考慮到這一點,不要使用mysql_*功能了。

+0

謝謝!你是救世主,非常感謝你!我只是注意到你的編輯,這是我沒有做的!現在它工作正常,非常感謝,並且這個網站是definitly favourited。 – skarama 2009-12-03 23:16:07

+1

+1:我欣賞關於downvote的評論。 – 2009-12-03 23:24:30

+0

這對我很有用。謝謝:) – sg552 2012-02-23 16:00:00

6

使用:

$query = "SELECT * FROM `tablename` WHERE `columnname` LIKE '{$variable}'" ; 

要明白爲什麼以防止SQL注入攻擊,就像上面將是脆弱的一個想法,我提出「一個媽媽的漏洞」:

alt text

+0

我明白了,但是,表名和列名不是實際的字段名,我改變了真正的字段名。或者我錯了?而且我沒有冒犯,我很高興我得到很多快速答案! – skarama 2009-12-03 23:04:27

+0

skarama:他意味着你不應該使用字符串輸入參數來創建SQL查詢。通過這樣做,您可以讓用戶完全訪問數據庫(具有與Web服務器相同的權限)。 – 2009-12-03 23:08:57

+0

@Skarma:SQL注入攻擊的關鍵在於它人爲地終止了你試圖填充的字符串參數,然後立即提交第二個查詢,可能是惡意的。在第一個查詢中發生什麼並不重要。 – 2009-12-03 23:10:14

1

使用雙引號如果你需要替換變量值:

## this code is open for SQL injection attacks 
$query = "SELECT * FROM `tablename` WHERE `columnname` LIKE '$variable'"; 

或者CONCAT手動字符串:

## this code is open for SQL injection attacks 
$query = 'SELECT * FROM `tablename` WHERE `columnname` LIKE "' . $variable . '"'; 
0

至於爲什麼你不被通知的語法錯誤:很可能您的錯誤報告設置沒有正確設置。

打開php.ini,並確保以下設置:

display_errors = On 

和:

error_reporting = E_ALL 
1

您的代碼很容易受到SQL注入式攻擊。用戶提供的數據決不能直接放入SQL查詢字符串中。相反,它必須首先通過諸如mysql_real_escape_string()之類的功能進行消毒。