PHP транзакция в порядке, но база данных mySql не изменилась

У меня проблема со вставкой записей в mySql db из сценария php. Вот мой код:

// Set fields for post record insertion
$insertPostSql = "INSERT INTO tl_posts(title, city, city_id, video_url, thumbnail_url, description, longitude, latitude, user_id, category, hotel_id, restaurant_id, activity_id, creation_date, qualified)
VALUES(:title, :city, :cityId, :video, :thumbnail, :description, :long, :lat, :userid, :category, :hotelId, :restoId, :activityId, :crea, :checked)";
$insertPostStmt = $pdo->prepare($insertPostSql);
$insertPostStmt->bindValue(':title', $title);
$insertPostStmt->bindValue(':city', $city);
$insertPostStmt->bindValue(':cityId', $cityId);
$insertPostStmt->bindValue(':video', substr($videoPath, strlen(ROOT_PATH)));
$insertPostStmt->bindValue(':thumbnail', substr($thumbnailPath, strlen(ROOT_PATH)));
$insertPostStmt->bindValue(':description', $description);
$insertPostStmt->bindValue(':long', $longitude);
$insertPostStmt->bindValue(':lat', $latitude);
$insertPostStmt->bindValue(':userid', $userId);
$insertPostStmt->bindValue(':category', $category);
$insertPostStmt->bindValue(':hotelId', ($category === 'hotel' ? $categoryId : "NULL"));
$insertPostStmt->bindValue(':restoId', ($category === 'restaurant' ? $categoryId : "NULL"));
$insertPostStmt->bindValue(':activityId', ($category === 'activity' ? $categoryId : "NULL"));
$insertPostStmt->bindValue(':crea', $now);
$insertPostStmt->bindValue(':checked', $checked);

// New post transaction
$pdo->beginTransaction();
try {
$insertPostStmt->execute();
$pdo->commit();
$response['result']['database'] = "Post added successfully";
} catch (Exception $e) {
$pdo->rollBack();
$response['result']['database'] = "Error! Post not saved in database";
die("Error! ".$e->getMessage());
}

Это приводит к сообщению «Сообщение добавлено успешно», но в БД ничего не сохраняется.
Каждое значение в порядке, я повторил их, прежде чем проверить. Синтаксис SQL тоже в порядке, потому что он работает на панели команд SQL базы данных.
В основном все поля Varchar. типы, кроме идентификаторов ‘id’ и последних двух, которые относятся к Datetime и Boolean.

Я должен сказать, что я использовал это утверждение раньше и что он работает нормально, поэтому с БД тоже все в порядке:

$insertSql = "INSERT INTO tl_posts(title, city, video_url, thumbnail_url, description, longitude, latitude, user_id, category, creation_date, qualified)
VALUES(:title, :city, :video, :thumbnail, :description, :long, :lat, :userid, :category, :crea, :checked)";
$insertStmt = $pdo->prepare($insertSql);
$insertStmt->bindValue(':title', $title);
$insertStmt->bindValue(':city', $city);
$insertStmt->bindValue(':video', substr($videoPath, strlen(ROOT_PATH)));
$insertStmt->bindValue(':thumbnail', substr($thumbnailPath, strlen(ROOT_PATH)));
$insertStmt->bindValue(':description', $description);
$insertStmt->bindValue(':long', $longitude);
$insertStmt->bindValue(':lat', $latitude);
$insertStmt->bindValue(':userid', $userId);
$insertStmt->bindValue(':category', $category);
$insertStmt->bindValue(':crea', $now);
$insertStmt->bindValue(':checked', $checked);

Мне любопытно найти последнее слово об этом. Спасибо за помощь

0

Решение

Мне наконец удалось найти его, добавив каждый сценарий к функциональному утверждению (второй). До тех пор, пока я пытаюсь добавить NULL даже пустое строковое значение к одному из них, это не удается:

$insertPostStmt->bindValue(':hotelId', ($category === 'hotel' ? $categoryId : "NULL"));
$insertPostStmt->bindValue(':restoId', ($category === 'restaurant' ? $categoryId : "NULL"));
$insertPostStmt->bindValue(':activityId', ($category === 'activity' ? $categoryId : "NULL"));

Это не проблема, поскольку, поскольку они являются внешним ключом, по умолчанию они имеют значение NULL. Я просто должен сделать 3 разных заявления относительно случая категории.

Надеюсь, это поможет …

0

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

Возможно, вы неправильно улавливаете ошибку. Вы должны быть уверены, что уровень отчетности PDO в порядке.

Добавьте эти строки перед инициализацией pdo:

$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

Вам также может понадобиться перехватить правильное исключение pdo

try{
...
}
catch(PDOException $err)
{
...
}

Я думаю, что это может быть полезно

0