我有使用PDO的这个PHP代码
$q = "START TRANSACTION;";
$q = "INSERT INTO `student` (`first_name`, `last_name`, `level`) VALUES ('Zac', 'Mark',2);";
$q.= " SET @lastId = (SELECT `id` FROM `student` ORDER BY `id` DESC LIMIT 1);";
$q .= " INSERT INTO `student_dep` (`stdnt_id`, `dep_id`) VALUES (@lastId, 2);";
$q .= " COMMIT;";
$db->query($q);
$check = $db->execute();
if($check){
echo "1";
}else{
echo "2";
}
现在这个查询不对,所以它假设返回false; 但它返回true并且不执行。 我该如何检查它是否已被执行?
答案 0 :(得分:2)
您的代码无法使用,因为您在PDO
对象上调用了PDOStatement
方法。 execute
包含$dsn = 'mysql:dbname=testdb;host=127.0.0.1';
$user = 'dbuser';
$password = 'dbpass';
try
{
$dbh = new PDO($dsn, $user, $password);
$dbh>setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
catch (PDOException $e)
{
echo 'Connection failed: ' . $e->getMessage();
}
方法,因此我猜您在所有复制粘贴中丢失了一些内容。我会告诉你大多数人使用的正确方法,而不是回答你的问题。
1)创建PDO对象并将其设置为异常模式
try
{
// Prepare the insert for student table
$student = $dbh->prepare("INSERT INTO `student` (`first_name`, `last_name`, `level`) VALUES (?, ?, ?)");
// Prepare the insert for student_dep table
$student_dep = $dbh->prepare("INSERT INTO `student_dep` (`stdnt_id`, `dep_id`) VALUES (?, ?)");
// Start the transaction
$dbh->beginTransaction();
// Create the record in student table
$student->execute(['Zac', 'Mark', 2]);
// Create the record ind student_dep table using the last insert id generated by previous insert
$student_dep->execute([$dbh->lastInsertId(), 2]);
// Commit both inserts
$dbh->commit();
}
catch(PDOException $e)
{
// If there was an active transaction, roll back
if($dbh->inTransaction())
{
$dbh->rollBack();
}
}
2)准备语句,启动事务,绑定值,执行
\d{2}\\\d{2}\\\d{4}
如果在任何时候任何事情向南,你都会收到例外。在例外中,您可以执行所需的操作,例如报告,回滚,清理等。这是执行这些操作的正确方法。
答案 1 :(得分:0)
您应该单独执行每个查询,不过,您可以使用Trigger:
CREATE TRIGGER student_dep
AFTER INSERT ON student
FOR EACH ROW
BEGIN
INSERT INTO `student_dep` (`stdnt_id`, `dep_id`)
VALUES NEW.stdnt_id, NEW.level);
END;
答案 2 :(得分:0)
check将始终具有关于pdo的值,您可以做的最好的事情是在pdo上执行lastInsertId()或fetch(PDO :: FETCH_ASSOC)或fetchAll(PDO :: FETCH_ASSOC),即
FindViewById<T>(RESOURCE_ID)
var_dump check的值,如果为0则表示插入失败,如果不是零则插入数据