2017-04-04 19 views
-1

此代碼不能工作:PHP + MYSQL:更新不若使用 '和' 工作包含WHERE

UPDATE `test` SET `done`='1' WHERE `name`='x_&_y' 

但是,這是工作:

UPDATE `test` SET `done`='1' WHERE `name`='x_y' 

兩者的代碼返回1值,但第一個代碼不工作和表不更新!

enter image description here

PHP代碼:

$value = 'x_&_y'; // send by $_GET['value'] 
$value = htmlspecialchars(trim($value),ENT_QUOTES,'UTF-8'); 
UPDATE `league` SET `leagueUpdateDone`='1' WHERE `leagueCountry`='$value'; 
+0

@GurV,是的,這真的是 –

+0

東西失敗了,檢查錯誤。你也標記爲「php」; *爲什麼?*沒有代碼來支持這個問題,甚至在標題中也包含了「PHP」。 –

+0

我們可以看到您的表格結構和內容,如果有任何敏感數據,將其隱藏起來 –

回答

1

問題是你正在運行查詢錯誤。永遠不要在輸入時使用htmlspecialchars,如果你想匹配的東西。 &是HTML中的保留字符,它被破壞。

你最終的查詢是這樣的:

'x_&_y' 

而是使用與佔位符值預處理語句,就像這樣:

$stmt = $db->prepare('UPDATE `league` SET `leagueUpdateDone`='1' WHERE `leagueCountry`=?'); 

然後綁定針對該值。根據您對mysqli或PDO的使用,實施步驟會有所不同。

注意:htmlspecialchars只有用於顯示HTML。保持數據庫中的內容儘可能中立,永遠不要預先逃脫。您希望將數據庫中的所有內容視爲原始數據,並根據所使用的上下文對其進行轉義,根據具體情況進行JSON,HTML,電子郵件或其他方式的轉換。例如,如果您認爲它是HTML,那麼如果您需要撤消該操作並重新爲JSON執行操作,該操作可能會使生活變得非常難看。

我不知道你在哪裏瞭解到htmlspecialchars技術,但它極有可能這是cargo cult programming其中咒語使用未經其目的被充分理解。這是很多YouTube教程式培訓的常見問題,他們將您淹沒在代碼中,但在理論基礎或實踐解釋方面提供的很少。

我在這裏試圖不要太難,你只是在努力學習,但重要的是理解你使用的代碼,而不是僅僅使用它,因爲有人告訴你。試着深入一點,查閱關於您使用的方法的文檔。 PHP有一個精彩的手冊,其中充滿了評論部分,有助於澄清任何誤解。

+0

謝謝,我使用htmlspecialchars忽略XSS bug –

+0

@MyName使用它很重要,但在正確的時間使用它很重要,並且在正確的地方。 – tadman

+0

當然,非常感謝 –