errorInfo не работает должным образом - PullRequest
0 голосов
/ 05 июля 2019

Я пытаюсь написать всеобъемлющий API с php для принятия мер. Таким образом, даже если один из входных запросов не выполняется, он должен быть отменен, а другие представления не должны выполняться. И это сделано хорошо. Но проблема в том, что команда errorInfo () выдает ошибку только при запуске 1 запроса, например:

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 голосов
/ 09 июля 2019

это сработало.

$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();
}
0 голосов
/ 05 июля 2019

Сначала вы должны включить режим исключения для всех запросов:

$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);
}
...