【发布时间】:2015-07-27 19:54:12
【问题描述】:
我有一个 PDO 事务,我在其中尝试使用准备好的语句在我的数据库上运行两个查询。它们都是插入语句,它们将来自 Facebook 的数据插入到两个单独的表中(名为“玩家”和“银行”)。
Facebook 数据通过 AJAX 帖子发送到此 php 脚本。我已经确定我的数据库是 InnoDB,因此它与 PDO Transactions 兼容,并且 Facebook 数据正在到达 php 脚本(因为我在这个 AJAX 帖子中尝试了一个基本/不安全的插入语句并且它运行良好),但我可以似乎没有让事务与准备好的语句一起工作。我认为我错误地整合了两者。
这是我当前的代码:
<?php
$servername = "myserver";
$username = "myusername";
$password = "mypassword";
$dbname = "mydatabase";
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);
$conn->beginTransaction();
// prepare sql and bind parameters
$stmt = $conn->prepare("INSERT INTO player (fb_id, f_name, l_name, email, gender)
VALUES (:fb_id, :firstname, :lastname, :email, :gender)");
$stmt->bindParam(':fb_id', $userid);
$stmt->bindParam(':firstname', $userfirst_name);
$stmt->bindParam(':lastname', $userlast_name);
$stmt->bindParam(':email', $useremail);
$stmt->bindParam(':gender', $usergender);
$userid = $_POST['userid'];
$userfirst_name = $_POST['userfirst_name'];
$userlast_name = $_POST['userlast_name'];
$useremail = $_POST['useremail'];
$usergender = $_POST['usergender'];
$stmt->execute();
$stmt = $conn->prepare("INSERT INTO bank (fb_id, cb, gb, invite)
VALUES (:fb_id, :cb, :gb, :invite)");
$stmt->bindParam(':fb_id', $userid);
$stmt->bindParam(':cb', $cb);
$stmt->bindParam(':gb', $gb);
$stmt->bindParam(':invite', $invite);
$userid = $_POST['userid'];
$cb = "100";
$gb = "0";
$invite = "0";
$stmt->execute();
}
catch(PDOException $e)
{
echo "Error: " . $e->getMessage();
}
$conn = null;
?>
我尝试使用 alert(response); 来查看这个 PHP 的输出是什么,但它给了我一个空白的结果。
如果有人可以就此给我任何建议,那就太棒了! 另外,这是在我的数据库上运行查询的一种非常安全的方法吗?它免受注入攻击吗?
提前致谢!
【问题讨论】:
-
错误报告是否开启?确保它是
error_reporting(E_ALL); -
您在浏览器的控制台中查看过请求/响应吗? Quit using
alert()for troubleshooting.,请改用console.log()。 -
您需要提交您的交易。在脚本末尾(执行后)使用$conn->commit() 将更改应用到您的数据库。
标签: php mysql pdo transactions prepared-statement