2017-01-01 4 views
0

ich habe gerade angefangen oop und jetzt, auch sehr einfache dinge scheinen mir verwirrend! dies ist meine Klasse für mysqli Verbindung:vermeide mehrere mysqli verbindung mit db klasse

class DB{ 
    private $con; 
    public function __construct(){ 
     $this->con=new mysqli('localhost','root','','dbName'); 
     if(!$this->con){ 
      echo '<b>There was a problem connecting to database! </b><br />errno: '.$con->connect_errno; 
      exit; 
     } 
     $this->con->set_charset("utf8"); 
    } 
    public function query($query){ 
     return $this->con->query($query); 
    } 
} 

lassen Sie uns sagen, ich werde den Einsatz bin, dass dies mag:

$a=mysqli_real_escape_string($_POST['a']); 
$b=mysqli_real_escape_string($_POST['b']); 

$query='SELECT `name` FROM `someTable` WHERE `type`={'.$a.'}'; 
$query2='SELECT `name` FROM `someTable` WHERE `type`={'.$b.'}'; 

$DB = NEW DB; 
$test=$DB->query($query); 

$DB2 = NEW DB; 
$test2=$DB2->query($query2); 

i nur aus der Klasse DB 2 Objekte erstellt. bedeutet es, dass es für jedes Objekt eine neue mysql-Verbindung gibt? Wenn ja, wie kann ich es vermeiden?

ich weiß, ich kann mysqli_close() in __destruct() -Funktion verwenden, aber ich irgendwo lesen (wahrscheinlich in dieser Website :)), dass das Erstellen und Zerstören mehrerer MySQL-Verbindungen nicht gut ist.

was soll ich tun? p.s: neben, wie ich schon sagte ich bin neu in oop (und mysqli auch) also wenn es irgendwelche kommentare über meine klasse gibt (zum beispiel habe ich den charset am richtigen ort?) Werde ich geehrt werden.

Antwort

1

Wenn Sie eine Instanz einer Klasse erstellen, müssen Sie sie nicht neu erstellen, wenn sie ordnungsgemäß funktioniert.

Beispiel 1

in Ihrer Frage haben Sie dies:

$DB = new DB(); 
$test=$DB->query($query); 

$DB2 = new DB(); 
$test2=$DB2->query($query2); 

Sie können dies stattdessen tun:

$DB = new DB(); 
$test = $DB->query($query); 
$test2 = $DB->query($query2); 

Beispiel 2

Einige Mal hast du eine Instanz und du willst sie überall benutzen. Sie können es am Anfang Ihres Codes oder bei der ersten Anfrage erstellen. und dann kannst du es überall benutzen.

$DB = new DB(); 

function something(){ 

    global $DB; 

    $test = $DB->query($query); 
} 

Wenn Ihre Klasse wie hier erwähnt einfach ist, verwenden Sie sie einfach wie im ersten Beispiel. Diese Methode gilt für eine Instanz, auf die von überall aus zugegriffen werden muss. eine Funktion ändert etwas darin und eine andere Funktion verwendet diese Änderung.

Auch diese Methode wird als eine schlechte Methode angesehen, da es Ihren Code viel schwieriger zu lesen und zu debuggen macht.

einige nützliche Links:

+1

- bitte .... mit '' 'Variablen in oop-Tag global''' .... ist heute 2017 !? – pomaxa

+0

@pomaxa Sie haben Recht. Es ist keine gute Übung, globale Variable für eine Instanz zu verwenden. Aber es ist ein Beispiel, das besagt, dass Sie eine Instanz überall verwenden möchten, die erstellt wurde, bevor Sie sie verwenden können. – ICE

+1

- Ich lasse nur einen Link zu ähnlicher Frage: http://Stackoverflow.com/a/219599/164803 – pomaxa