我正在尝试使用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语句调用和执行。
答案 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();
}