BeginTransaction не может работать в PHP MySQL

Я хочу вставить данные в таблицы CLOUD и IDC.

Cloudid — это внешний ключ таблицы IDC, поэтому я хочу использовать транзакцию.

До $conn->beginTransaction(); а также $conn->commit(); добавлены, он работает нормально, но без них он работает нормально.

Вот мой код:

<?php
if($_GET["act"]=="add")
{
try
{
$conn=new PDO('mysql:host=localhost;port=3306;dbname=xxx' , 'root' , 'xxxx');

//$conn->beginTransaction();
$query="insert into CLOUD (name,date) VALUES('".$_POST['customerName']."','".$_POST['firstDay']."');
insert into  IDC (name,id,phone,cloudid) VALUES('".$_POST['engName3']."','".$_POST['engID3']."','".$_POST['engPhone3']."',LAST_INSERT_ID());
insert into  IDC (name,id,phone,cloudid) VALUES('".$_POST['engName4']."','".$_POST['engID4']."','".$_POST['engPhone4']."',LAST_INSERT_ID());
";

$stmt=$conn->query($query);
//$conn->commit();

echo "success";
}
catch(PDOException $e)
{
$conn->rollBack();
echo "connect failed!".$e->getMesage();
exit;
}

}
?>

0

Решение

Транзакции доступны только тогда, когда база данных использует InnoDB как двигатель хранения. Вы, вероятно, используете MyISAM

Посмотрите здесь для получения более подробной информации о разнице между механизмами хранения https://dev.mysql.com/doc/refman/5.7/en/storage-engines.html


В качестве примечания, ваш код уязвим для SQL-инъекций, потому что вы используете необработанные данные постов в необработанных запросах. Вы должны посмотреть там: Как я могу предотвратить внедрение SQL в PHP?

0

Другие решения

Попробуйте установить соединение и получить последний вставленный идентификатор, как показано ниже, также я бы порекомендовал вам использовать подготовленные заявления (см. http://php.net/manual/ru/pdo.prepare.php):

if($_GET["act"]=="add")
{
try {
$dbh = new PDO('mysql:host=localhost;port=3306;dbname=xxx', 'root', 'xxx',
array(PDO::ATTR_PERSISTENT => true));
echo "Connected\n";
} catch (Exception $e) {
die("Unable to connect: " . $e->getMessage());
}

try {
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

$dbh->beginTransaction();

$stmt = $dbh->prepare('insert into CLOUD (name,date) VALUES(:customerName,:firstDay)');
$stmt->execute([
'customerName' => $_POST['customerName'],
'firstDay' => $_POST['firstDay']
]);

$cloud_id = $dbh->lastInsertId();

$stmt = $dbh->prepare('insert into IDC (name,id,phone,cloudid) VALUES(:name,:id,:phone,:cloudid)');
$stmt->bindParam(':name', $name);
$stmt->bindParam(':id', $id);
$stmt->bindParam(':phone', $phone);
$stmt->bindParam(':cloudid', $cloud_id);

$name = $_POST['engName3'];
$id = $_POST['engID3'];
$phone = $_POST['engPhone3'];
$stmt->execute();

$name = $_POST['engName4'];
$id = $_POST['engID4'];
$phone = $_POST['engPhone4'];
$stmt->execute();

$dbh->commit();

} catch (PDOException $e) {
$dbh->rollBack();
echo "Failed: " . $e->getMessage();
}
}
0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector