2016-04-13 111 views
1

Ben 2 veya daha fazla değil aynı sorguları yürütmek gerekir (bu örnekte INSERT 'ın.) PHP'nin hazır deyimleri ve MySQL'ın işlemlerini kullanarak. Yani, bir 2 INSERT ifadem varsa, bunların ikisini de isterim, isterse bunların hiçbirini istemiyorum.MySQL'in işlemiyle PHP'nin hazırladığı istatistikleri kullanarak çoklu sorguları nasıl yürütürüm?

ben bir PHP kodu bu örnek MySQL işlem traslate istiyorum

:

START TRANSACTION; 
    INSERT INTO `file` (`name`, `mime_type`, `size`, `comment`) VALUES ('file.png', 'image/png', '1024', 'My comment'); 
    INSERT INTO `complementary_file` (`file_id`, `user_id`) VALUES (LAST_INSERT_ID(), '1'); 
COMMIT; 

PHP kodu Üzerinde çalıştığım: Ben daha kritik olması

mysqli_autocommit($connection, FALSE); 
if ($stmtFile = mysqli_prepare($connection, "INSERT INTO `file` (`name`, `mime_type`, `size`, `comment`) VALUES (?, ?, ?, ?)")) { 
    mysqli_stmt_bind_param($stmtFile, 'ssis', $name, $mime_type, $size, $comment); 
    if (mysqli_stmt_execute($stmtFile)) { 
     if ($stmtComplementaryFile = mysqli_prepare($connection, "INSERT INTO `complementary_file` (`file_id`, `user_id`) VALUES (?, ?)")) { 
      mysqli_stmt_bind_param($stmtComplementaryFile, 'ii', mysqli_insert_id($connection), $user_id); 
      mysqli_stmt_execute($stmtComplementaryFile); 
     } 
    } else { 
     mysqli_rollback($connection); 
    } 
} 
mysqli_commit($connection); 

PHP eserleri Yukarıdaki kod ama ne olursa yürütme ifadeleri? Aynı anda PHP'nin hazırlanan Tabloları ve işlemlerle ifadeleri çalıştırmak için iyi bir yol vardır mı?

$stmtComplementaryFile için bir mysqli_insert_id() değere sahip olması gerektiğini lütfen unutmayın. Ayrıca bu kod ile PDO kullanmadığımı lütfen unutmayın - Öneriler MySQLi olacaksa teşekkür ederim. Teşekkürler.

+0

izledi? (not: bu, sorunuzu cevaplamak değil, sadece merak ediyorum çünkü bir işlemi çeviriyorsunuz ama PHP'de bir işlem kullanmıyorsunuz). ($ Bağlantısı, YANLIŞ) mysqli_autocommit '' sonra;; – apokryfos

+0

ben 'mysqli_begin_transaction ($ bağlantısı, MYSQLI_TRANS_START_READ_ONLY) eklenir' ve şimdi her ikisi 'INSERT' en çalışmaz. –

+0

Tahminimce salt okunur bir işlem olduğunda işe yaramaz. – apokryfos

cevap

0

aşağıdaki SQL: Bu iki ifadeleri ancak bilmek iyi bir fikir, eşdeğerdir Genelde

mysqli_begin_transaction($connection, MYSQLI_TRANS_START_READ_WRITE); 
if ($stmtFile = mysqli_prepare($connection, "INSERT INTO `file` (`name`, `mime_type`, `size`, `comment`) VALUES (?, ?, ?, ?)")) { 
    mysqli_stmt_bind_param($stmtFile, 'ssis', $name, $mime_type, $size, $comment); 
    if (mysqli_stmt_execute($stmtFile)) { 
     if ($stmtComplementaryFile = mysqli_prepare($connection, "INSERT INTO `complementary_file` (`file_id`, `user_id`) VALUES (?, ?)")) { 
      mysqli_stmt_bind_param($stmtComplementaryFile, 'ii', mysqli_insert_id($connection), $user_id); 
      mysqli_stmt_execute($stmtComplementaryFile); 
     } 
    } else { 
     mysqli_rollback($connection); 
    } 
} 
mysqli_commit($connection); 

şu şekildedir:

START TRANSACTION; 
    INSERT INTO `file` (`name`, `mime_type`, `size`, `comment`) VALUES ('file.png', 'image/png', '1024', 'My comment'); 
    INSERT INTO `complementary_file` (`file_id`, `user_id`) VALUES (LAST_INSERT_ID(), '1'); 
COMMIT; 

(hazırlanan ifadelere) PHP dönüştürülebilir Can Hangi işlemler ve hangi işlemler değildir.

İşlemleri bunlardan TÜM başarılı yalnızca toplu işlemler veritabanında atomik yürütülür ve bunların sonuçları yansıtılmasını sağlamak için bir mekanizma vardır. İşlemlerin atomicity olmasını sağlar.

İşlemler tablolarda karşılıklı dışlama kilidi uygulamak için bir mekanizma değildir. Bir tablonun kilitlenmesi gerekiyorsa, LOCK TABLES [READ|WRITE] kullanılmalıdır. Eşdeğer bir PHP bunu bir yaparak elde edilir:

mysqli_query($connection, "LOCK TABLES tableName as TableAlias [read|write]"); 

Eğer hazırlar önce `mysqli_begin_transaction` çalıştırmanız gerekmez mı

mysqli_query($connection, "UNLOCK TABLES");