带有准备好的语句的 PDO 事务不起作用

PDO Transaction with Prepared Statements not working

我有一个 PDO 事务,我在其中尝试使用准备好的语句对我的数据库进行 运行 两个查询。它们都是插入语句,它们将来自 Facebook 的数据插入到两个单独的表中(名为 "player" 和 "bank")。

Facebook 数据通过 AJAX post 发送到此 php 脚本。我已经确定我的数据库是 InnoDB,所以它与 PDO 事务兼容,并且 Facebook 数据正在到达 php 脚本(因为我尝试了一个 basic/unsecure Insert 语句与这个 AJAX post 并且运行良好),但我似乎无法让事务处理准备好的语句。我认为我错误地整合了两者。

这是我当前的代码:

<?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 的输出是什么,但它给了我一个空白结果。

如果有人能给我任何建议,那就太棒了! 另外,这是对我的数据库进行 运行ning 查询的非常安全的方法吗?它可以免受注入攻击吗?

提前致谢!

每笔交易应以

开头
beginTransaction()

并以

结束
commit()

您可以在执行最后一个查询后立即提交事务:

$stmt->execute();
$conn->commit();