看板 PHP 關於我們 聯絡資訊
※ 引述《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)
ibbadmin:感謝C大指點,剛剛一位maplenote大也指正了我的錯誤 10/12 17:58
maplenote:原來是版本問題阿 只用過__construct還懷疑了一下能跑嗎 10/12 17:58
maplenote:先測了一下可以跑 才敢說是建構子XDDDD 10/12 17:58
ibbadmin:我學的書就是用PHP6,就是這個網路教學範例舊了 10/12 17:58
maplenote:但是我是php5.3.4耶 為什麼可以這範例阿~"~? 10/12 18:01
為了向後相容, PHP 5 找不到 __construct() 就會把同名函式當建構子 我文章的講法有點問題, 改一下. ※ 編輯: CaptainH 來自: 114.34.130.101 (10/12 18:07)
maplenote:soga 謝謝^_^ 10/12 18:09
tkdmaf:「PHP都出到6了」但事實上PHP6不是還沒正式版本??? 10/12 22:37
tkdmaf:另外還是得強調所謂「過時的語法」...... 10/12 22:43
tkdmaf:當你很不幸的就是遇到舊系統時,你會相信他還沒過時。 10/12 22:43
LPH66:同意樓上 我看過某國內虛擬主機供應商用的是php 4.3.9... 10/12 23:46
LPH66:於是為了 ajax 只好跑去找了個給 php4 的 json_encode 來用 10/12 23:47