4

我已经编写 php 代码已经有一段时间了,但我最近进入了面向对象的编程领域。

在我使用 mysql_connect()、mysql_query() 和所有这些函数之前,但后来我听说 PDO 会是更好的选择。

我想为什么不呢,然后看了一个基本的 PDO 视频。

try {
    global $db;
    $db = new PDO("mysql:host=$db_host;dbname=$db_name", $db_user, $db_pw);
} catch (PDOException $e) {
    die("ERROR: " . $e->getMessage());
}

print(gettype($db)."<br>");

function test() {
print(gettype($db));
}

test();

所以这里的问题是,我想创建一个函数,以便我可以轻松地将新项目插入我的表中。但是我遇到了这个问题,我的 $db 不是全局的。所以我在使用该功能时必须重新连接到我的数据库,但我不能这样做,这根本不好。

那么如何解决这个问题呢?哦,上面的代码输出:

object
Notice: Undefined variable: db in /home/vhosts/ollie.ceify.net/www/ip-bless/connect.php on line 25 NULL
4

4 回答 4

3

创建一个包含私有 PDO 对象的 on 对象,并定义一个接受表名、列名和值参数并且可以重复调用的公共查询方法:

class DatabaseObject{
  private $db;

  public function __construct() {
    $this->createDB();
  }

  private function createDB() {
    $this->db = PDO("mysql:host=localhost;dbname=yourdatabase", 'username', 'password');
        $this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  }

  public function insert($table, $column, $value) {
    try {
      $this->db->query(sprintf("
        INSERT INTO %s (%s)
        VALUES (%s)",
        $table, $column, $value));
    }
    catch (PDOException $e) {
      return $e->getMessage();
    }
  }
}

$db = new DatabaseObject();
$db->insert('table_name', 'column_name', 'value');
于 2012-08-30T11:40:37.083 回答
1

您也需要使用global来获取全局变量。

function test() {
  global $db;
  print(gettype($db));
}
于 2012-08-27T14:53:56.200 回答
1

将变量作为参数传递给您的函数。

function test($dbObj) {
    print(gettype($dbObj));
}

或者

您可以将函数放在对象中并$db作为成员变量:

class myClass {
    public $db;

    public function __construct($dbObj) {
        $this->db = $db;
    }

    public function test() {
        print(gettype($this->db));
    }
}

$myVar = new myClass();
$myVar->test();
于 2012-08-27T14:54:12.423 回答
0

我通常做的是定义一个函数来连接到数据库或获取已经可用的句柄。

function dbHandle()
{
    global $dbh;
    if (is_resource($dbh)) return $dbh;
    return $dbh = new PDO(...); # All your DB credentials here.
}

...作为一个简单的示例,如果您有更复杂的设置,例如,您可以将此信息存储在类的静态成员中。

于 2012-08-27T14:57:40.213 回答