Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/244.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在通过PDO提交查询时遇到困难_Php_Pdo - Fatal编程技术网

Php 在通过PDO提交查询时遇到困难

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

我正在编写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());
    }
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
变量和返回值。如果没有?(顺便说一句,它没有