Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/271.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_Mysql_Pdo - Fatal编程技术网

Php PDO事务中的意外结果

Php PDO事务中的意外结果,php,mysql,pdo,Php,Mysql,Pdo,我的问题有点简单,也许是我这边的一个愚蠢的错误。但我不知道在php中使用PDO时,我只是得到了意想不到的结果 代码是这样的 try { $_pdo = get_pdo_instance(); $_pdo->beginTransaction(); //query 1 $_pdo->query("some query"); // I have error in query 3 but this query 1 is still executed.

我的问题有点简单,也许是我这边的一个愚蠢的错误。但我不知道在php中使用PDO时,我只是得到了意想不到的结果

代码是这样的

try
{
    $_pdo = get_pdo_instance();

    $_pdo->beginTransaction();

    //query 1
    $_pdo->query("some query"); // I have error in query 3 but this query 1 is still executed.

    //query 2
    $_pdo->query("some query"); // only executes when there are no errors.

    //query 3
    $_pdo->query("some wrong query"); // let's say I have an error in this sql

    $_pdo->commit();

}
catch(Exception $ex)
{
    $_pdo->rollback();
}
我现在正在解释这个问题, 在给定的示例中,我在
query3
中遇到了一些sql错误,因此这些查询都不应该运行,因为它们都属于单个事务

但在我的例子中,即使
try
块中有错误,查询1也始终运行

也许这很简单,但我不知道为什么会这样

编辑: 函数定义

function get_pdo_instance()
{
    try 
    {
        $conn = new PDO('mysql:host='.DB_HOST.';dbname='.DB_NAME, DB_USER, DB_PASS);
        $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    } 
    catch(PDOException $e) 
    {
        die('ERROR: ' . $e->getMessage());
    }

    return $conn;
}

异常仅用于PHP错误。在上面的代码中,您试图捕获一个MySQL错误。当PHP读取您的try块时,一切看起来都很好,因此它不会捕获任何异常。 您可以使用PDO和MySQL执行错误检查,如:

if(!$_pdo->query("some query")) {
// Do something
}

异常仅用于PHP错误。在上面的代码中,您试图捕获一个MySQL错误。当PHP读取您的try块时,一切看起来都很好,因此它不会捕获任何异常。 您可以使用PDO和MySQL执行错误检查,如:

if(!$_pdo->query("some query")) {
// Do something
}
有关详细信息,请参阅文档。您需要打开异常引发

try {
  $_pdo = get_pdo_instance();
  $_pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

  $_pdo->beginTransaction();
  $_pdo->query("some query");
  $_pdo->query("some query");
  $_pdo->query("some wrong query");
  $_pdo->commit();
}
catch(Exception $ex) {
  $_pdo->rollback();
}
有关详细信息,请参阅文档。您需要打开异常引发

try {
  $_pdo = get_pdo_instance();
  $_pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

  $_pdo->beginTransaction();
  $_pdo->query("some query");
  $_pdo->query("some query");
  $_pdo->query("some wrong query");
  $_pdo->commit();
}
catch(Exception $ex) {
  $_pdo->rollback();
}
这是我的解决方案

我正在捕获
Exception
,而在本例中,我必须执行catch
PDOException

我想这解决了我的问题,但我还没有完全测试过这个东西。如果有更新,我会发布。

这是我的解决方案

我正在捕获
Exception
,而在本例中,我必须执行catch
PDOException



我想这解决了我的问题,但我还没有完全测试过这个东西。如果有更新,我会发布。

您在哪里创建
$\u pdo
?它是否在
try
之外?我认为您缺少这一点:您必须告诉PDO在查询失败时抛出异常。否则它将从查询返回
false
,然后继续。@Jordy我在文件中的某个地方定义了
get_pdo_instance()
函数。此函数创建并返回pdo连接。@Sirko我将尝试一下,但为什么只执行查询1而不执行查询2?您的查询是否有数据库定义语言(DDL)语句?诸如
DROP TABLE
CREATE TABLE
之类的语句会自动提交,即使您稍后回滚。您在哪里创建
$\u pdo
?它是否在
try
之外?我认为您缺少这一点:您必须告诉PDO在查询失败时抛出异常。否则它将从查询返回
false
,然后继续。@Jordy我在文件中的某个地方定义了
get_pdo_instance()
函数。此函数创建并返回pdo连接。@Sirko我将尝试一下,但为什么只执行查询1而不执行查询2?您的查询是否有数据库定义语言(DDL)语句?诸如
DROP TABLE
CREATE TABLE
之类的语句会自动提交,即使稍后回滚也是如此。可以将PDO设置为实际引发异常-参见另一个答案。但是你的解决方案也是有效的,一个可以将PDO设置为实际抛出异常——参见另一个答案。但是你的解决方案也是有效的。它是打开的,请在我的帖子中查看我的函数代码。还是你认为我必须在功能之外做?如果是,原因是什么?啊,好的。我错过了。您不应该在函数定义之外执行此操作。您确定SQL语句无效并且代码执行将进入catch块吗?如果SQL有效,则不会引发异常。另外,你能澄清一下。。。您是否希望在返回0个结果时引发PDOException?如果启用,请在我的帖子中查看我的函数代码。还是你认为我必须在功能之外做?如果是,原因是什么?啊,好的。我错过了。您不应该在函数定义之外执行此操作。您确定SQL语句无效并且代码执行将进入catch块吗?如果SQL有效,则不会引发异常。另外,你能澄清一下。。。您是否希望在返回0个结果时引发PDOException?捕获
\Exception
将捕获
PDOException
@N.B.我个人对此不确定,因此我没有选择正确的答案。仍在检查。捕获
\Exception
将捕获
PDOException
@N.B。我个人对此不确定,因此我没有选择正确的答案。还在检查。