繁体   English   中英

MySQL / MariaDB交易访问冲突1064

[英]MySQL/MariaDB transaction access violation 1064

我在事务查询方面遇到了一些麻烦。 我有2个表,“主题”和链接表调用“ tutorsubjects”。 我正在使用MariaDB 10.0.21版。 我创建了以下查询,但始终收到“语法错误或访问冲突:1064”错误。

public function addSubject($values){        

    try {
        $temp = $this->db->query("
        BEGIN;
        INSERT INTO subjects
        (subject_code, subject_name, subject_grade, subject_description, subject_category)
        VALUES (:subject_code, :subject_name, :subject_grade, :subject_description, :subject_category);

        SET @last_id = LAST_INSERT_ID();

        INSERT INTO tutorsubject
        (tutor_id , subject_id)
        VALUES (:tutor_id, @last_id);
        COMMIT;",$values);
        return $temp;
    } catch (DBException $e) {
        echo "Error:<br/>" . $e->getMessage();
        return null;
    } catch (Exception $e) {
        echo "Error:<br/>" . $e->getMessage();
        return null;
    }
}

以下是解析到查询的值

$array = array("subject_code" => $code,
    "subject_name" => $subject_name,
    "subject_grade" => $grade,
    "subject_description" => $subject_description,
    "subject_category" => $subject_category, 
    "tutor_id"=>$selecttutor);

我收到以下错误:

SQLSTATE [42000]:语法错误或访问冲突:1064 SQL语法有错误; 检查与您的MariaDB服务器版本相对应的手册以在``reach''附近使用正确的语法。'subjects'(第1行的'subject_code','subject_name','subject_grade','subject_de'原始SQL:INSERT INTO'达到''.'subjects'('subject_code','subject_name','subject_grade','subject_description','subject_category')VALUES(:subject_code,:subject_name,:subject_grade,:subject_description,:subject_category);

我的问题是,当我在phpMyAdmin中运行此查询时,它可以完成而没有任何问题。 我使用此处找到的PDO MySQL类作为我与数据库交互的基础。 我开始认为也许该类不直接支持交易?

任何想法将不胜感激。

您应该尝试不使用COMMITBEGIN查询。

尝试:

 // start the transaction
 $this->db->query("BEGIN;");

 //rest of your queries with db->query() go here
 $this->db->query("INSERT INTO subjects
    (subject_code, subject_name, subject_grade, subject_description, subject_category)
    VALUES (:subject_code, :subject_name, :subject_grade, :subject_description, :subject_category);

    SET @last_id = LAST_INSERT_ID();

    INSERT INTO tutorsubject
    (tutor_id , subject_id)
    VALUES (:tutor_id, @last_id);");

 //commit
 $this->db->query("COMMIT;");

MySQL试图将所有这些作为一个查询执行,并且无法将整个命令识别为单独的查询。 PhpMyadmin单独将它们分开,这就是它们在那里正确运行的原因。

在数据库和表名周围添加了撇号。 这在语法上是错误的(除非您已打开特定的ansi模式)。 他们需要成为背景主义者(`)。

尝试让PHP进行工作+使用PDO事务处理方法,值部分未经测试,因此您需要确保其正确:

$this->db->beginTransaction();

$this->db->query("INSERT INTO subjects
(subject_code, subject_name, subject_grade, subject_description, subject_category)
VALUES (:subject_code, :subject_name, :subject_grade, :subject_description, :subject_category)", $values);

$values['last_id'] = $this->db->lastInsertId();

if (empty($values['last_id'])) {
    $this->db->rollBack();
} else {
    $this->db->query("INSERT INTO tutorsubject
    (tutor_id , subject_id)
    VALUES (:tutor_id, :last_id)", $values);

    $this->db->commit();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM