errorInfo无法正常工作

时间:2019-07-05 10:29:40

标签: php mysql pdo transactions

我正在尝试使用php编写全面的API以采取措施。 因此,即使未执行输入查询之一,也应将其取消,并且不应执行其他视图。 这做得很好。 但是问题在于,仅当您运行1查询时命令errorInfo ()才会出现错误,例如:

INSERT INTO Funds (City, BuyDate, PhoneNo) Values ('london', '2019/01/01', 0554);

但是,如果您有多个查询,则命令errorInfo ()将显示[0000,null,null]的值。例如:

INSERT INTO Funds (City ,BuyDate, PhoneNo ) VALUES ('london', '2019/01/01',0554);

INSERT INTO HouseholdAdmin (HouseholdAdminId ,AdminCode , FundId ) VALUES (2,2,1);

第二个队列HouseholdAdmin包含错误,但是errorInfo ()命令仅在单独运行时有效。

我的Api:

include "connect.php";

$inputdata = json_decode(file_get_contents('php://input'), true);

$query = "SELECT * FROM QueryBank WHERE QueryName=:name";
$result = $connect->prepare($query);
$result->bindParam("name", $inputdata["ViewName"]);

$result->execute();

if ($row = $result->FETCH(PDO::FETCH_ASSOC)) {
    $query2 = $row["QueryString"];
    $parameters = $inputdata["parameters"];

    for ($x = 0; $x < count($parameters); $x++) {
        $query2 = str_replace($inputdata["parameters"][$x]["key"], $inputdata["parameters"][$x]["value"], $query2);
    }

    $back = array();
    $back["code"] = 0000;
    $back["error"] = null;

    try {
        $connect->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $connect->beginTransaction();
        $result2 = $connect->prepare($query2);
        $result2->execute();
        $connect->commit();
        echo json_encode($back);

    } catch (Exception $e) {
        $connect->rollback();

        $back["code"] = $result2->errorInfo()[1];
        $back["error"] = $result2->errorInfo()[2];
        echo json_encode($back);
    }
}

应注意,查询存储在表中,并使用select语句调用和执行。

2 个答案:

答案 0 :(得分:0)

首先,您应该为所有查询启用例外模式:

$options = [
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
];

$connect= new PDO($dsn, $username, $password, $options);

然后将所有查询包装到try / catch块中,然后使用Exception对象获取最后一个错误。

} catch (Exception $e) {
   $connect->rollback();

   $back["code"] = $e->getCode();
   $back["error"] = $e->getMessage();
   echo json_encode($back);
}

答案 1 :(得分:-1)

这有效。

$db = new PDO("mysql:host=localhost;dbname=yourTable", 'username', 'pass');
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT);
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, 1);

$sql = "

START TRANSACTION;

INSERT INTO Funds (City , PhoneNo ) VALUES ('jj',7777777);

INSERT INTO HouseholdAdmin (HouseholdAdminId ,AdminCode , FundId ) VALUES ('2','2','1');

COMMIT;

";

$stmt = $db->prepare($sql);
$stmt->execute();
$i = 0;

do {
  $i++;
} while ($stmt->nextRowset());

$error = $stmt->errorInfo();
if ($error[0] != "00000") {
  echo "Query $i failed: " . $error[2];
  die();
}