2015-05-13 2 views
2

У меня есть этот PHP-код с помощью PDOПроверьте выполнения запроса или нет

$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"; 
} 

Теперь этот запрос не является правильным, так что предположим, чтобы вернуться ложным; , но он возвращает true и не выполняется. Как я могу проверить, выполнено ли это или нет?

+0

Помимо того, что вы абсолютно не ошибетесь, почему вы даже что-то получили? '$ db' является экземпляром« PDO », поэтому - он не может иметь метод« execute() ». Вы хотите исправить это, чтобы правильно работать с PDO или вы хотите продолжать использовать свой собственный метод? –

+0

@NB, '$ db' является объектом класса соединения PDO и выполнить() и запрос() методы, которые я объявляемые в этом классе –

ответ

0

Вы должны выполнить каждый запрос отдельно, nstead, что вы можете использовать триггер:

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; 
+0

Теперь у меня есть этот код ' попробовать { \t $ db-> запрос ("CREATE TRIGGER student_dep \t \t \t \t ПОСЛЕ ВСТАВИТЬ на студента \t \t \t \t для каждой строки \t \t \t \t НАЧАТЬ \t \t \t \t INSERT INTO 'student_dep' (' stdnt_id', 'dep_id') \t \t \t \t VALUES (NEW.stdnt_id, 1); \t \t \t \t END; "); \t $ db-> Execute(); для ($ I = 0; $ я <3; $ я ++) { \t $ db-> запрос (" INSERT INTO студента ('first_name',' 'last_name', значения) level' ('имя_файла', LNAME», 1) "); \t $ db-> Execute();} } улов (PDOException $ е) { echo $ e-> getMessage(); } ' , но он не запускает триггер @Gioryo –

+0

Вы должны создать этот триггер в своей БД, лучше вручную. Сделать это с помощью кода должен сделать i t по объявлению и просто, если этого не существует. – Gioryo

0

проверка всегда будет иметь значение по отношению к PDO, самое лучшее, что вы можете сделать, это сделать lastInsertId () или выборки (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_dump значение проверки, если 0, то ваша вставка не удалась, если не обнулить данные вставляли

2

Ваш код не может работать, потому что вы вызываете метод execute на объекте PDO. PDOStatement содержит метод 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(); 
    } 
} 

Если что-то пойдет юг в любой точке, вы получите исключение. В пределах исключения вы делаете то, что вам нужно, например, отчетность, откат, очистка и т. Д. И это правильный способ выполнить эти действия.

+0

Этот код не откат со мной, и я использую таблицы InnoDB типа –

+0

. Этого недостаточно, чтобы определить, что происходит. –

+0

Я только что скопировал и пропустил ваш код, но я сделал второй запрос с именем non-exsist для отката первого запроса, но он не сделал –

Смежные вопросы