如果它包含来自数组的变量,则更新MySQL行?

时间:2012-11-21 21:18:00

标签: php mysql arrays

我有一个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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

逗号在IN中分隔您的值。

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