PDO交易与准备好的报表无效

时间:2015-05-15 19:14:44

标签: php mysql pdo transactions prepared-statement

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

Facebook数据通过AJAX帖子发送到此PHP脚本。我确保我的数据库是InnoDB,因此它与PDO Transactions兼容,并且Facebook数据正在到达php脚本(因为我尝试使用这个AJAX帖子的基本/不安全的Insert语句并且它工作得很好),但是我似乎无法让事务处理准备好的语句。我想我不正确地整合了两者。

这是我目前的代码:

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

如果有人能就此提出任何建议,那就太棒了! 此外,这是一种在我的数据库上运行查询的非常安全的方法吗?注射攻击是否安全?

提前致谢!

1 个答案:

答案 0 :(得分:2)

每笔交易都应以

开头
beginTransaction()

结束
commit()

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

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