Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <?php
- /**
- *
- * @param string $connection_id
- *
- * @return PDO
- */
- function connection($connection_id) {
- $host = '';
- $database = '';
- $username = '';
- $password = '';
- static $connections = [];
- if (!isset($connections[$connection_id])) {
- $pdo_options = [];
- $pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
- $pdo_options[PDO::SQLSRV_ATTR_ENCODING] = PDO::SQLSRV_ENCODING_UTF8;
- $cnn = new \PDO("sqlsrv:server=$host;Database=$database", $username, $password, $pdo_options);
- $cnn->setAttribute(PDO::SQLSRV_ATTR_ENCODING, PDO::SQLSRV_ENCODING_UTF8);
- $connections[$connection_id] = $cnn;
- }
- return $connections[$connection_id];
- }
- /**
- * Summary of prepare
- *
- * @param mixed $connection
- * @param mixed $query
- * @return PDOStatement
- */
- function prepare($connection, $query, $buffered, $emulate_prepares) {
- $pdo_options = array();
- if ($emulate_prepares) {
- $pdo_options[PDO::ATTR_EMULATE_PREPARES] = TRUE;
- }
- $pdo_options[PDO::SQLSRV_ATTR_DIRECT_QUERY] = TRUE;
- $pdo_options[PDO::SQLSRV_ATTR_ENCODING] = PDO::SQLSRV_ENCODING_UTF8;
- if ($buffered) {
- $pdo_options[PDO::ATTR_CURSOR] = PDO::CURSOR_SCROLL;
- $pdo_options[PDO::SQLSRV_ATTR_CURSOR_SCROLL_TYPE] = PDO::SQLSRV_CURSOR_BUFFERED;
- }
- return $connection->prepare($query, $pdo_options);
- }
- /**
- * Summary of execute
- *
- * @param PDO $connection
- * @param string $query
- *
- * @param PDOStatement;
- */
- function execute($connection,
- $query,
- array $args = [],
- $buffered = TRUE,
- $emulate_prepares = TRUE) {
- $st = prepare($connection, $query, $buffered, $emulate_prepares);
- $st->execute($args);
- return $st;
- }
- //*******************************************************
- // TEST BEGIN
- //*******************************************************
- $connection = connection('default');
- // Drop
- try {
- execute($connection, 'DROP TABLE TEST');
- }
- catch(\Exception $e) {}
- // Recreate
- execute($connection, "CREATE TABLE TEST([id] [int] IDENTITY(1,1) NOT NULL, [name] nvarchar(max))");
- // No transaction yet, so this should be inmediately commited. OK.
- execute($connection, "INSERT INTO TEST(name) VALUES(:p0)", ['p0' => 'JUAN'], TRUE, FALSE);
- // Start a transaction
- $connection->beginTransaction();
- // Update the name within a transaction
- execute($connection, "UPDATE TEST SET NAME=:p0 WHERE NAME=:p1", ['p0' => 'DAVID','p1' => 'JUAN'], TRUE, FALSE);
- $currentName = execute($connection, "SELECT TOP(1) NAME FROM TEST")->fetchColumn();
- echo "currentName is $currentName and should be DAVID<br/>";
- // Let's throw a PDO exception that DOES NOT DOOM THE TRANSACTION
- try {
- execute($connection, "SELECT COUNT(*) FROM THIS_TABLE_DOES_NOT_EXIST");
- }
- catch (\Exception $e) {}
- $currentName = execute($connection, "SELECT TOP(1) NAME FROM TEST")->fetchColumn();
- echo "currentName is $currentName and should be DAVID<br/>";
- // Let's throw a PDO exception that DOES DOOM THE TRANSACTION
- try {
- execute($connection, "UPDATE TEST SET NAME=:p0 WHERE id=:p1", ['p0' => 'DAVID','p1' => 'SORRY FOR THE GRAMMAR, THIS AIN\'T NO NUMBER'], TRUE, FALSE);
- }
- catch (\Exception $e) {}
- // THIS IS WHERE THE MAGIC HAPPENS. ¿¿¿WHAT HAPPENED TO THE TRANSACTION??
- // LOOK LIKE IT WAS ROLLED BACK INTERNALLY :( BUT THE FIRST EXCEPTION DIDN'T???
- $currentName = execute($connection, "SELECT TOP(1) NAME FROM TEST")->fetchColumn();
- echo "currentName is $currentName and should be DAVID<br/>";
- // THE MOST ANNOYING PART IS NOT THAT IT WAS ROLLED BACK, BUT THE FACT THAT YOU
- // CAN STILL DO STUFF "AS IF" YOU STILL WERE INSIDE THE TRANSACTION
- execute($connection, "UPDATE TEST SET NAME=:p0 WHERE NAME=:p1", ['p0' => 'DAVID','p1' => 'JUAN'], TRUE, FALSE);
- $currentName = execute($connection, "SELECT TOP(1) NAME FROM TEST")->fetchColumn();
- echo "currentName is $currentName and should be DAVID<br/>";
- // THIS ROLLBACK DOES NOTHING. LOOKS LIKE THE PDO WENT BACK TO AMBIENT
- // TRANSACTION YET HAD INTERNALL TRACK OF THE PREVIOUS TRANSACTION.
- $connection->rollBack();
- // NOT SURE WHAT TO EXPECT FROM THE PREVIOUS ROLLBACK
- $currentName = execute($connection, "SELECT TOP(1) NAME FROM TEST")->fetchColumn();
- echo "currentName is $currentName and should be JUAN???<br/>";
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement