Ich weiß, dass es Antworten gibt für, wie man 2 Server mit einer Datenbank verbindet, aber meine Situation ist ein wenig anders, also leiten Sie mich nicht nur zu einer anderen Antwort um. Meine Verbindungen sind keine einfachen 1-Liner und ich bin auf der Suche nach dem besten Weg, um fortzufahren (auf die Klasse verzichten und etwas ganz anderes machen, eine Möglichkeit, 2 durch diese Klasse zu verbinden, usw.).Verbinden von 2 Servern in PHP mit Datenbank-Klasse
So ist das passiert. Ich bin zurzeit Praktikant im Ausland und bekam eine einfache Aufgabe, bei der ich mit 1 Server arbeiten musste, alles fertig bekam und das war das Ende der Geschichte. Doch sobald wir alles echten Host bewegt, stellte sich heraus, dass ich zwei Server, auf denen die Tische kommen aus anstatt nur 1.
Das ist also, wie mein 1-Server-Verbindung wie folgt aussieht:
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;
In config.php gerade eben habe ich (die Werte entfernt, funktioniert es ab jetzt sowieso):
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",);
die Frage ist also, was ist der beste Weg, um Vorgehen. Gibt es eine Möglichkeit, ich könnte einfach eine andere "config2.php" Art von Datei hinzufügen und ein bisschen in der Klasse ändern, um alle diese Funktionen in beiden Klassen funktionieren zu lassen oder sollte ich etwas ganz anderes machen.
Wie immer, danke für die Antworten, die ich wirklich schätze sie.
Update:
Also das ist, was ich versucht und es hat nicht funktioniert. Wenn ich die benötigten SQL-Funktionen ausführe, zeigt es zwar die korrekte Tabelle an, aber die Funktion confirm query schlägt jedes Mal fehl.
<?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;
Vielleicht haben einige zusätzliche Informationen helfen würde, so das ist, wo ich 1-Funktion verwenden, um Daten von SQL zu bekommen (sie alle scheitern jetzt also denke ich, 1 Beispiel für Start genug ist).
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
}
Und das ist das Ergebnis, das ich bekommen, wenn users.php Laden:
"Datenbank-Abfrage ist fehlgeschlagen:
Letzte SQL-Abfrage: SELECT COUNT (*) FROM Tabellenname " (That Die gleiche SQL-Abfrage funktioniert, wenn ich sie direkt in phpmyadmin eintippe).
Und yeah .. es funktioniert alles, solange ich nur 1 Server verwende (der erste Block oben auf der Seite).
Übergeben Sie Ihre Konfiguration über den Konstruktor Ihrer Klasse. Sie können mehrere Instanzen haben. –
Ja, ich habe das versucht, aber es ist mir nicht gelungen. Ich habe den Beitrag aktualisiert, um zu zeigen, was ich getan habe – Rauno