2016-07-30 15 views
0

Ich bin ein Anfänger in OOP in PHP und ich versuche, mit meinem Code zu spielen. Als erstes wollte ich eine Basisklasse mit connect schreiben und Funktionen für die Datenbank einfügen. Also meine gewünschte Situation ist dies:OOP Mysqli Datenbankfunktionen

-Ich möchte auf Klasse erstellen, die controll verbinden und Funktionen einfügen wird. Das Problem ist, meine $ connect-Variable funktioniert nicht von einer anderen Funktion, also was könnte ich tun, um dies zu ermöglichen? Sie werden mehr durch den bereitgestellten Code verstehen.

<?php 

class DB { 
protected $dbhost = 'localhost'; 
protected $dbuser = 'root'; 
protected $dbpass = ''; 
protected $dbname = 'newdb'; 

public function connect() 
{ 
    $connect = new mysqli($this->dbhost, $this->dbuser, $this->dbpass, $this->dbname); 

    if($connect->error) 
    { 
     echo "Failed to connect"; 
    } 
    else 
    { 
     echo "connected"; 
    } 
} 

public function insert($name, $second) 
{ 
    $insert = "INSERT INTO posts (name, second) VALUES ('$name', '$second')"; 

    if ($connect->query($insert) === TRUE) 
    { 
     echo "New record created successfully"; 
    } 
    else 
    { 
     echo "Error: " . $sql . "<br>" . mysqli_connect_error(); 
    } 
} 
} 
require_once 'classes/DB.php'; 

$db = new DB; 

if(isset($_POST['submit'])) 
{ 
    $name = $_POST['name']; 
    $second = $_POST['second']; 

    $db->insert($name, $second); 
} 

?> 


<form method="POST"> 
    Add smth<input type="text" name="name"><br> 
    Also omg<input type="text" name="second"><br> 
    <input type="submit" name="submit"> 
</form> 
+1

Was ist mit dem Passieren als Parameter? –

+0

Ich dachte darüber nach, aber ich kenne nicht die richtige Verwendung. Deshalb suche ich nach Hilfe. – Irfan

+0

'$ connect' ist im lokalen Bereich dieser Funktion. Sie sind auch offen für SQL-Injektionen mit diesem Code. Sie sollten sich mit parametrisierten Abfragen beschäftigen, am besten, wenn Sie beginnen. http://php.net/manual/en/mysqli.quickstart.prepared-statements.php – chris85

Antwort

1

hinzufügen $connect als Eigenschaft der Klasse, so dass Sie kann es überall in der Klasse wiederverwenden $this->connect mit:

class DB 
{ 
    protected $dbhost = 'localhost'; 
    protected $dbuser = 'root'; 
    protected $dbpass = ''; 
    protected $dbname = 'newdb'; 
    protected $connect; 

    public function connect() 
    { 
     $this->connect = new mysqli($this->dbhost, $this->dbuser, $this->dbpass, $this->dbname); 

     if ($this->connect->error) 
     { 
      echo "Failed to connect"; 
     } 
     else 
     { 
      echo "connected"; 
     } 
    } 

    public function insert($name, $second) 
    { 
     $insert = "INSERT INTO posts (name, second) VALUES ('$name', '$second')"; 

     if ($this->connect->query($insert) === TRUE) 
     { 
      echo "New record created successfully"; 
     } 
     else 
     { 
      echo "Error: " . $sql . "<br>" . mysqli_connect_error(); 
     } 
    } 
} 
+0

Schwerwiegender Fehler: Uncaught Error: Aufruf einer Memberfunktion query() auf null in ... – Irfan

+0

Was genau führen Sie aus? – Jocelyn

+0

Ich habe den Code aktualisiert. Das sind zwei verschiedene Dateien, aber es ist in Ordnung, verstehst du? Scrolle nach unten und sieh es dir an. – Irfan

1

Ich habe Ihre Klasse für ein bisschen umgeschrieben, so dass Sie Ihre Datenbank einfügen Einstellungen im Konstruktor. Es ist also wirklich ein Objekt, und Sie können mehrere Datenbanken verwenden. Was Sie in Ihrer Klasse falsch gemacht haben, war die Verwendung der Variablen $ connect, ohne sie in eine Variable zu deklarieren, die in der gesamten Klasse verwendbar ist.

Die Klasse

<?php 

class DB { 
    protected $dbhost; 
    protected $dbuser; 
    protected $dbpass; 
    protected $dbname; 
    protected $connection; 

    public function __construct($dbhost, $dbuser, $dbpass, $dbname) 
    { 
     $this->dbhost = $dbhost; 
     $this->dbuser = $dbuser; 
     $this->dbpass = $dbpass; 
     $this->dbname = $dbname; 

     $connection = new mysqli($this->dbhost, $this->dbuser, $this->dbpass, $this->dbname); 
     if($connection->error) 
      die('Could not connect with the database!'); 

     $this->connection = $connection; 
    } 

    public function connect() 
    { 
     $this->__construct($this->dbhost, $this->dbuser, $this->dbpass, $this->dbname); 
    } 

    public function insert($name, $second) 
    { 
     $insert = "INSERT INTO posts (name, second) VALUES ('$name', '$second')"; 

     if ($this->connection->query($insert) === TRUE) 
     { 
      echo "New record created successfully"; 
     } 
     else 
     { 
      echo "Error: " . $sql . "<br>" . mysqli_connect_error(); 
     } 
    } 

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

Nutzungs

$db = new DB('localhost', 'root', '', 'newdb'); 
$db->insert('name', 'second'); 

Ich hoffe, das Sie in Ihrem Tagebuch über OOP hilft, sorry für mein schlechtes Englisch.

+0

Ja, das funktioniert auch. Ich habe es vor 2 Minuten repariert, haha. Aber trotzdem, danke, dass Sie mir geholfen haben. Ich schätze. – Irfan