2013-09-10 6 views
1

Помощь я получил сообщение об ошибке:Фатальная ошибка: Не удается получить доступ к пустой собственности, в mysql.php с использованием ООП PHP

Fatal error: Cannot access empty property in D:\Installed Programs\deshoppy with joomla\htdocs\ds\features\mysql.php on line 64

И ниже mysql.php:

<?php 
// Give access to db information 
global $db_type; 
global $db_host; 
global $db_user; 
global $db_pass; 
global $db_name; 

// Connecting database 
$db=mysql_connect($db_host,$db_user,$db_pass); 
$db or die("Failed to connect database using $db_type :P"); 

// Selecting database 
mysql_select_db($db_name) or 
    die('Failed to select database :P'); 

// Non OOP Functions 

function db_query($q){ 
    $qry=mysql_query($q); 
    return $qry; 
} 

function db_fetch_array($qry){ 
    $qary=mysql_fetch_array($qry); 
    return $qary; 
} 

function db_num_rows($qry){ 
    $qrnr=mysql_num_rows($qry); 
    return $qrnr; 
} 

function db_error(){ 
    $db_error=mysql_error(); 
    return $db_error; 
} 

function db_close(){ 
    $db_close=mysql_close(); 
    return $db_close; 
} 

// OOP 

class aDatabase{ 


    public $hostname=""; 
    public $username=""; 
    public $password=""; 
    public $database=""; 

    public $query=""; // Last SQL code 
    public $result=""; // Result of mysql_query 
    public $fetch_array=""; // Result of mysql_fetch_array 
    public $link=""; // Result of mysql_connect 
    public $num_rows=""; // Result of mysql_num_rows 
    public $error=""; // Result of mysql_error 
    public $disconnect=""; // Result of mysql_close 

    // Adding parameter to class 
    public function __construct($par_host, $par_user, $par_pass, $par_db){ 
     $this->$hostname=$par_host; 
     $this->$username=$par_user; 
     $this->$password=$par_pass; 
     $this->$database=$par_db; 

    } 

    // Connect to database 
    function connect(){ 
     $this->$link = mysql_connect(
      $this->$hostname, 
      $this->$username, 
      $this->$password 
     ); 

     return $this->$link; 
    } 

    // Fetch array 
    function fetch_array(){ 
     $this->$fetch_array=mysql_fetch_array($this->$result); 
     return $this->$fetch_array; 
    } 

    function num_rows(){ 
     $this->$num_rows = mysql_num_rows($this->$num_rows); 
     return $this->$num_rows; 
    } 

    // May not accurate to last error 
    function error(){ 
     $this->$error = mysql_error(); 
     return $this->$error; 
    } 

    function disconnect(){ 
     $this->$disconnect = mysql_close($this->$link); 
     return $this->$disconnect; 

     $this->$link=""; 
    } 
} 

// Proccess new database connection 
$aDB=new aDatabase($db_host, $db_user, $db_pass, $db_name); 

$aDB->connect(); 

// Clean database information to prevent hacking 
$db_name=""; 
$db_user=""; 
$db_pass=""; 
$db_host=""; 

?> 

И ds_configuration. php (я забыл сказать об этом раньше):

<?php 
// Site offline information 
$site_offline=false; 
$site_offline_title="Akdira"; 

// Database information 
$db_user="root"; 
$db_pass="123456"; 
$db_name="deshoppy"; 
$db_host="localhost"; 
$db_type="mysql"; 

?> 

Не могли бы вы рассказать мне, как это исправить?

+1

, который является 64-й линии? –

+0

Глобалы ООП + - такое противоречие. Код такой oldschool PHP4, .. Я предлагаю вам прочитать некоторые документы PHP5 и руководство по стилю кода Zend. Это улучшит ваш проект примерно на 6000% – DanFromGermany

+1

[** Пожалуйста, не используйте 'mysql_ *' функции в новом коде **) (http://bit.ly/phpmsql). Они больше не поддерживаются [и официально устарели] (https://wiki.php.net/rfc/mysql_deprecation). См. [** красное поле **] (http://j.mp/Te9zIL)? Узнайте о [* подготовленных операторах *] (http://j.mp/T9hLWi) и используйте [PDO] (http://php.net/pdo) или [MySQLi] (http://php.net/ mysqli) - [эта статья] (http://j.mp/QEx8IB) поможет вам решить, какой из них. Если вы выберете PDO, [здесь хороший учебник] (http://j.mp/PoWehJ). – Touki

ответ

2

Посмотрите на эту строку вверху вашего кода: global $db_host; Это неправильно. В PHP глобальные переменные должны быть объявлены global внутри функции, если они будут использоваться в этой функции для получения глобальных переменных области доступа.

Перед созданием экземпляра класса необходимо назначить значение переменной. Вы не присвоить любое значение для ваших переменных, как $db_host и так далее ...

$db_host = "localhost"; 
//... 
$aDB=new aDatabase($db_host, $db_user, $db_pass, $db_name); 

попробовать Кроме этого в переменных членов класса:

$this->hostname 

Вместо:

$this->$hostname 
    //^ 

В этом случае удалите $ во всех членах переменной класса на $this.

Update: Как последнее издание, включить ds_configuration.php в mysql.php:

include_once('ds_configuration.php'); 
0

У вас есть "синтаксис" ошибка.

Вместо использования

$this->$attribute 

вы должны использовать

$this->attribute 

Почему это не реальная ошибка синтаксиса?

Поскольку PHP позволяет делать такие вещи, как это:

$var = 'attribute'; 
$this->$var; 

что то же самое, что

$this->attribute 

После этого пути ...

...Вы можете, например, вызвать функцию с его имя из переменной:

function funcName($nbr, $str) { /*...*/ } 
$var = 'funcName'; 
$result = $var(1,'test'); 

Или же с переменными

$foo = 'bar'; 
$varName = 'foo'; 
echo $$varName; 

тот же, что

$foo = 'bar'; 
echo $foo;  
Смежные вопросы