class Mysql {
private $link;
private $dbcharset = "utf8";
private $tablepre = "hsh_";
function __construct($dbhost,$dbuser,$dbpass,$dbname,$dbchar,$tablepre){
$this->doConnect($dbhost,$dbuser,$dbpass,$dbname);
$this->dbcharset = $dbchar;
$this->tablepre = $tablepre;
}
private function doConnect($dbhost,$dbuser,$dbpass,$dbname){
$this->link = @mysql_connect($dbhost,$dbuser,$dbpass) or halt("Can\'t Connect MySQL Server (".$dbhost.")!");
$this->doSelect($dbname);
}
private function doSelect($dbname){
mysql_select_db($dbname,$this->link) or halt("Can\'t select MySQL database ($dbname)!");
$this->doCharset();
}
private function doCharset(){
mysql_query("SET NAMES ".$this->dbcharset."");
}
public function doQuery($sql,$type=""){
if($this->tablepre !== "ews_"){
$sql = str_replace("ews_",$this->tablepre,$sql);
}
return mysql_query($sql,$this->link);
}
//释放当前类所占用的内存并关闭当前数据连接
function __destruct(){
@mysql_free_result();
@mysql_close($this->link);
}
}
这个是自己写的自用的mysql类,在windows系统中运行一切正常,可是当放到freebsd系统中的时候,每次很快就会自动销毁资源集,每次查询出来的结果,不是空数组就是没有类型的资源而当我将 @mysql_close($this->link);这句注销后,发现资源就正常了。。读出的结果集也正常了。。求助:我将mysql_close放到析构函数中是不是不对?
private $link;
private $dbcharset = "utf8";
private $tablepre = "hsh_";
function __construct($dbhost,$dbuser,$dbpass,$dbname,$dbchar,$tablepre){
$this->doConnect($dbhost,$dbuser,$dbpass,$dbname);
$this->dbcharset = $dbchar;
$this->tablepre = $tablepre;
}
private function doConnect($dbhost,$dbuser,$dbpass,$dbname){
$this->link = @mysql_connect($dbhost,$dbuser,$dbpass) or halt("Can\'t Connect MySQL Server (".$dbhost.")!");
$this->doSelect($dbname);
}
private function doSelect($dbname){
mysql_select_db($dbname,$this->link) or halt("Can\'t select MySQL database ($dbname)!");
$this->doCharset();
}
private function doCharset(){
mysql_query("SET NAMES ".$this->dbcharset."");
}
public function doQuery($sql,$type=""){
if($this->tablepre !== "ews_"){
$sql = str_replace("ews_",$this->tablepre,$sql);
}
return mysql_query($sql,$this->link);
}
//释放当前类所占用的内存并关闭当前数据连接
function __destruct(){
@mysql_free_result();
@mysql_close($this->link);
}
}
这个是自己写的自用的mysql类,在windows系统中运行一切正常,可是当放到freebsd系统中的时候,每次很快就会自动销毁资源集,每次查询出来的结果,不是空数组就是没有类型的资源而当我将 @mysql_close($this->link);这句注销后,发现资源就正常了。。读出的结果集也正常了。。求助:我将mysql_close放到析构函数中是不是不对?
除非你使用永久性mysql_pconnect打开数据库。
如果练习的话就不说什么了。
还有,做个getInstances方法做个单模,通用性好,以后换JAVA语言也用得上。
注意一个问题
$this->link = @mysql_connect($dbhost,$dbuser,$dbpass) or halt("Can\'t Connect MySQL Server (".$dbhost.")!");
这句,mysql_connect的第4个参数,补上一个true试下。
PDO用着感觉不如自己写的mysql类简单明了。主要是他自身的很多方法太固定了。可能是我了解不多吧
你的方法我试试看,但是任谁不可能在同一个页面实例化2次mysql的啊。实例化后直接赋值,以后直接调用变量要比再实例化一次更合理很简单呀
否则你那句mysql_query("SET NAMES ".$this->dbcharset."");永远都用的缺省值
$this->dbcharset = $dbchar;
$this->tablepre = $tablepre;
这两句都应该往前放了,本地的改了,发帖的时候复制的是另外一贴的,不管怎样,谢谢提醒。
查看你的php版本,并检查其后的版本中是否有对这一bug的修正
重新编译较新的、小版本号为偶数的php
不建议使用最新版本的php,因为总是要出一点毛病
用的是php5.2.6,和本地windows系统下的php是一样的。。
本地没问题的。
mysql_fecth_array是在我新写的一个方法里写的,我把方法贴出来:public function getOne($sql,$result_type=MYSQL_ASSOC){
$result = $this->doQuery($sql);
$row=mysql_fetch_array($this->doQuery($sql),$result_type);
return $row;
}
我在全站的唯一入口处:@require_once(CLS_DIR."./mysql.class.php");$db = new Mysql($dbhost,$dbuser,$dbpass,$dbname,$dbcharset,$tablepre);//获取系统参数$sql = "SELECT * FROM `hsh_setting`";
$cfg = $db->getOne($sql);
getone方法见楼上然后我在页面中随时都直接使用变量$db去调用方法。
每个页面都new Mysql 还是自始至终只new一次Mysql?
靠php自己断开确实是很可靠的,可是问题是咱们自己写在析构函数里,从逻辑上来说,我觉得自己写上更合理。