-1

我对 OOP 不是很好,我需要一个脚本。我尽力做到最好,但我无法让它发挥作用。有人可以为我制作一个 OOP 脚本(这是一个小脚本)。

我需要一个函数startTransaction(),在函数内部我放了两个查询。我还在这个函数中创建了一个变量($transaction_called=1),下次调用该函数时,它应该可以访问这个变量。

我需要第二个功能stopTransaction()。这个函数里面也有查询,我需要访问里面的变量startTransaction()

每次在随机脚本中,我startTransaction()使用变量 $transaction_call 调用 and 我检查是否调用了该函数。

这就是我所拥有的,但我不知道如何解决它。

class Foo
{
    protected $_transaction_called = '0';

    public function transactionCalled()
    {
        // code ...
        $this->_transaction_called = '1';
    }

    public function startTransaction()
    {
        if(!$this->_transaction_called === '1') {
            $this->transactionCalled();
            mysql_query("START TRANSACTION", $db);
        }else{
            //do nothing, transaction already started
        } 
    }

    public function transactionStopped()
    {
        // code ...
        $this->_transaction_called = '0';
    }

    public function stopTransaction()
    {
        if(!$this->_transaction_called === '1') {
            $this->transactionStopped();
            if($transaction_error==true){
                mysql_query("ROLLBACK", $db);
            }else{
                mysql_query("COMMIT", $db);
            }
        }
    }
}

//some random script:
$transaction_error=false;
startTransaction();

$query_1 = "UPDATE x1 SET X1='1' WHERE X1='x'";
$result_1 = mysql_query($query_1, $db);
if(!$result_1){$transaction_error=true;}
//query's, query's and more query's

stopTransaction();
4

2 回答 2

1

我制作了 2 个文件:class.php 和 script.php

类.php

<?php
class Transaction
{
    protected $_transaction_called;
    protected $db;

    public function __construct(&$db)
    {
        $this->db = $db;
        $this->_transaction_called = false;
    }

    public function startTransaction()
    {
        if($this->_transaction_called == false) {
            $this->_transaction_called = true;
            mysql_query("START TRANSACTION", $this->db);
        }
    }

    public function stopTransaction($error)
    {
        if($this->_transaction_called == true) {
            $this->_transaction_called = false;
            if($error == true){
                print "ROLLBACK\n";
                mysql_query("ROLLBACK", $this->db);
            }else{
                print "COMMIT\n";
                mysql_query("COMMIT", $this->db);
            }
        }

    }
}

脚本.php

<?php
include_once("class.php");

//connect to DB
$db = mysql_connect('localhost', 'user', '');
if (!$db) {
    die('Could not connect: ' . mysql_error());
}

echo "Connected successfully\n";
mysql_select_db('test');


$trans = new Transaction($db);
$trans->startTransaction();

$query = "UPDATE Document SET Description='!!!' WHERE DataID=1";
$result = mysql_query($query, $db);
//if $result is false, there is an error
$trans->stopTransaction(!$result);

//2-nd transaction
$trans->startTransaction();

$query = "INCORRECT QUERY";
$result = mysql_query($query, $db);
//if $result is false, there is an error
$trans->stopTransaction(!$result);

数据库

该数据库称为 test 并具有下表,用于测试:

DROP TABLE IF EXISTS `Document`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `Document` (
  `DataID` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `Description` varchar(50) CHARACTER SET utf8 NOT NULL,
  PRIMARY KEY (`DataID`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=latin1;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `Document`
--

LOCK TABLES `Document` WRITE;
/*!40000 ALTER TABLE `Document` DISABLE KEYS */;
INSERT INTO `Document` VALUES (1,'This is document 1');
/*!40000 ALTER TABLE `Document` ENABLE KEYS */;
UNLOCK TABLES;

运行脚本后,它会打印以下消息:

Connected successfully
COMMIT
ROLLBACK

请阅读代码并让我知道,如果您有任何问题。

于 2013-07-16T20:21:52.433 回答
0

要调用类的函数,首先需要创建该类的实例。

$myFoo = new Foo();
$myFoo->startTransaction();
...
...

您还可以混合变量:

类内部的 $transaction_error 与外部的 $transaction_error 不同。为了在类中使用它,首先定义它和它喜欢的访问

$this->transaction_error

您必须意识到对象内部的变量在外部不可见,除非它们是公共的并且您使用对象引用进行访问。例如,如果 $transaction_error 被定义为 public,您可以使用以下命令访问它:

$myFoo->transaction_error

你的 $db 也会出现同样的问题,我没有在类中看到它的定义。

于 2013-07-16T20:22:04.953 回答