更新主键数组的正确 PDO 语法。
Correct PDO Syntax for Updating an Array of primary keys.
每当我的 Facebook Canvas 游戏中发生特定事件时,Hi_I 正在尝试 运行 我的数据库中的 PDO 更新,但我 运行 进入我的语法有些困难,希望这里有人能提供帮助。
我有一个名为 Balance
的 table。此 table 包含以下列:facebookID
、goldbalance
和 invite
。
这个table存储的是每个玩家的金币余额,invite
栏记录的是玩家是否向其他玩家发送了成功(接受)的游戏邀请。
我目前正在做的是:当新玩家加入游戏时,我 运行 检查 Facebook 的图表 API 以查看哪些(如果有)其他玩家邀请了这个新玩家玩家,如果他们有,那么我获取他们的 ID,然后执行 AJAX post 将他们发送到 PHP 文件,我想在其中奖励这些玩家的 goldbalance
通过 +100 金币,我还想将他们的 invite
列从 0
更改为 1
(这将导致显示一个弹出窗口,在他们下次登录时通知他们奖励进入游戏)。
现在我成功地将邀请发送者的 ID 作为数组发送到我的 PHP 文件,但是我无法成功地对玩家的黄金余额进行 PDO 更新。
这是我的 AJAX 代码,用于发送数组中的 ID:
// requestid is the Array containing the sender IDs
$.ajax({
url: 'scripts/requestreward.php',
data: {'requestid' : requestid},
type: "POST",
success: function(response){
alert(response);
}
});
这是我当前的 PDO PHP 文件:
<?php
$servername = myservername;
$username = myusername;
$password = mypassword;
$dbname = mydbname;
//Create connection:
try {
$conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
// set the PDO error mode to exception
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $conn->prepare("UPDATE `Balance`
SET `goldbalance` = `goldbalance` + 100,
`invite` = 1,
WHERE `facebookID` = :requestId,
foreach($_POST['requestid'] as $requestId){
`facebookID`="($requestId)"; }");
$stmt->bindParam(':requestid', $requestid);
$requestid = $_POST['requestid'];
$stmt->execute();
$conn->commit();
echo "Success";
}
catch(PDOException $e)
{
echo "Error: " . $e->getMessage();
}
$conn = null;
?>
我一直在尝试将此作为准备好的 PDO 语句来执行,因为我读过它更安全,但我很确定我对数组中的每个项目都错误地执行了更新循环。
此外,我不确定这条线是否是将玩家的金币余额(即 INT)增加 100 的正确方法:SET `goldbalance` = `goldbalance` + 100,
如能提供任何帮助,我们将不胜感激,在此先感谢您!
您的语法无效 PHP 语法。您不能只在字符串中创建 foreach
。
用占位符写下你的语句,然后遍历所有 requestId
以根据需要多次执行语句。
看看这段代码,它应该可以正常工作。
try {
$conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
// set the PDO error mode to exception
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $conn->prepare("UPDATE `Balance`
SET `goldbalance` = `goldbalance` + 100,
`invite` = 1
WHERE `facebookID` = :requestId");
$stmt->bindParam(':requestId', $requestId);
foreach($_POST['requestid'] as $r) {
$requestId = $r;
$stmt->execute();
}
echo "Success";
}
catch(PDOException $e)
{
echo "Error: " . $e->getMessage();
}
此外,您的$con->commit()
没有用,因为您没有开始交易。
安全注意事项
正如 Marc B 在评论中所说,您的代码 容易受到 SQL 注入 的攻击。在将数据用于查询之前,您应该了解如何从用户输入中清理数据。
Hi_I 正在尝试 运行 我的数据库中的 PDO 更新,但我 运行 进入我的语法有些困难,希望这里有人能提供帮助。
我有一个名为 Balance
的 table。此 table 包含以下列:facebookID
、goldbalance
和 invite
。
这个table存储的是每个玩家的金币余额,invite
栏记录的是玩家是否向其他玩家发送了成功(接受)的游戏邀请。
我目前正在做的是:当新玩家加入游戏时,我 运行 检查 Facebook 的图表 API 以查看哪些(如果有)其他玩家邀请了这个新玩家玩家,如果他们有,那么我获取他们的 ID,然后执行 AJAX post 将他们发送到 PHP 文件,我想在其中奖励这些玩家的 goldbalance
通过 +100 金币,我还想将他们的 invite
列从 0
更改为 1
(这将导致显示一个弹出窗口,在他们下次登录时通知他们奖励进入游戏)。
现在我成功地将邀请发送者的 ID 作为数组发送到我的 PHP 文件,但是我无法成功地对玩家的黄金余额进行 PDO 更新。
这是我的 AJAX 代码,用于发送数组中的 ID:
// requestid is the Array containing the sender IDs
$.ajax({
url: 'scripts/requestreward.php',
data: {'requestid' : requestid},
type: "POST",
success: function(response){
alert(response);
}
});
这是我当前的 PDO PHP 文件:
<?php
$servername = myservername;
$username = myusername;
$password = mypassword;
$dbname = mydbname;
//Create connection:
try {
$conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
// set the PDO error mode to exception
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $conn->prepare("UPDATE `Balance`
SET `goldbalance` = `goldbalance` + 100,
`invite` = 1,
WHERE `facebookID` = :requestId,
foreach($_POST['requestid'] as $requestId){
`facebookID`="($requestId)"; }");
$stmt->bindParam(':requestid', $requestid);
$requestid = $_POST['requestid'];
$stmt->execute();
$conn->commit();
echo "Success";
}
catch(PDOException $e)
{
echo "Error: " . $e->getMessage();
}
$conn = null;
?>
我一直在尝试将此作为准备好的 PDO 语句来执行,因为我读过它更安全,但我很确定我对数组中的每个项目都错误地执行了更新循环。
此外,我不确定这条线是否是将玩家的金币余额(即 INT)增加 100 的正确方法:SET `goldbalance` = `goldbalance` + 100,
如能提供任何帮助,我们将不胜感激,在此先感谢您!
您的语法无效 PHP 语法。您不能只在字符串中创建 foreach
。
用占位符写下你的语句,然后遍历所有 requestId
以根据需要多次执行语句。
看看这段代码,它应该可以正常工作。
try {
$conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
// set the PDO error mode to exception
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $conn->prepare("UPDATE `Balance`
SET `goldbalance` = `goldbalance` + 100,
`invite` = 1
WHERE `facebookID` = :requestId");
$stmt->bindParam(':requestId', $requestId);
foreach($_POST['requestid'] as $r) {
$requestId = $r;
$stmt->execute();
}
echo "Success";
}
catch(PDOException $e)
{
echo "Error: " . $e->getMessage();
}
此外,您的$con->commit()
没有用,因为您没有开始交易。
安全注意事项
正如 Marc B 在评论中所说,您的代码 容易受到 SQL 注入 的攻击。在将数据用于查询之前,您应该了解如何从用户输入中清理数据。