php tanımlanan değişkenler null değerleri var

5 Cevap php

Ben config.inc saklanan bazı veritabanı bilgileri var ve ben var bir sınıfta veritabanına erişmek için kullanmak çalışıyorum, ama nedense, değişkenler null. heres kodu:

<?php

require_once 'dbinterface.php';
require_once 'config.inc.php';

class user {

    ...

    function user($id) {
    	$this->db = new db($DB['host'], $DB['user'], $DB['pass'], $DB['database']);
    	...
    }
...
?>

ve burada config.inc.php bulunuyor:

<?php

$DB['host'] = '192.168.1.107';
$DB['user'] = '****';
$DB['pass'] = '****';
$DB['database'] = 'qa';

?>

Ben Boş değerlere alıyorum neden emin değilim, ama burada benim kanıtıdır:

Fatal error: Uncaught exception 'Exception' with message 'No database selected' in D:\development\PHP\qanda\dbinterface.php:18 Stack trace: #0 D:\development\PHP\qanda\user.class.php(17): db->db(NULL, NULL, NULL, NULL) #1 D:\development\PHP\qanda\log.php(17): user->user('1') #2 {main} thrown in D:\development\PHP\qanda\dbinterface.php on line 18

5 Cevap

Bu çalışması için $DB global olarak ilan etmek gerekir:

global $DB;

$DB['host'] = '192.168.1.107';
$DB['user'] = '****';
$DB['pass'] = '****';
$DB['database'] = 'qa';

Ve sınıf tanımı:

function user($id) {
        global $DB;
        $this->db = new db($DB['host'], $DB['user'], $DB['pass'], $DB['database']);
        ...
    }

Bir variable scoping sorunu var. Lütfen config.inc dosya küresel bağlamda dahil ise, o zaman bu çalışması gerekir:

function user($id) {
    global $DB;
    $this->db = new db($DB['host'], $DB['user'], $DB['pass'], $DB['database']);
    ...
}

Sen sınıfının kapsam dışında dosyaları dahil ediyoruz. Eğer işlev içinde gerektirir taşırsanız, beklendiği gibi çalışacaktır.

Daha iyi bir seçenek $DB dizi boyunca yapıcı, döngü içine dahil olmak ve $this->DB onun değerlerini atamak, böylece sınıfın herhangi bir fonksiyonu erişebilirsiniz olacaktır. Ayrıca fonksiyonları yerine $DB in $this->DB kullanmak için değiştirmeniz gerekir.

function __construct() {
    require_once 'dbinterface.php';
    $this->DB = array();
    foreach ($DB as $key => $value) {
        $this->DB[$key] = $value;
    }
}

Genel olarak, küresel değişkenler kötü bir fikirdir. Bu, o inşaat harfe ama optimal değildir. Iyi fikir tanımlarını kullanmaktır.

define('DB_HOST', '192.168.1.107');
define('DB_USER', '****');
define('DB_PASS', '****');
define('DB_DATABASE', 'qa');

...

function user($id) {
    $this->db = new db(DB_HOST, DB_USER, DB_PASS, DB_DATABASE);
    ...
}

PHP help page on variable scope ve özellikle "globallerinin" anahtar göz atın. Bu size ihtiyacınız olanı almalısınız. İyi şanslar!