Не могу сохранить данные, когда движок InnoDB, но успешно, когда MyISAM

Im разрабатывает приложение PHP с бэкэндом MySQL, и есть неудачное событие, которое я не могу сохранить данные в MySQL из PHP-скрипта. Нет ошибок или что-то еще, но когда я попытался вставить данные напрямую, используя phpmyadmin, данные были сохранены. Когда я проверил механизм базы данных... сказал InnoDB... Что-то в моем сознании подсказывает мне изменить его на MyISAM, и когда я это сделал... это сработало. Я попытался понять, что произошло, но не повезло. Может кто-нибудь объяснить, что произошло. Я использую PDO в этом отношении.

require("path/to/connection.php");
//sample userid
$userid = 10;

try{
 $conn->beginTransaction();
 $query = $conn->prepare("INSERT INTO mytable(userid) VALUES(:userid)");
 $query->bindParam(":userid",$userid,PDO::PARAM_INT);
 $query->execute();
}catch(PDOException $e){
 $conn->rollBack();
 echo $e;
}
1 ответ

Вы начинаете транзакцию, но не совершаете ее. Поскольку MyISAM не поддерживает транзакции, не имеет значения, что вы не совершаете, но InnoDB не будет записывать данные до тех пор, пока вы это сделаете.

Вам нужно сделать это:

try{
 $conn->beginTransaction();
 $query = $conn->prepare("INSERT INTO mytable(userid) VALUES(:userid)");
 $query->bindParam(":userid",$userid,PDO::PARAM_INT);
 $query->execute();
 $conn->commit();

}catch(PDOException $e){
 $conn->rollBack();
 echo $e;
}

Для одного оператора INSERT нет смысла использовать транзакции, поэтому вы можете сделать это:

try{
 $query = $conn->prepare("INSERT INTO mytable(userid) VALUES(:userid)");
 $query->bindParam(":userid",$userid,PDO::PARAM_INT);
 $query->execute();
}catch(PDOException $e){
 $conn->rollBack();
 echo $e;
}

licensed under cc by-sa 3.0 with attribution.