将 php 中的 2 台服务器连接到数据库 class

Connecting 2 servers in php with database class

我知道有关于如何将 2 个服务器连接到数据库的答案,但我的情况有点不同,所以不要只是将我重定向到另一个答案。我的连接不是简单的 1 线,我正在寻找继续进行的最佳方式(放弃 class 并做一些完全不同的事情,一种通过 class 连接 2 的方法等) .

这就是发生的事情。我目前在国外实习,我被分配了一项简单的任务,我必须使用一台服务器,完成所有工作,这似乎是故事的结局。然而,一旦我们将所有内容移动到真实主机,结果我有 2 台服务器,其中 tables 来自而不是只有 1.

这就是我的 1 个服务器连接的样子:

class.database.inc

<?php

require_once(LIB_PATH . "config.php");

class MySQLDatabase {

private $connection;
public $last_query;
private $magic_quotes_active;
private $real_escape_string_exists;

function __construct() {
    $this->open_connection();
    $this->magic_quotes_active = get_magic_quotes_gpc();
    $this->real_escape_string_exists = function_exists("mysql_real_escape_string");
}

public function open_connection() {
    $this->connection = mysqli_connect(SERVER_ADDR, SERVER_USER, SERVER_PWD, SERVER_DB);
    if (mysqli_connect_errno()) {
        printf("Connect failed: %s\n", mysqli_connect_error());
        exit();
    } else {
        $db_select = $this->connection->query("SELECT DATABASE()");
        if (!$db_select) {
            printf("Database selection failed: %s\n", mysqli_connect_error());
            exit();
        }
    }
}

public function close_connection() {
    if (isset($this->connection)) {
        $this->connection->close();
        unset($this->connection);
    }
}

public function query($sql) {
    $this->last_query = $sql;
    $result = $this->connection->query($sql);
    $this->confirm_query($result);
    return $result;
}

public function escape_value($value) {
    if ($this->real_escape_string_exists) { // PHP v4.3.0 or higher
        // undo any magic quote effects so mysql_real_escape_string can do the work
        if ($this->magic_quotes_active) {
            $value = stripslashes($value);
        }
        $value = $this->connection->real_escape_string($value);
    } else { // before PHP v4.3.0
        // if magic quotes aren't already on then add slashes manually
        if (!$this->magic_quotes_active) {
            $value = addslashes($value);
        }
        // if magic quotes are active, then the slashes already exist
    }
    return $value;
}

// "database-neutral" methods
public function fetch_array($result_set) {
    return $result_set->fetch_array(MYSQLI_ASSOC);
}

public function num_rows($result_set) {
    return $result_set->num_rows;
}

public function insert_id() {
    // get the last id inserted over the current db connection
    return $this->connection->insert_id;
}

public function affected_rows() {
    return $this->connection->affected_rows;
}

private function confirm_query($result) {
    if (!$result) {
        $output = "Database query failed: " . mysqli_connect_error() . "<br /><br />";
        $output .= "Last SQL query: " . $this->last_query;
        die($output);
    }
}

}

$database = new MySQLDatabase();
$db = & $database;

在 config.php 文件中我只有这个(删除了值,无论如何它现在都有效):

defined("SERVER_ADDR") ? null : define("SERVER_ADDR", );
//MYSQL username
defined("SERVER_USER") ? null : define("SERVER_USER", );
//MYSQL password
defined("SERVER_PWD") ? null : define("SERVER_PWD", );
//MYSQL database name
defined("SERVER_DB") ? null : define("SERVER_DB", );

所以问题是,最好的方法是什么。有没有一种方法我可以只添加另一种 "config2.php" 类型的文件并在 class 中稍作更改以使所有这些功能都适用于 classes 或者我应该做一些完全不同的事情。

一如既往,感谢您的回答,我真的很感激他们。

更新:

所以这是我尝试过的方法,但没有用。当我 运行 需要 SQL 函数时,它确实显示正确 table 但函数确认查询每次都失败。

    <?php

require_once(LIB_PATH . "config.php");

class MySQLDatabase {

private $connection;
public $last_query;
private $magic_quotes_active;
private $real_escape_string_exists;

public $server;
public $user;
public $pw;
public $database;

function __construct() {
    $this->open_connection();
    $this->magic_quotes_active = get_magic_quotes_gpc();
    $this->real_escape_string_exists = function_exists("mysql_real_escape_string");
}

public function open_connection() {
    $this->connection = mysqli_connect($this->server, $this->user, $this->pw, $this->database);
    if (mysqli_connect_errno()) {
        printf("Connect failed: %s\n", mysqli_connect_error());
        exit();
    } else {
        $db_select = $this->connection->query("SELECT DATABASE()");
        if (!$db_select) {
            printf("Database selection failed: %s\n", mysqli_connect_error());
            exit();
        }
    }
}

public function close_connection() {
    if (isset($this->connection)) {
        $this->connection->close();
        unset($this->connection);
    }
}

public function query($sql) {
    $this->last_query = $sql;
    $result = $this->connection->query($sql);
    $this->confirm_query($result);
    return $result;
}

public function escape_value($value) {
    if ($this->real_escape_string_exists) { // PHP v4.3.0 or higher
        // undo any magic quote effects so mysql_real_escape_string can do the work
        if ($this->magic_quotes_active) {
            $value = stripslashes($value);
        }
        $value = $this->connection->real_escape_string($value);
    } else { // before PHP v4.3.0
        // if magic quotes aren't already on then add slashes manually
        if (!$this->magic_quotes_active) {
            $value = addslashes($value);
        }
        // if magic quotes are active, then the slashes already exist
    }
    return $value;
}

// "database-neutral" methods
public function fetch_array($result_set) {
    return $result_set->fetch_array(MYSQLI_ASSOC);
}

public function num_rows($result_set) {
    return $result_set->num_rows;
}

public function insert_id() {
    // get the last id inserted over the current db connection
    return $this->connection->insert_id;
}

public function affected_rows() {
    return $this->connection->affected_rows;
}

private function confirm_query($result) {
    if (!$result) {
        $output = "Database query failed: " . mysqli_connect_error() . "<br /><br />";
        $output .= "Last SQL query: " . $this->last_query;
        die($output);
    }
}

}

$database = new MySQLDatabase();
$database->server = SERVER_ADDR;
$database->user = SERVER_USER;
$database->pw = SERVER_PWD;
$database->database = SERVER_DB;

$db = & $database;

也许一些额外的信息会有所帮助,所以这是我使用 1 个函数从 SQL 获取数据的地方(它们现在都失败了,所以我想 1 个示例就足够了)。

users.php:

//more code
 $max_users = User::count_all(); //max users   
//more code

class.database_query.inc:

require_once(LIB_PATH . "class.database.inc");

class DatabaseObject {

    protected static $table_name;

//more functions

//the one in use:
    public static function count_all() {
        global $database;
        $sql = "SELECT COUNT(*) FROM " . static::$table_name;
        $result_set = $database->query($sql);
        $row = $database->fetch_array($result_set);
        return array_shift($row);
    }

//more functions

}

这是我在加载时得到的结果 users.php:

" 数据库查询失败:

上次 SQL 查询:SELECT COUNT(*) FROM table_name" (当我直接在 phpmyadmin 中输入时,相同的 SQL 查询有效)。

是的..只要我只使用一个服务器(页面顶部的第一个块),它就可以正常工作。

为什么要依赖 define 常量语句?您可以编写 .ini 文件并使用 $array = parse_ini_file(filename) 读取配置。这样做,您可以使用特定配置的文件名(或更高级的部分名称)调用构造函数。

既然你在谈论 "the best way to proceed" - 如果你真的需要 mysql_real_escape_string (动态 $table_name 一个原因,当没有其他方式)并处理它可能不存在的情况,你应该(如果它不存在)拒绝任何访问或至少提供一个带有正则表达式的 polyfill。 mysqli 优于 mysql,请考虑使用 PDO。尽可能使用参数化准备语句来提高安全性。

误用 类 来提供仅静态方法是一个过时的概念,因为在较新的 PHP 版本中,上下文分离由命名空间很好地处理。