我正在使用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”数据,则脚本会插入数据。
我对此处的错误提出任何想法都会非常感激,我提前感谢你。
答案 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属性