0

I was wondering how to use a MySQL BEGIN/COMMIT with a PDO. I've read that it's best to create a query that either inserts all data or none at all to provide 'consistency' in the database Here's my code

$query = $db -> prepare 
                        ("
                        BEGIN;
                        INSERT INTO chat (chat_id,msg,datetime) 
                        VALUES (:cid,:msg,:datetime)
                        INSERT INTO chat_connect (chat_id,sender_id,receiver_id)
                        VALUES (:cid2,:sender_id,:receiver_id);
                        COMMIT;
                        ");
$query -> execute(array(
            "cid" => $cid,
            "msg" => $msg,
            "datetime" => $datetime,
            "sender_id" => $getid,
            "receiver_id" => $frid,
            "cid2" => $cid
            ));

2 Answers 2

1

Your code would work only if emulation mode is turned ON.

Otherwise you have to run your queries in separate calls like this.

$db->query("BEGIN");
$stmt = $db->prepare("INSERT INTO chat (chat_id,msg,datetime) VALUES (:cid,:msg,:datetime)");
$stmt->execute(...);
$stmt = $db->prepare("INSERT INTO chat_connect (chat_id,sender_id,receiver_id)
                        VALUES (:cid2,:sender_id,:receiver_id)");
$stmt->execute(...);
$db->query("COMMIT");

this is a general rule dor running miltiple-query statements in PHP.

However, in case of a transaction, instead of SQL commands BEGIN and COMMIT you can use their PDO counterparts.

Sign up to request clarification or add additional context in comments.

Comments

0

Transaction syntax:

START TRANSACTION [transaction_characteristic [, transaction_characteristic] ...]

transaction_characteristic: WITH CONSISTENT SNAPSHOT | READ WRITE | READ ONLY

BEGIN [WORK] COMMIT [WORK] [AND [NO] CHAIN] [[NO] RELEASE] ROLLBACK [WORK] [AND [NO] CHAIN] [[NO] RELEASE] SET autocommit = {0 | 1}

Transaction example:

START TRANSACTION;
SELECT @A:=SUM(salary) FROM table1 WHERE type=1;
UPDATE table2 SET summary=@A WHERE type=1;
COMMIT;

Taken from here.

You intend to create a transaction via PDO. That is not really a problem. You can do it by generating the query text accordingly:

$query = $db -> prepare 
                        ("
                        START TRANSACTION;
                        INSERT INTO chat (chat_id,msg,datetime) 
                        VALUES (:cid,:msg,:datetime)
                        INSERT INTO chat_connect (chat_id,sender_id,receiver_id)
                        VALUES (:cid2,:sender_id,:receiver_id);
                        COMMIT;
                        ");
$query -> execute(array(
            "cid" => $cid,
            "msg" => $msg,
            "datetime" => $datetime,
            "sender_id" => $getid,
            "receiver_id" => $frid,
            "cid2" => $cid
            ));

Here you can see how you can write a bullet-proof transaction.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.