作者CaptainH (Cannon)
看板PHP
标题Re: [请益] 请教钓鱼吃的方法
时间Wed Oct 12 17:45:40 2011
※ 引述《ibbadmin (爱BB)》之铭言:
: 小弟新手,刚K完一本入门书,现在正在练习各种范例打底。
: 打底的过程中,我越来越觉得解决问题的经验与能力很重要,
: 透过google大神的帮忙,对於有error code、有乱码、有各种异常出现的bug,
: 大多都能找到原因并解决,
: 但是有些bug,就是看不出异常在哪,也不知从何下手起。
: 打个比方,底下是网路上的教学范例:
: <?php
: class recordset{
^^^^^^^^^
: var $show;
: //主机
: var $host="主机";
: //帐号
: var $dbid="帐号";
: //密码
: var $passwd="密码";
: //资料库
: var $database="资料库";
: var $conn;
: function connect(){
: $this->conn=mysql_connect($this->host,$this->dbid,$this->passwd);
: mysql_select_db($this->database);
: }
: function recordset($sql){
^^^^^^^^^
: if(!is_resource($this->conn))
: $this->connect();
: if(is_resource($this->conn)) {
: $q=mysql_query($sql,$this->conn);
: $this->show=mysql_fetch_array($q);
: }
: }
: }
注意到 recordset 类别里有一个同名函式: recordset()
在 PHP 5.3.3 之前,
与 class 同名的 member function 被当作建构子(constructor),
建构子就是物件生成时自动执行的函式, 底下解释.
: $sql="select * from login_list where sn='02' ";
: $get_db = new recordset($sql);
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
注意这行:
当 recordset 被 new 出来之後
会自动呼叫 $this->recordset($sql)
而这个函式会去跑 mysql_conn(...); mysql_select_db(...)
所以底下才能正确取得资料
: $A = $get_db->show["id"];
: echo $A ;
: ?>
: 小弟按照自己主机上的资料库,写了一支类似的程式:
: <?php
: class sql_conn{
: var $show;
: var $host='localhost';
: var $db_un='********';
: var $db_pw='********';
: var $db_name='admin001_php';
: var $conn;
: function db_connect(){
: $this->conn=mysql_connect($this->host,$this->db_un,$this->db_pw);
: mysql_select_db($this->db_name);
: mysql_query("SET NAMES 'utf8'");
: }
: function db_select($sql){
: if(!is_resource($this->conn)){
: $this->db_connect();
: }
: else {
: $sql_q=mysql_query($sql,$this->conn);
: $this->show=mysql_fetch_array($sql_q);
: }
: }
: }
如果你用的是PHP 4, 那你可以照上面的方法来改
也就是把 db_selct() 重新取名叫 sql_conn(), 像这样:
class
sql_conn{
....
function
sql_conn($sql){
if(!is_resource(...))
....
}
}
应该就能跑了, 但不建议学这种过时的语法.
若你用 PHP 5 或之後,
建构子不再是那个 "与 class 同名的 member function",
而是固定的函式:
__construct()
此外, var 这个 keyword 要改成 public, 这是物件导向的问题, 暂且不提.
所以你的 class 应该要这样写:
class sql_conn{
public $show,
$host='localhost',
$db_un='********',
$db_pw='********',
$db_name='admin001_php',
$conn;
function db_connect(){
....
}
function
__construct($sql){
....(原来 db_select 的内容)
}
}
: $sql="select * from customers;";
: $db_data=new sql_conn($sql);
: $A = $db_data->show[cid];
: if(isset($db_data->conn)){
: echo "有connection";
: }
: else{
: echo "无connection";
: }
: echo "资料库执行结果:<br />";
: echo $sql_q;
: echo $A;
: ?>
: 跑出来结果是无connection,
: 所以我已经知道连线没有建起来。(或者我观念错误)
: 但接下来我就不知道怎麽处理了,
: 想请教板上的前辈指导找问题的方法,
: 让我以後遇到类似问题能够按照正确的思路解决,
: 感谢。
良心建议: 找新一点的书, 找新一点的范例. PHP都出到6了, 别再用4的东西.
我前阵子在书店, 看到某本PHP的书还在用$HTTP_GET_VARS, 实在很可怕.
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 114.34.130.101
※ 编辑: CaptainH 来自: 114.34.130.101 (10/12 17:48)
※ 编辑: CaptainH 来自: 114.34.130.101 (10/12 17:50)
1F:推 ibbadmin:感谢C大指点,刚刚一位maplenote大也指正了我的错误 10/12 17:58
2F:→ maplenote:原来是版本问题阿 只用过__construct还怀疑了一下能跑吗 10/12 17:58
3F:→ maplenote:先测了一下可以跑 才敢说是建构子XDDDD 10/12 17:58
4F:→ ibbadmin:我学的书就是用PHP6,就是这个网路教学范例旧了 10/12 17:58
5F:→ maplenote:但是我是php5.3.4耶 为什麽可以这范例阿~"~? 10/12 18:01
为了向後相容, PHP 5 找不到 __construct() 就会把同名函式当建构子
我文章的讲法有点问题, 改一下.
※ 编辑: CaptainH 来自: 114.34.130.101 (10/12 18:07)
6F:推 maplenote:soga 谢谢^_^ 10/12 18:09
7F:→ tkdmaf:「PHP都出到6了」但事实上PHP6不是还没正式版本??? 10/12 22:37
8F:→ tkdmaf:另外还是得强调所谓「过时的语法」...... 10/12 22:43
9F:→ tkdmaf:当你很不幸的就是遇到旧系统时,你会相信他还没过时。 10/12 22:43
10F:推 LPH66:同意楼上 我看过某国内虚拟主机供应商用的是php 4.3.9... 10/12 23:46
11F:→ LPH66:於是为了 ajax 只好跑去找了个给 php4 的 json_encode 来用 10/12 23:47