PHP + MySQL işlemleri örnekleri

5 Cevap php

Gerçekten MySQL işlemler kullanılmaktadır PHP dosyası normal bir örnek bulamadık. Bana da basit bir örnek gösterebilir misiniz?

Ve bir soru daha. Zaten programlama bir sürü yaptık ve işlemler kullanmak vermedi. Ben bir mysql_query başarısız olursa, o zaman diğerleri de başarısız olduğunu header.php bir PHP işlevini falan koyabilir miyim?


Ben bunu anladım düşünüyorum, doğru mu?:

mysql_query("SET AUTOCOMMIT=0");
mysql_query("START TRANSACTION");

$a1 = mysql_query("INSERT INTO rarara (l_id) VALUES('1')");
$a2 = mysql_query("INSERT INTO rarara (l_id) VALUES('2')");

if ($a1 and $a2) {
    mysql_query("COMMIT");
} else {        
    mysql_query("ROLLBACK");
}

5 Cevap

Işlemleri ile çalışırken ben genellikle kullanmak düşüncesi bu gibi görünüyor (semi-pseudo-code):

try {
    // First of all, let's begin a transaction
    $db->beginTransaction();

    // A set of queries; if one fails, an exception should be thrown
    $db->query('first query');
    $db->query('second query');
    $db->query('third query');

    // If we arrive here, it means that no exception was thrown
    // i.e. no query has failed, and we can commit the transaction
    $db->commit();
} catch (Exception $e) {
    // An exception has been thrown
    // We must rollback the transaction
    $db->rollback();
}


Note that, with this idea, if a query fails, an Exception must be thrown:


Unfortunately, there is no magic involved. You cannot just put an instruction somewhere and have transactions done automatically: you still have to specific which group of queries must be executed in a transaction.

Örneğin, oldukça sık işlem and you'll want those queries executed no matter what happened (or not) (before the begin) and another couple of queries after the transaction (after either commit veya rollback) işlem öncesi sorguları bir çift olacak .

Ben bunu anladım düşünüyorum, doğru mu?:

mysql_query("START TRANSACTION");

$a1 = mysql_query("INSERT INTO rarara (l_id) VALUES('1')");
$a2 = mysql_query("INSERT INTO rarara (l_id) VALUES('2')");

if ($a1 and $a2) {
    mysql_query("COMMIT");
} else {        
    mysql_query("ROLLBACK");
}

Bu "php mysql işlem" için google ilk sonuç olarak, ben açıkça mysqli'nin (orijinal yazar örnekler istediği gibi) ile bunu nasıl gösteren bir cevap eklemek istiyorum düşündüm. Burada PHP / mysqli'nin ile işlemlerin basitleştirilmiş bir örnek:

// let's pretend that a user wants to create a new "group". we will do so
// while at the same time creating a "membership" for the group which
// consists solely of the user themselves (at first). accordingly, the group
// and membership records should be created together, or not at all.
// this sounds like a job for: TRANSACTIONS! (*cue music*)

$group_name = "The Thursday Thumpers";
$member_name = "EleventyOne";
$conn = new mysqli($db_host,$db_user,$db_passwd,$db_name); // error-check this

// note: this is meant for InnoDB tables. won't work with MyISAM tables.

try {

    $conn->autocommit(FALSE); // i.e., start transaction

    // assume that the TABLE groups has an auto_increment id field
    $query = "INSERT INTO groups (name) ";
    $query .= "VALUES ('$group_name')";
    $result = $conn->query($query);
    if ( !$result ) {
        $result->free();
        throw new Exception($conn->error);
    }

    $group_id = $conn->insert_id; // last auto_inc id from *this* connection

    $query = "INSERT INTO group_membership (group_id,name) ";
    $query .= "VALUES ('$group_id','$member_name')";
    $result = $conn->query($query);
    if ( !$result ) {
        $result->free();
        throw new Exception($conn->error);
    }

    // our SQL queries have been successful. commit them
    // and go back to non-transaction mode.

    $conn->commit();
    $conn->autocommit(TRUE); // i.e., end transaction
}
catch ( Exception $e ) {

    // before rolling back the transaction, you'd want
    // to make sure that the exception was db-related
    $conn->rollback(); 
    $conn->autocommit(TRUE); // i.e., end transaction   
}

Ayrıca, PHP 5.5 yeni bir yöntem olduğunu akılda tutmak mysqli::begin_transaction. Ancak, bu PHP ekibi tarafından henüz belgelenmiş değil, ve ben hala PHP 5.3 şaşırıp, bu yüzden yorum yapamam.

Daha sonra Transaction('COMMIT','ROLLBACK'). Desteklenmiyor olacak MyISAM ise, kullandığınız hangi depolama motoru kontrol edin innodb depolama motor desteği işlemler değil MyISAM çünkü.

Ben bu doğru değil emin eğer bu vardı ama. Ayrıca bu deneyebilirsiniz.

mysql_query("START TRANSACTION");
$flag = true;
$query = "INSERT INTO testing (myid) VALUES ('test')";

$query2 = "INSERT INTO testing2 (myid2) VALUES ('test2')";

$result = mysql_query($query) or trigger_error(mysql_error(), E_USER_ERROR);
if (!$result) {
$flag = false;
}

$result = mysql_query($query2) or trigger_error(mysql_error(), E_USER_ERROR);
if (!$result) {
$flag = false;
}

if ($flag) {
mysql_query("COMMIT");
} else {        
mysql_query("ROLLBACK");
}

Fikir buradan: http://www.phpknowhow.com/mysql/transactions/