Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/241.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 检查查询是否已执行_Php_Mysql_Pdo - Fatal编程技术网

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

我有这个使用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并且不执行。
如何检查它是否已执行?

您应该分别执行每个查询,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应该在声明时执行,如果还不存在的话。