2016-03-30 8 views
2

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).

+0

Übergeben Sie Ihre Konfiguration über den Konstruktor Ihrer Klasse. Sie können mehrere Instanzen haben. –

+0

Ja, ich habe das versucht, aber es ist mir nicht gelungen. Ich habe den Beitrag aktualisiert, um zu zeigen, was ich getan habe – Rauno

Antwort

1

Warum verlassen Sie sich auf konstante Anweisungen? Sie können .ini-Dateien schreiben und die Konfiguration mit $array = parse_ini_file(filename) lesen. Wenn Sie dies tun, können Sie den Konstruktor mit dem Dateinamen Ihrer spezifischen Konfiguration (oder einem erweiterten Abschnittsnamen) aufrufen.

Da Sie sprechen über „die beste Art und Weise zu gehen“ - wenn Sie wirklich mysql_real_escape_string benötigen (dynamische $table_name ein Grund ist, wenn es keine andere Möglichkeit gibt) und den Fall zu behandeln, dass es vielleicht nicht existieren sollten Sie (falls es verweigert keinen Zugriff oder stellt mindestens einen Polyfill mit regulären Ausdrücken bereit. mysqli ist besser die mysql, in Betracht ziehen die Verwendung von PDO. Verwenden Sie wann immer möglich parametrisierte vorbereitete Anweisungen, um die Sicherheit zu verbessern.

Der Missbrauch von Klassen zur Bereitstellung statischer Methoden ist ein veraltetes Konzept, da in neueren PHP-Versionen die Kontexttrennung durch Namespaces gut gehandhabt wird.

Verwandte Themen