Php 检查查询是否已执行
我有这个使用PDO的php代码Php 检查查询是否已执行,php,mysql,pdo,Php,Mysql,Pdo,我有这个使用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
$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并且不执行。
如何检查它是否已执行?您应该分别执行每个查询,n请注意,您可以使用触发器:
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;
check总是有一个关于pdo的值,您可以做的最好的事情是在pdo上执行lastInsertId()或fetch(pdo::fetch_ASSOC)或fetchAll(pdo::fetch_ASSOC),即
$check = $db->lastInsertId() or
$check = $db->fetch(PDO::FETCH_ASSOC) or
$check = $db->fetchAll(PDO::FETCH_ASSOC)
var_转储check的值,如果为0,则插入失败;如果不是零,则插入数据您的代码无法工作,因为您正在调用
PDO
对象上的execute
方法PDO语句
包含execute
方法,因此我猜您在所有复制粘贴过程中丢失了一些内容。我不会回答你的问题,而是向你展示大多数人使用的正确做事方式
1) 创建PDO对象并将其设置为异常模式
$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();
}
2) 准备语句,启动事务,绑定值,执行
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();
}
}
如果任何东西在任何时候向南移动,您将收到一个异常。在例外情况下,您会做您需要做的事情,例如报告、回滚、清理等,这是执行这些事情的正确方式。除了尽可能地做错事之外,您怎么会得到回报
$db
是PDO
实例,因此-它不能有execute()
方法。您想修复此问题以使其与PDO正常工作,还是想继续尝试自己的方法?@N.B.,$db
是PDO连接类的对象,execute()和query()是是我在该类中声明的方法这段代码不是随我一起回滚的,我使用的InnoDB tables Type没有足够的信息来确定发生了什么。我只是复制并通过了你的代码,但我用不存在的表名进行了第二次查询以回滚第一次查询,但它不只是复制粘贴代码,试着理解它。您是使用不存在的表来准备查询,还是同时执行两个查询并最终得到一些记录?在解释如何确定查询没有回滚时,您必须非常清楚。如果你粘贴了answer中的代码,这意味着你准备了两条语句,没有插入任何内容,因此事务部分永远不会发生-因此如果没有事务,你不能回滚任何内容。我确实理解代码,我在代码中执行了两个查询,然后我让第一个执行,并将不存在的表放在第二个查询中,这样它回滚第一个,但它没有执行第一个,而第二个没有,所以它没有回滚现在我有了这个代码尝试{$db->query(“为每一行在student上插入后创建触发器student dep BEGIN INSERT INTO
student dep`(stdnt_id
,dep_id
)值(NEW.stdnt_id,1);END;”;$db->execute();FOR($i=0;$i<3;$i++){$db->查询($INSERT INTO student(first_name
,last_name
,level
)值('fname',lname',1);$db->execute();}}catch(PDOException$e){echo$e->getMessage();}`但它不执行触发器@GioryoYou应该在数据库上创建触发器,最好是手动创建。Make it by code应该在声明时执行,如果还不存在的话。