我有一个如下所示的数据库:
Token (PRIMARY) School Skip
--------------------------------------
f2342f School 1 0
434fbc School 1 0
33332c School 1 0
如果学校与临时数据库匹配,我的PHP代码会向每个令牌发送推送通知。然后它将skip设置为1,这样它就不会尝试在一天内发送另一个通知。
问题是虽然我不能让脚本一次设置多个跳过值。当我这样做时,它似乎对第一个令牌工作正常,但之后不会为其他令牌设置跳过值,并且会死亡。
这是我的PHP:
// Run comparison SQL query
$compare = mysql_resultTo2DAssocArray(mysql_query("SELECT Temp.School, Temp.Status, Snow.Skip, GROUP_CONCAT(Snow.Token SEPARATOR '\', \'') Tokens FROM Temp JOIN Snow USING (School) WHERE Skip = 0 GROUP BY Temp.School"), $con);
$amount = count($compare);
// Send Push Notifications
for ($i = 0; $i < $amount; $i++) {
$message = $compare[$i][School] . " - " . $compare[$i][Status];
$tokens = $compare[$i][Tokens];
pwCall( 'createMessage', array(
'application' => PW_APPLICATION,
'username' => PW_LOGIN,
'password' => PW_PASSWORD,
'notifications' => array(
array(
'send_date' => 'now',
'content' => $message,
'ios_badges' => 1,
'ios_sound' => 'bells.caf',
'data' => 'daily',
'devices' => array($tokens),
)
)
)
);
if (!mysql_query("UPDATE Snow SET Skip='1' WHERE Token='$tokens[$i]'", $con)) {
echo "<pre>";
print_r(str_replace("'", '', $tokens));
echo "</pre>";
die('Error: ' . mysql_error());
}
}
输出为:
f2342f,434fbc,33332c错误:您的SQL语法出错; 检查与您的MySQL服务器版本对应的手册 在''f2342f'附近使用正确的语法,第4行的'434'
所以对我来说,似乎我需要让它以递归方式设置跳过,除非我遗漏了一些对我的代码很重要的内容。
$compare
:
Array
(
[0] => Array
(
[School] => School 1
[Status] => Closed
[Skip] => 0
[Tokens] => f2342f', '434fbc', '33332c
)
)
答案 0 :(得分:2)
执行此操作后:
$tokens = $compare[$i]['Tokens'];
$tokens
应该是这样的:
f2342f', '434fbc', '33332c
意味着您的查询应更改为
"UPDATE Snow SET Skip='1' WHERE Token IN('$tokens')"
答案 1 :(得分:1)
问题似乎在于您如何处理UPDATE查询中的$tokens
。
您正尝试访问其中的令牌,就好像它是数组一样,但错误消息清楚地向您显示$tokens
是一个字符串 - 否则print_r
会告诉您它是一个数组。< / p>
在为每个令牌进行更新查询之前,您需要explode
$tokens
字符串。
$tokensArray = explode (', ', $tokens);
编辑:
@minitech对你的问题给了你很好的评价;如果令牌要用于IN
语句(WHERE token IN ($tokens)
),则不需要将它们分解为数组。