2013-04-04 22 views
0

程序PHP適用於我,但是當我嘗試編寫像我在目標C中那樣的代碼時,我似乎無法使函數正常工作。我認爲這與我的變量作用域和不返回任何值的函數有關。我在哪裏出錯我的代碼在這裏?

 <?php 

     require_once("constants.php"); 

     class Main { 

public $menu; 
public $connection; 

function connectToDatabase() { 
    //connect to database & check connection 
    $connection = mysqli_connect(DB_SERVER, DB_USER, DB_PASS, DB_NAME); 
    if (mysqli_connect_errno()) { echo "Failed to connect to MySQL: " .  mysqli_connect_error(); } 
} 

function queryDatabase($select, $from) { 
    $result = mysqli_query($connection,"SELECT $select FROM $from"); 
} 

function closeDatabaseConnection() { 
    mysqli_close($connection); 
} 

function displayMenu() { 

    //connect to database & check connection 
    connectToDatabase(); 

    //get menu data 
    queryDatabase(*, pages); 

    //construct menu data 
    echo '<ul class="mainNavigation">'; 
    while($row = mysqli_fetch_array($result)) 
     { 
      echo '<li><a href="' . $row['filename'] . '.php">'; 
      echo $row['menu_name']; 
      echo '</a></li>'; 
     } 
    echo '</ul>'; 

    //close connection 
    closeDatabaseConnection(); 
} 

function displayFooter() { 

} 

function getUser() { 

} 

function userLogIn() { 

} 

    } 
?> 

回答

1

而不是使用$連接,你應該使用這個 - $>連接,像這樣運行:

$Db = new Main(); 

$Db->connectToDatabase(); 

如果您要訪問一個方法中的屬性,確保引用它與$this->prop,而不是隻是$道具。如果該方法是靜態的,則改爲使用self::prop

$this引用類的當前實例化。如果方法/屬性是靜態的,您將使用範圍解析運算符(::)(DBConnection::connectionDBConnection::connectToDatabase())/

而且,我會重命名類「主」到別的東西像DBConnection的(PHP不喜歡使用的方法主要C不用),則:

$Db = new DBConnection(); 
$Db->connectToDatabase(); 

因爲在PHP中,雖然你可以在一個PHP文件名爲connection.php一類,一類主要的,如果你有千篇一律另一個類,那麼你將有兩個主要類。

+0

謝謝艾瑪曾嘗試和喜歡你的建議。我也想知道使用Main並知道我知道,感謝您的反饋。 – user2246249 2013-04-04 19:02:43

1

如果您想在自己的類中使用方法或變量,則必須將$this->放在它的前面。對於〔實施例此connectToDatabase();將成爲這個$this->connectToDatabase();

+0

謝謝你的回答,我一直在使用$ this->在我的一些課程中,但你們都給了我最後一塊給我的難題,爲此我感謝你! :)馬特。 – user2246249 2013-04-04 18:59:58

0

有各種各樣的東西不對的課,所以我將重點放在幾個關鍵點,也許你可以從那裏修復它沒有我們有一個完全重寫

首先,考慮一下:

public $connection; 

function connectToDatabase() { 
    //connect to database & check connection 
    $connection = mysqli_connect(DB_SERVER, DB_USER, DB_PASS, DB_NAME); 
    if (mysqli_connect_errno()) { echo "Failed to connect to MySQL: " .  mysqli_connect_error(); } 
} 

您聲明瞭一個類變量$ connection,這沒問題。但在你的函數中,你分配一個局部變量而不是訪問類變量。從一個班級中,您可以使用$ this調用所有班級成員。因此,功能應該是:

function connectToDatabase() { 
    //connect to database & check connection 
    $this->connection = mysqli_connect(DB_SERVER, DB_USER, DB_PASS, DB_NAME); 
    if (mysqli_connect_errno()) { echo "Failed to connect to MySQL: " .  mysqli_connect_error(); } 
} 

現在,其他方法試圖調用功能,但他們需要做同樣的事情:

function displayMenu() { 

    //connect to database & check connection 
    // this should just check to see if $connection is populated. if not then call this method 
    $this->connectToDatabase(); 

而且這種方法沒有訪問類VAR連接:

function queryDatabase($select, $from) { 
    $result = mysqli_query($this->connection,"SELECT $select FROM $from"); 
} 

這幾個例子應該給你訪問類方法和變量的基本思想。你可以提出具體的問題,我們可能會更新,但現在這應該讓你去。

+0

謝謝你回答,我一直在使用$ this->在我的一些課程中,但你們都給了我最後一塊給我的難題,爲此我感謝你! :)馬特。 – user2246249 2013-04-04 18:59:12

0

這是我經常使用的mysqli連接類。它可能不會回答你的問題,但你可以研究它,它應該有助於你更好地理解這個概念。無論如何它爲我做了。

class DBConnection 
{  
    protected $mysqli; 
    private $db_host='localhost'; 
    private $db_name=''; 
    private $db_username=''; 
    private $db_password=''; 

    public function __construct() { 
     $this->mysqli = new mysqli($this->db_host,$this->db_username, 
     $this->db_password, $this->db_name) or die($this->mysqli->error); 

     return $this->mysqli; 
    } 

    public function getLink() { 
     return $this->mysqli; 
    } 

    public function query($query) { 
     return $this->mysqli->query($query); 
    } 

    public function real_escape_string($str) { 
     return $this->mysqli->real_escape_string($str); 
    } 

    function __destruct(){ 
     $this->mysqli->close(); 
    } 
} 

然後當你需要連接到數據庫中的另一個類調用它的構造函數,像這樣:

public function __construct(DBConnection $mysqli) { 
    $this->mysqli = $mysqli->getLink(); 
}