检查查询是否执行

时间:2015-05-13 09:35:47

标签: 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` (`stdnt_id`, `dep_id`) VALUES (@lastId, 2);";
$q .= " COMMIT;";  
$db->query($q);
$check = $db->execute();
if($check){
   echo "1";
}else{
  echo "2";
}

现在这个查询不对,所以它假设返回false; 但它返回true并且不执行。 我该如何检查它是否已被执行?

3 个答案:

答案 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则表示插入失败,如果不是零则插入数据