0

我有一个 PHP 脚本,它向某些设备令牌发送推送通知,并在发送后,在与该行匹配的列中设置一个变量,以便脚本在下次发送通知时跳过它。

该表如下所示:

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
4

2 回答 2

2

是的,您应该将所有标记括在引号中,这样您就会得到 '434fbc'、'33332c':

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

如果 $tokens 直接来自用户输入:

$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

于 2012-11-21T21:26:12.657 回答
0

逗号分隔您在 IN 中的值。

IE

UPDATE Snow SET Skip='1' WHERE Token IN('434fbc', '33332c') 
于 2012-11-21T21:24:10.310 回答