2010-06-29 137 views
0

我目前正在使用PHP编写一个CMS,以便回到PHP(我总是使用它)。然而,由于某些奇怪的原因,当“包含”或“需要”我的类文件时,它只是停止php脚本,我的登录表单(login.php的html)不显示(无论我是否登录)。任何帮助?这里有两个我的脚本:PHP脚本不会运行

的login.php:

<?php 
session_start(); 
include "classes.php"; 
if(isset($_GET['logout'])) { 
    setupSession(2); 
} 
if($_SESSION['status'] == "online") header("location: admin.php"); 
if($_POST && isset($_POST['username']) && isset($_POST['password'])) { 
    $un = $_POST['username']; 
    $pwd = $_POST['password']; 

    $mysql = new mySql(); 
    $mysql->validateUser($un, $pwd); 
} else $attempt = 2; 

?> 
<html> 
<head> 
    <title>Log In</title> 
</head> 
<body> 
<form method="post" action=""> 
    <label for="username">username: </label> 
    <input type="text" name="username" /> 

    <label for="password">password: </label> 
    <input type="password" name="password" /> 

    <input type="submit" value="Log In" name="submit" /> 
</form> 
</body> 
</html> 

和classes.php

<?php 

class mySql { 

    protected $dbname; 
    protected $dbuser; 
    protected $dbpass; 
    protected $db; 
    private $conn; 

    function __construct() { 
     $conn = new mysqli($dbname, $dbuser, $dbpass, $db); 
    } 

    public function validateUser($username, $password) { 
     $query = "SELECT * FROM users WHERE username = ? AND password = ? LIMIT 1"; 

     if($stmt = $this->conn->prepare($query)) { 
      $stmt->bind_param('ss', $username, $password); 
      $stmt->execute(); 

      if($stmt->fetch()) { 
       $stmt->close(); 
       setupSession(1); 
      } else $attempt = 1; 
     } 
    } 
} 

function setupSession($status) { 
    switch($status) { 
     case 1: 
      $_SESSION['status'] = "online"; 
      //other user variables 
      header("location: admin.php"); 
      break; 
     case 2: 
      unset($_SESSION['status']); 
      if(isset($_COOKIE[session_name()])) { 
       setcookie(session_name(), '', time() - 1000); 
      } 
      session_destroy(); 
      break; 
     default: 
      session_start(); 
      if($_SESSION['status'] != "online") header("location: login.php"); 
      break; 
    } 
} 

?> 
+0

你的'error_reporting'开启了吗? – 2010-06-29 17:04:57

+3

另外请注意,你必须,必须在'header(“location:...”)之后**'die()',否则受保护的内容将被发送到文档正文中的客户端。 – 2010-06-29 17:05:25

+0

不确定关于error_reporting,我正在使用MAMP进行开发。对于死亡(),谢谢。 – user379229 2010-06-29 22:45:50

回答

3

您有范围问题。

$conn = mysqli(....) 

应该$this->conn = mysqli(....)

+0

对!我有不良的Java习惯:) – mexique1 2010-06-29 18:30:39

+0

谢谢。修正后,仍然不会运行。 – user379229 2010-06-29 22:50:38

+0

固定,将工作。我粘贴了所有的代码,应用了这个,并且它工作。还有一些其他的错误,但我的主要问题是这个。 – user379229 2010-06-30 02:53:42

0
error_reporting (1); 
+0

什么都没有显示。 – user379229 2010-06-29 23:17:38

+0

MAMP有错误报告,但没有关闭显示错误。我相信php.ini中的第277行(对于MAMP。) – user379229 2010-07-01 22:42:21

2

不会有很多的原因,所需的脚本打破父:所需的文件不存在,它有错误,或者它调用exit()die()

您确定文件classes.php与脚本位于同一文件夹中,还是位于包含路径中?


这是你正在使用的确切代码?

有了这样的构造:

function __construct() { 
    $conn = new mysqli($dbname, $dbuser, $dbpass, $db); 
} 

如何地狱你连接到数据库?

$mysql = new mySql(); 
+0

new mySql();指的是我的类mysql,当使用新的实例时,构造会发挥它的魔力。 – user379229 2010-06-29 22:47:41

+0

和classes.php位于同一个文件夹中。 – user379229 2010-06-29 22:49:58

1
function __construct() { 
    $conn = new mysqli($dbname, $dbuser, $dbpass, $db); 
} 

应该是自然的

function __construct($dbname, $dbuser, $dbpass, $db) { 
    $this->dbname = $dbname; 
    $this->dbuser = $dbuser; 
    $this->dbpass = $dbpass; 
    $this->db  = $db; 
    $this->connect(); 
} 

function connect() 
{ 
    $this->conn = new mysqli($this->dbname, $this->dbuser, $this->dbpass, $this->db); 
} 

东西。

+0

当我将两种方法结合起来时,它对我来说很有效。 (你的也是,但我没有看到任何理由有更多的代码。) function __construct(){ $ this-> conn = new mysqli($ this-> dbhost,$ this-> dbuser,$ this - > dbpass,$ this-> dbname); } – user379229 2010-06-30 02:49:22