2012-11-21 20 views
0

我有一個PHP腳本,它將推送通知發送到某些設備令牌,並在發送之後,在與該行匹配的列中設置一個變量,以便腳本在下次發送通知時跳過它。如果它包含數組中的變量,那麼更新MySQL行?

表看起來是這樣的:

Token (PRIMARY)  School  Skip 
-------------------------------------- 
f2342f    School 2  0 
434fbc    School 1  0 
33332c    School 1  0 

我的Skip列變量設置爲1的代碼已運行發送通知後:

if (!mysql_query("UPDATE Snow SET Skip='1' WHERE Token IN('$tokens')", $con)) { 
    die('Error: ' . mysql_error()); 
} 

用,雖然問題是,如果兩個代幣共用同一所學校,那麼它不會更新。當數組中有多個「標記」時它可能更新嗎?因此,該查詢不僅更新單個標記,而且還更新多個標記,用逗號分隔:

UPDATE Snow SET Skip='1' WHERE Token IN('f2342f') // Single tokens matching criteria 
UPDATE Snow SET Skip='1' WHERE Token IN('434fbc, 33332c') // Multiple tokens 

回答

2

是的,你應該封裝所有的令牌引號,所以你會得到 '434fbc', '33332c':

$tokensStr = "'" . join("','", explode(",", $tokens)) . "'"; 
if (!mysql_query("UPDATE Snow SET Skip='1' WHERE Token IN($tokensStr)", $con)) { 
    die('Error: ' . mysql_error()); 
} 

如果$令牌直接來自用戶的輸入:

$tokenArray = explode(",", $tokens)); 
$tokenArray = array_map('mysql_real_escape_string', $tokenArray); 
$tokensStr = "'" . join("','", $tokenArray) . "'"; 
if (!mysql_query("UPDATE Snow SET Skip='1' WHERE Token IN($tokensStr)", $con)) { 
    die('Error: ' . mysql_error()); 
} 

這防止SQL注射:http://en.wikipedia.org/wiki/SQL_injection

0

逗號分隔IN內的值。

UPDATE Snow SET Skip='1' WHERE Token IN('434fbc', '33332c') 
+0

這些值不是硬編碼的。 – Charlie

相關問題