作者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)
推 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