Php PDO事务中的意外结果
我的问题有点简单,也许是我这边的一个愚蠢的错误。但我不知道在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.
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
,而在本例中,我必须执行catchPDOException
我想这解决了我的问题,但我还没有完全测试过这个东西。如果有更新,我会发布。这是我的解决方案
我正在捕获Exception
,而在本例中,我必须执行catchPDOException
我想这解决了我的问题,但我还没有完全测试过这个东西。如果有更新,我会发布。您在哪里创建
$\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。我个人对此不确定,因此我没有选择正确的答案。还在检查。