2014-02-05 7 views
0

Goodday,Ошибка подключения базы данных php mysqli?

Получаю странную ошибку.

это мой код:

<?php 
$con=mysqli_connect("localhost","root","","testdatabase"); 

class database{ 
    public function select($tableName){ 
     $result = mysqli_query($con,"SELECT * FROM ".$tableName);  
    }  
} 

$database = new database(); 
?> 

сообщение об ошибке, что $ жулик является неопределенной переменной. Но я определяю $ con на строке номер 2?

когда я var_dump con также говорит NULL.

Что я делаю неправильно?

+1

Вы не можете использовать глобальные переменные внутри класса. –

ответ

3

Если вы хотите получить доступ к вашему $ мошенника вар в методе или функции, вы должны глобализовать его внутри кода:

public function select($tableName){ 
    global $con; 
    $result = mysqli_query($con,"SELECT * FROM ".$tableName);  
} 

Но вы не должны делать это, Глобалы зло !

Это как ваш код должен быть:

<?php 
class database{ 
    protected $con; 

    public function __construct($host, $user, $password, $dbname){ 
     $this->con = mysqli_connect($host, $user, $password, $dbname); 
    } 

    public function select($tableName){ 
     $result = mysqli_query($this->con,"SELECT * FROM ".$tableName);  
    }  
} 

$database = new database("localhost", "root", "", "testdatabase"); 
?> 
+0

Использование единого соединения через все приложение без объединения будет супер, супер медленно. – tadman

+0

В PHP нет пула соединений. –

+0

PHP предлагает различать: [постоянные соединения в mysqli] (http://www.php.net/manual/en/mysqli.persistconns.php). – tadman

1

Соединение $con доступно в глобальном масштабе. То, что вы, скорее всего, захотите сделать, - это ввести ваше mysql-соединение (в виде объекта mysqli) в конструкторе для объекта базы данных. Вот простой пример:

<?php 
$mysqli= new mysqli("localhost","root","","testdatabase"); 

class database{ 
    protected $mysqli = null; 
    public function __contruct(MySQLI $mysqli = NULL) { 
     $this->mysqli = $mysqli; 
    } 

    public function select($tableName){ 
     $result = $this->mysqli->query("SELECT * FROM ".$tableName);  
    }  
} 

$database = new database($mysqli); 
?> 

Обратите внимание, что поскольку вы пытаетесь идти с объектно-ориентированной парадигмой, вы можете также использовать MySQLi в объектно-ориентированной моде.

+0

для меня имеет смысл объявить соединение внутри функции construct вместо создания зависимости. –

+0

@kasperTaeymans Зависимость инъекции гораздо более гибкая. Таким образом, вы не связываете свой класс с какой-либо конкретной логикой DB-соединения. Вы можете передать любой объект mysqli, который ваша система может создать и передать в этот класс. –

0

Добавьте функцию конструкции в свой класс и объявите свое соединение внутри этой функции.

class database{ 
    private $con; 
    public function __construct(){ 
     $this->con=mysqli_connect("localhost","root","","testdatabase"); 
    } 
    public function select($tableName){ 
     $result = mysqli_query($this->con,"SELECT * FROM ".$tableName);  
    }  
} 

$database = new database(); 
1

Вы не можете использовать глобальные переменные внутри класса.

<?php 

    class database { 

     private $con; 
     public $result; 

     public function select($tableName){ 
      $this->con = mysqli_connect("localhost","root","","testdatabase"); 
      $this->result = mysqli_query($this->con,"SELECT * FROM ".$tableName);  
     }  
    } 

    $database = new database(); 

    // do something with result 
    if($database->result) { 
     echo "Query returned something!"; 
    } 
?> 
Смежные вопросы