Php 在通过PDO提交查询时遇到困难
我正在编写Facebook登录脚本,但遇到了问题,因为我不知道是否需要beginTransaction()、prepare()、execute()和commit() 这是我的密码Php 在通过PDO提交查询时遇到困难,php,pdo,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(P
<?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());
}
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());
}
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());
}
PDOStatement::execute
将根据成功或失败返回true或false-仅仅因为它不会引发异常,并不意味着查询工作正常
您需要检查查询是否成功,并从$db->errorInfo()
中读取以找出原因。
将根据成功或失败返回true或false-只是因为它没有引发异常,并不意味着您的查询成功
您需要检查查询是否成功,并从$db->errorInfo()
中读取,以找出原因。它必须是什么
<?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();
必须是什么
<?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();
使用var\u dump($db->ErrorInfo())
和var\u dump($sth->ErrorInfo())
你得到了什么?没有例外吗?@andrewsi我不知道。。。问题是这个页面是来自facebook登录脚本的AJAX调用的一部分,所以我无法从这个页面输出任何内容。(另一个页面调用此脚本,插入数据,然后访问者登录并重定向)@Jack(对我来说)奇怪的是,由于此页面在BG中运行,我从未看到单个db操作的任何错误/异常,因此不需要事务。如果您正在执行多个都需要成功的db操作,则只需要一个事务。根据定义,单个查询已经是一个原子操作。您是否在$\u请求参数中获得了实际的JSON字符串?如果是这样的话,你需要先对它进行json解码(),然后才能将它用作php中的数组…你对var\u dump($db->ErrorInfo())
和var\u dump($sth->ErrorInfo())
?没有例外吗?@andrewsi我不知道。。。问题是这个页面是来自facebook登录脚本的AJAX调用的一部分,所以我无法从这个页面输出任何内容。(另一个页面调用此脚本,插入数据,然后访问者登录并重定向)@Jack(对我来说)奇怪的是,由于此页面在BG中运行,我从未看到单个db操作的任何错误/异常,因此不需要事务。如果您正在执行多个都需要成功的db操作,则只需要一个事务。根据定义,单个查询已经是一个原子操作。您是否在$\u请求参数中获得了实际的JSON字符串?如果是这样的话,您需要先对其进行json_decode()解码,然后才能将其用作php中的数组。基本上,OP,您必须从查询字符串周围删除$db->query
函数。此外,如果您没有得到异常或错误,您可能希望打开错误报告on@deceze我非常感谢你的帮助。我完全按照您上面提供的方式实现了代码,但是由于我不知道的原因,会话无法设置。但是,如果我通过将=设置为现有ID(即1,我的ID)手动设置会话,那么会话将设置,并且一切看起来都很好,但是当我使用$_session['user_ID']=$db->lastinertid()时;它不起作用。有什么想法吗?@Stuart在这种情况下,准备好调试这个脚本。没有人能在黑暗中工作;您需要检查PHP和MySQL的错误日志(打开查询日志),检查脚本输出,在没有AJAX的情况下调用脚本,或者检查浏览器控制台中的脚本返回值、var\u dump
变量和返回值。基本上,OP,您必须从查询字符串周围删除$db->query
函数。此外,如果您没有得到异常或错误,您可能希望打开错误报告on@deceze我非常感谢你的帮助。我完全按照您上面提供的方式实现了代码,但是由于我不知道的原因,会话无法设置。但是,如果我通过将=设置为现有ID(即1,我的ID)手动设置会话,那么会话将设置,并且一切看起来都很好,但是当我使用$_session['user_ID']=$db->lastinertid()时;它不起作用。有什么想法吗?@Stuart在这种情况下,准备好调试这个脚本。没有人能在黑暗中工作;您需要检查PHP和MySQL的错误日志(打开查询日志记录),检查脚本输出,在没有AJAX的情况下调用脚本,或者检查浏览器控制台中的脚本返回值、var\u dump
变量和返回值。如果没有?(顺便说一句,它没有