PHP: SQL Hazırlayan deyimi işlem düzgün çalışmıyor.

4 Cevap php

Ben PDO İşlem sadece benim 2 SQL deyiminin 1 İşleyen olduğunu bulma yaşıyorum. Nedense, benim PHP komut dosyası benim MySQL veritabanı 'homes' tablo içine sokarak değil AMA 'invoices' tabloya eklemek yok - Ben bir PHP PDO kullanıyorum olsa veritabanı işlem.

Aşağıdaki kodu:

$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();

Nasıl sadece 'invoices' tablo elemanını alma ve 'invoices' tablosu VE 'homes' tablo değil hem de olması mümkün mü?

Not: hiçbir hata PHP tarafından rapor edilmiştir.

4 Cevap

Öncelikle, gerçekten PHP herhangi bir hata olup olmadığını kontrol edin - sizi de söylüyorum herkesin bildiği bir saçmalık. Eğer veritabanı hatası bir özel durum için PDO nesneler üzerinde ayarlayabileceğiniz bir seçenek vardır - Ben bunu ayarlamak öneririz.

Bu satır ekleme olduğu gibi bana geliyor, ama bunu geri döndürülüyor olur böylece işlediği hiç bir işlem konum ve satır (Sizin izolasyon modu READ_COMMITTED veya daha yüksek) görülebilir değildir.

Bu durumda başvuru işlemleri kullanan nasıl yeniden incelemek ve düzgün tutarlı alabilirsiniz görmek için denemek gerekir. Hareketleri kullanarak saçma değildir; doğru şeyler almak için bir sürü kod, ya da bazı iyi düşünülmüş sarıcı kodunu falan da ihtiyacı var. Bunu herhangi anlamak yoksa, üzerinde autocommit bırakın.

Tablolarınızın işlem olduğunu kontrol edin (bir örnek olarak MyISAM InnoDB vs ..).

Bir hata varsa size geri alma böylece, bir try catch yapmak isteyebilirsiniz. Bu size biraz fikir verebilir.

Gerçek display_status için geçerli bir değer var mı?

MySQL bir bool türü yok, ne de önceden tanımlanmış bir işlev veya sabit olarak gerçek var. Yani benim tahminim bir sözdizimi hatası olmasıdır.

Bazı iyi hata işleme alın. Bir SQL hatası varken atar seçeneğini ayarlayın (PDO dokümanlar bakın!)

Ben sorunu buldum. Benim evleri masada ben 'eşsiz' olarak kabul edilen bir alan vardı ama o oluyor insert önlenmesi ve değil