2013-04-04 56 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(); 
}