2010-11-13 42 views
1

我有下面这段PHP脚本的问题:PHP类没有响应

<?php 
abstract class root { 
protected $con; 
protected $sql; 
protected $query; 
protected $row; 

protected function __construct__() { 
    require_once("db.settings.php"); 

    $this->con = mysql_connect(DB_HOST, DB_USER, DB_PASS) or die(mysql_error($this->con)); 
    mysql_query("SET NAMES UTF8", $this->con) or die(mysql_error($this->con)); 
    mysql_close($this->con); 
    mysql_select_db(DB_NAME, $this->con); 
} 

protected function __destruct__() { 
    mysql_close($this->con); 
    unset($this->con); 
} 

    } 

    class users extends root { 
private $h; 

public function __construct__() { 
    parent::__construct__(); 
} 

public function __destruct__() { 
    parent::__destruct__(); 
} 

public function register($uname, $pass, $mail, $name) { 
    $this->hash = sha1($uname . md5($pass) . $name); 

    $this->sql = "INSERT INTO users (user, pass, mail, name, hash) VALUES ($uname, $pass, $mail, $name, $this->hash)"; 
    mysql_query($this->sql, $this->con) or die(mysql_error($this->con)); 
    mysql_close($this->con); 

    return true; 
} 

public function login($uname, $pass) { 
    $this->sql = "SELECT * FROM users WHERE user = $uname AND pass = " . md5($pass); 
    mysql_query($this->sql, $this->con) or die(mysql_error($this->con)); 

    if(mysql_num_rows !== 1){ 
     mysql_close($this->con); 

     return false; 
    } else { 
     setcookie("who", $uname, time() + 3600); 
     $this->h = md5($pass); 
     setcookie("token", $this->h, time() + 3600); 
     $this->h = sha1($uname . md5($pass)); 
     setcookie("hash", $uname, time() + 3600); 

     return true; 
    } 
} 

public function logout() { 
    if(isset($_COOKIE['who']) && isset($_COOKIE['token']) && isset($_COOKIE['hash']) && $_COOKIE['hash'] == sha1($_COOKIE['who'] . $_COOKIE['token'])) { 
     setcookie("who", $uname, time() - 1); 
     setcookie("token", $uname, time() - 1); 
     setcookie("hash", $uname, time() - 1); 

     return true; 
    } else { 
     setcookie("who", $uname, time() - 1); 
     setcookie("token", $uname, time() - 1); 
     setcookie("hash", $uname, time() - 1); 

     return false; 
    } 
} 

public function check() { 
    if(isset($_COOKIE['who']) && isset($_COOKIE['token']) && isset($_COOKIE['hash']) && $_COOKIE['hash'] == sha1($_COOKIE['who'] . $_COOKIE['token'])) { 
     return true; 

    } else { 
     return false; 
    } 
} 
    } 

    class iPhone extends root { 
private $hash; 
public $content = array(); 
private $j = 0; 

public function __construct__() { 
    parent::__construct__(); 
} 

public function __destruct__() { 
    parent::__destruct__(); 
} 

public function registerIphone() { 
    # implented later 
    $this->hash = md5(time); 

    $this->sql = "UPDATE users SET phoneid = " . $this->hash . " WHERE user = " . $_COOKIE['who']; 
    mysql_query($this->sql, $this->con) or die(mysql_error($this->con)); 
    setcookie("phoneid", $this->hash, 1314000); 

    return true; 
} 
public function checkIphone() { 
    # implented later 

    $this->sql = "SELECT * FROM users WHERE phoneid = " . $_COOKIE['phoneid'] . " LIMIT 1"; 
    if(mysql_query($this->sql, $this->con)) { 
     return true; 
    } else { 
     return false; 
    } 

} 
public function deleteIphone($who) { 
    # implented later 

    $this->sql = "UPDATE users SET phoneid = '' WHERE user = $who"; 
    if(mysql_query($this->sql, $this->con)) { 
     return true; 
    } else { 
     return false; 
    } 
} 
public function showContent($what) { 
    $this->sql = "SELECT * FROM content WHERE articleName = " . $what . " AND media = Handheld"; 
    $this->query = mysql_query($this->sql, $this->con) or die(mysql_error($this->con)); 
    while($this->row = mysql_fetch_array($this->query)) { 
     $content[$j]['id']   = $row['id']; 
     $content[$j]['date']  = $row['date']; 
     $content[$j]['articleName'] = $row['articleName']; 
     $content[$j]['content']  = $row['content']; 

     $this->j++; 
    } 
    mysql_close($this->con); 
    return $this->content; 
} 
    } 

    class contentManager extends root { 
public $content = array(); 
private $j = 0; 

public function __construct__() { 
    parent::__construct__(); 
} 

public function __destruct__() { 
    parent::__destruct__(); 
} 

public function showContent($what) { 
    $this->sql = "SELECT * FROM content WHERE articleName = $what AND media = Browser"; 
    $this->query = mysql_query($this->sql, $this->con) or die(mysql_error($this->con)); 
    while($this->row = mysql_fetch_array($this->query)) { 
     $content[$j]['id']   = $row['id']; 
     $content[$j]['date']  = $row['date']; 
     $content[$j]['articleName'] = $row['articleName']; 
     $content[$j]['content']  = $row['content']; 

     $this->j++; 
    } 
    mysql_close($this->con); 
    return $this->content; 
} 

public function editContent($id, $articlename, $content) { 
    $this->sql = "UPDATE content SET articleName = $articlename, content = $content WHERE id = $id"; 
    mysql_query($this->sql, $this->con) or die(mysql_error($this->con)); 

    return true; 
} 

public function deleteContent($id) { 
    $this->sql = "DELETE FROM content WHERE id = $id"; 
    mysql_query($this->sql, $this->con) or die(mysql_error($this->con)); 

    return true; 
} 
    } 

    class map extends root { 
private $j = 0; 
private $key = "my google maps api key"; 
private $address; 
private $helper; 
private $page; 
private $xml; 
private $longitude; 
private $latitude; 
private $altitude; 

public function __construct__() { 
    parent::__construct__(); 
} 

public function __destruct__() { 
    parent::__destruct__(); 
} 

public function getMarkers() { 
    $this->sql = "SELECT * FROM markers"; 
    $this->query = mysql_query($this->sql, $this->con) or die(mysql_error($this->con)); 
    while($this->row = mysql_fetch_array($this->query)) { 
     if($this->j < (mysql_num_rows($this->query) -1)){ 
      print("['" . $this->row['address'] . "', " . $this->row['lat'] . ", " . $this->row['lng'] . ", 1],"); 
      $this->j++; 
     } else { 
      print("['" . $this->row['address'] . "', " . $this->row['lat'] . ", " . $this->row['lng'] . ", 1]"); 
      $this->j++; 

     } 
    } 

} 

public function setMarkers($addr) { 
    $this->helper = str_replace(" ", "+", $addr); 
    $this->helper = explode(",", $this->helper); 
    $this->address = "http://maps.google.com/maps/geo?q=$this->helper[0],+$this->helper[1],+$this->helper[2]&output=xml&key=$this->key"; 
    $this->page = file_get_contents($this->address); 
    $this->xml = new SimpleXMLElement($this->page); 
    list($this->longitude, $this->latitude, $this->altitude) = explode(",", $xml->Response->Placemark->Point->coordinates); 

    echo $this->longitude . " :: " . $this->latitude; 



} 

public function deleteMarkers($id) { 
    /* 
    *** FUNCTION NOT YET IMPLENTED! 
     */ 
} 
    } 

    ?> 

对于那些,谁不想读源:我创建了一个抽象类,创建数据库连接,那么其他类,如登录扩展它,使用父母数据库连接。

的问题是,每当我创建一个类的实例,如:

$map = new map(); 

然后尝试做一些与实例:

$map->setMarkers(""); 

什么也没有发生。毫无意义。没有错误信息,也没有输出。

所有帮助将不胜感激!

+1

您是否尝试过调试?例如增加'print'语句来找出它卡住的地方? – 2010-11-13 22:45:20

+0

是的,试图从根和子类构造函数&&析构函数打印字符串。 – 2010-11-13 22:50:25

回答

2

你有一些不正确的函数定义:

protected function __construct__() {

应该读

protected function __construct() {

同样是为__destruct__()功能如此 - 这应该阅读__destruct()

但是你应该肯定会收到一些错误报告 - 尝试设置

error_reporting(E_ALL); 
ini_set('display_errors', 1); 

位于脚本的顶部。

+0

我以为我知道这个......的语法;-) – 2010-11-13 22:53:53

0

首先,检查每个mysql函数调用的返回值。他们都返回有价值的信息。例如,mysql_connect():

返回成功时的MySQL链接标识或失败时返回FALSE。

此外,在您的构造函数中,在选择数据库之前关闭数据库连接,这并不合理。删除此行:

mysql_close($this->con); 

看看会发生什么。实际上,在第二次读取时,除了析构函数之外,从所有函数中移除该调用。这可能甚至没有必要,因为我相信DB连接在脚本终止时是关闭的。

+0

完美有道理,谢谢! – 2010-11-13 22:54:34

0

在你的构造:

protected function __construct() { 
    require_once("db.settings.php"); 

    $this->con = mysql_connect(DB_HOST, DB_USER, DB_PASS) or die(mysql_error($this->con)); 
    mysql_query("SET NAMES UTF8", $this->con) or die(mysql_error($this->con)); 
    mysql_close($this->con); 
    mysql_select_db(DB_NAME, $this->con); 
} 

除去紧密的联系,您收盘毁灭连接器...它应该像下面:

protected function __construct() { 
     require_once("db.settings.php"); 

     $this->con = mysql_connect(DB_HOST, DB_USER, DB_PASS) or die(mysql_error($this->con)); 
     mysql_query("SET NAMES UTF8", $this->con) or die(mysql_error($this->con)); 
     mysql_select_db(DB_NAME, $this->con); 
    } 

Change construct and destruct to right ones : __destruct__() to __destruct() same with construct ... 
+0

您可能也想更改方法名称。 – 2010-11-13 22:54:51

+0

我使用抽象,因为我不希望根类自身实例化,只是当某个子类正在使用它的数据库连接时。 – 2010-11-13 22:55:43

+0

sory做了一些编辑..它是从你写的内容复制..调用构造函数如下__construct($ methods) – Conex 2010-11-13 22:56:38