【问题标题】:PDO Transaction with Prepared Statements not working带有准备好的语句的 PDO 事务不起作用
【发布时间】: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


【解决方案1】:

每笔交易都应该以

开头
beginTransaction()

并以

结尾
commit()

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

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

【讨论】:

    猜你喜欢
    • 2021-08-15
    • 2018-01-24
    • 2011-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多