通过PDO提交查询遇到困难

时间:2013-06-05 15:41:06

标签: php pdo

我正在使用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开头的代码并将值设置为“string”数据,则脚本会插入数据。

我对此处的错误提出任何想法都会非常感激,我提前感谢你。

3 个答案:

答案 0 :(得分: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());
}

答案 1 :(得分:0)

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

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

答案 2 :(得分: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属性