PHP: SQL Подготовленная транзакция оператора не работает правильно. Он вставляет 1 оператор SQL, а не оба - PullRequest
0 голосов
/ 13 октября 2009

Я обнаружил, что транзакция PDO передает только 1 из моих 2 операторов SQL. По какой-то причине мой PHP-скрипт не вставляется в мою таблицу базы данных MySQL 'homes', НО он вставляется в таблицу 'invoices' - хотя я использую транзакцию базы данных PHP PDO.

Код ниже:

$conn_str = DB . ':host=' . DB_HOST . ';dbname=' . DB_NAME;
$dbh = new PDO($conn_str, DB_USERNAME, DB_PASSWORD);

/* Begin a transaction, turning off autocommit */
$dbh->beginTransaction();

$sql_create_home_listing = 'INSERT INTO homes ( customer_id,
    account_type_id,
    address,
    city,
    state,
    zip,
    display_status
) VALUES (?,?,?,?,?,?,true)';

$stmt = $dbh->prepare($sql_create_home_listing);
$stmt->bindParam(1, $customer_id);
$stmt->bindParam(2, $account_type_id);
$stmt->bindParam(3, $_SESSION['street']);
$stmt->bindParam(4, $_SESSION['city']);
$stmt->bindParam(5, $_SESSION['state']);
$stmt->bindParam(6, $_SESSION['zip']);
$stmt->execute();
$home_id = $dbh->lastInsertId();

// another SQL statement
$sql_create_invoice = "INSERT INTO invoices (customer_id, account_type_id, price, cc_authorized, home_id) VALUES (?,?,?,?,?)";
$cc_authorized = false;
$anotherStmt = $dbh->prepare($sql_create_invoice);
$anotherStmt->bindParam(1, $customer_id);
$anotherStmt->bindParam(2, $account_type_id);
$anotherStmt->bindParam(3, $account_plan_price);
$anotherStmt->bindParam(4, $cc_authorized);
$anotherStmt->bindParam(5, $home_id);

$anotherStmt->execute();

/* Commit the changes */
$dbh->commit();

Как возможно, что вставка получает только таблица 'invoices', а не таблица 'invoices' И таблица 'homes'?

Примечание: PHP не сообщает об ошибках.

Ответы [ 4 ]

2 голосов
/ 13 октября 2009

Во-первых, проверьте, действительно ли у вас есть какие-либо ошибки в PHP - это общеизвестно дерьмо, сообщать вам. Существует возможность, которую вы можете установить для объектов PDO, чтобы вызвать исключение при ошибке базы данных - я рекомендую вам установить его.

Мне кажется, что она вставляет строку, но вы находитесь в транзакции, которая никогда не фиксируется, поэтому она откатывается, и строка никогда не видна (ваш режим изоляции READ_COMMITTED или выше).

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

0 голосов
/ 14 октября 2009

Я нашел проблему. На моем домашнем столе было поле, которое считалось «уникальным», но это не так, и вставка не происходила

0 голосов
/ 14 октября 2009

Является ли true допустимым значением для display_status?

MySQL не имеет тип bool и не имеет true в качестве предопределенной функции или константы. Поэтому я предполагаю, что это синтаксическая ошибка.

Получите приличную обработку ошибок. Установите параметр, который выбрасывает при возникновении ошибки SQL (см. Документацию PDO!)

0 голосов
/ 14 октября 2009

Убедитесь, что ваши таблицы являются транзакционными (InnoDB против MyISAM в качестве примера ..).

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

...