0

我正在编写 Facebook 登录脚本,但遇到了麻烦,因为我不知道是否需要 beginTransaction()、prepare()、execute() 和 commit()。

这是我的代码;

<?php
session_start();

$MemberData = $_REQUEST['json'];

$db = new PDO("mysql:host=xxxxxxxx;dbname=xxxxx", 'xxxxxxxxxx', 'xxxxxxxx');
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

try { 
    $db->beginTransaction();
    $query = $db->query("INSERT INTO `subscribers` (`facebook_id`,`first_name`,`last_name`,`email`) VALUES (:faceid, :first_name, :last_name, :email)");

    $sth = $db->prepare($query);

    $sth->execute(array(
    ":faceid" => $MemberData['id'],
    ":first_name" => $MemberData['first_name'],
    ":last_name" => $MemberData['last_name'],
    ":email" => $MemberData['email'])
);
    $Lastid = $db->lastInsertId();
    $_SESSION['user_id'] = $Lastid;
    $db->commit();  

} catch (PDOException $e) {
    //$db->rollBack();
    die($e->getMessage());
    }

问题是这不是将数据插入数据库。但是,如果我将值设置为字符串并注释掉以 $sth 开头的大部分代码并将值设置为“字符串”数据,则脚本会插入数据。

任何关于我在这里错的想法将不胜感激,我提前感谢你。

4

3 回答 3

3

PDO::query()触发单个查询;就像听起来一样,这不与其他方法结合使用。您通常将其用于不采用任何用户提供的参数的查询。

PDO::prepare() 准备一个带有占位符的查询,您稍后会使用它::execute()。这两种方法结合在一起。当使用用户提供的值作为查询的一部分时,您应该始终使用它。

交易对于两者都是可选的,但如果您只是启动一个查询,通常是无用的。

在您的情况下,您需要prepare('INSERT INTO ...')使用占位符,然后execute()是带有实际数据的准备好的语句。


因此,为了清楚地说明这一点:

try { 
    $sth = $db->prepare("INSERT INTO `subscribers` (`facebook_id`,`first_name`,`last_name`,`email`) VALUES (:faceid, :first_name, :last_name, :email)");

    $sth->execute(array(
        ":faceid"     => $MemberData['id'],
        ":first_name" => $MemberData['first_name'],
        ":last_name"  => $MemberData['last_name'],
        ":email"      => $MemberData['email']
    ));

    $_SESSION['user_id'] = $db->lastInsertId();
} catch (PDOException $e) {
    die($e->getMessage());
}
于 2013-06-05T15:50:26.250 回答
0

它必须是什么

<?php
session_start();

$db = new PDO("mysql:host=xxxxxxxx;dbname=xxxxx", 'xxxxxxxxxx', 'xxxxxxxx');
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$query = "INSERT INTO subscribers (facebook_id,first_name,last_name,email) 
             VALUES (:id, :first_name, :last_name, :email)";
$sth = $db->prepare($query);
$sth->execute($_REQUEST['json']);

$_SESSION['user_id'] = $db->lastInsertId();

没有所有无用的代码

如果您通过 AJAX 调用调用此代码,则必须以某种方式检查可能的错误 - 在 Firebug 控制台或 Web 服务器日志中。

顺便一提。我不确定您是否已经在有关该主题的众多问题之一中发布了表格结构。但是,无论如何,这将是一个好主意。似乎您的表很可能在 id 上没有 na auto_increment 属性

于 2013-06-05T16:21:32.640 回答
0

PDOStatement::execute将根据成功或失败返回 true 或 false - 仅仅因为它不会引发异常,并不意味着您的查询有效。

您需要检查查询是否成功,并阅读$db->errorInfo()以找出不成功的原因。

于 2013-06-05T15:56:53.430 回答