作者 主題: php+mysql+pear  (閱讀 7102 次)

0 會員 與 1 訪客 正在閱讀本文。

bluefire

  • 可愛的小學生
  • *
  • 文章數: 10
    • 檢視個人資料
php+mysql+pear
« 於: 2006-03-18 20:11 »
不知道各位先進是否可以幫在下看看這段程式的寫法是不是可以有所改善,
因為可能在下功力不足,總覺得好像寫的很笨拙,卻不知該如何改善,感激不盡。
代碼: [選擇]

$query="select `describe` from rp_location";
$result=$dbh->query($query);
$i=0;
while( $row=$result->fetchRow() )
{
$location_group[$i]=$row[0];
$i++;
}

$query="select `describe` from rp_location_room_1";
$result=$dbh->query($query);
$i=0;
while( $row=$result->fetchRow() )
{
$rp_location_room_1[$i]=$row[0];
$i++;
}

$query="select `describe` from rp_location_room_2";
$result=$dbh->query($query);
$i=0;
while( $row=$result->fetchRow() )
{
$rp_location_room_2[$i]=$row[0];
$i++;
}

$location_room=array($rp_location_room_1,$rp_location_room_2);

$form=new HTML_QuickForm('repair_form','POST','');

$form->addElement("header","header","報修表單");

$location= $form->addElement('hierselect','location','地點:');
$location->setMainOptions($location_group);
$location->setSecOptions($location_room);

$form->addElement("textarea","content","問題描述:");
$form->addElement("submit","submit","送出");

$form->display();

Yamaka

  • 俺是博士!
  • *****
  • 文章數: 4913
    • 檢視個人資料
    • http://www.ecmagic.com
php+mysql+pear
« 回覆 #1 於: 2006-03-19 16:32 »
代碼: [選擇]
$i=0;
while( $row=$result->fetchRow() )
{
   $location_group[$i]=$row[0];
   $i++;
}


=>
代碼: [選擇]
while( $row=$result->fetchRow() )
{
   $location_group[]=$row[0];
}


以下類推...

bluefire

  • 可愛的小學生
  • *
  • 文章數: 10
    • 檢視個人資料
php+mysql+pear
« 回覆 #2 於: 2006-03-21 23:34 »
太感謝了,雖然我自己也經重新思考並改寫過整個架構
不過您倒是提醒了我陣列最基本的部分。
感謝您!

qrtt1

  • 懷疑的國中生
  • **
  • 文章數: 73
    • 檢視個人資料
php+mysql+pear
« 回覆 #3 於: 2006-05-02 17:11 »
引述: "bluefire"
太感謝了,雖然我自己也經重新思考並改寫過整個架構
不過您倒是提醒了我陣列最基本的部分。
感謝您!


http://groups.google.com.tw/group/tw.bbs.comp.lang.php/browse_thread/thread/9ae2cd6a8b0a3f47/7f9cb87f83eada70?lnk=st&q=pear%3A%3Adb+snippets&rnum=1&hl=zh-TW#7f9cb87f83eada70
呵, 也許您可以改用prepared的方法去query會比較安全一些些呦

oscars80

  • 憂鬱的高中生
  • ***
  • 文章數: 92
    • 檢視個人資料
Re: php+mysql+pear
« 回覆 #4 於: 2006-05-02 17:30 »
引述: "bluefire"

代碼: [選擇]

$query="select `describe` from rp_location";
$result=$dbh->query($query);
$i=0;
while( $row=$result->fetchRow() )
{
$location_group[$i]=$row[0];
$i++;
}

$query="select `describe` from rp_location_room_1";
$result=$dbh->query($query);
$i=0;
while( $row=$result->fetchRow() )
{
$rp_location_room_1[$i]=$row[0];
$i++;
}

$query="select `describe` from rp_location_room_2";
$result=$dbh->query($query);
$i=0;
while( $row=$result->fetchRow() )
{
$rp_location_room_2[$i]=$row[0];
$i++;
}


同質性的東西改用function來做會不會比較方便?
ex:
function select_test($tblname)
{
 $query="select `describe` from $tblname";
 $result=$dbh->query($query);
 $i=0;
 while( $row=$result->fetchRow() )
 {
    $rp_location[$i]=$row[0];
   $i++;
 }
 return $rp_location;
}

然後去call function來做會不會比較方便一點?
這樣如果要修改的話就比較方便。

ricky

  • 區域板主
  • 鑽研的研究生
  • *****
  • 文章數: 669
    • 檢視個人資料
    • Ricky 碎碎唸
php+mysql+pear
« 回覆 #5 於: 2006-05-03 09:37 »
以小弟個人經驗
我會比較傾向這樣做
把一些功能寫成class或是function
例如取得會員資料
代碼: [選擇]

function GetMemberInfo($MemberID)
{
 global $DBObj;
 $DBObj->setFetchMode(DB_FETCHMODE_ASSOC);
 //使用Associative Query
 $Result=$DBObj->query("select name,phone,address from member where id='$MemberID';");
  if(PEAR::IsError($Result)) return false;
  $Data=$Res->fetchRow();
  $Res->free();
  return $Data;
}

可以掌握幾個要訣
1.盡量不要把SQL查詢寫在主程式裡面,當架構越來越龐大,程式碼重複使用效率就越糟糕,甚至為了效能因素調整資料庫結構,可能得修改上百條的SQL指令。
2.多使用Associative array以及named query。
    舉個簡單的例子
   select * from member;跟 select name,phone,address from member;
   哪個會比較好維護
   會許有人會說
   select * from member;查詢短寫起來方便
   可是如果哪天為了調整資料庫效能新增了某個欄位或是為了將資料庫正規劃
   把某個重複欄位給刪除了
   天阿整個程式碼不是得重新修改了
   此外
  PEAR::DB也提供了Associative query的功能
  為何要多使用Associtative而少用Row order??
  答案很簡單
  如果今天query出來的資料是多達數十個欄位
 $Data[0] => name
 $Data[1] => address
 $Data[2] => phone
 別說自己看的懂,若是在協同工作的情形下,我可能會想砍了寫這東西的傢伙
 腦袋已經夠不清楚了,還得苦命的去數我要的那個欄位到底是排第幾個
 使用Associative的好處浮現出來了
 $Data['name'] => name
 $Data['address'] => address
 $Data['phone'] => phone
 這樣不是清楚明瞭
 此外即使table的欄位名稱修改了,也可以透過SQL 的AS關鍵字重新命名而不用再去修改程式碼
 像這樣
 select myname as name,myaddress as address from member;
 這樣就不用擔心資料庫的變動得耗費大量的時間去修改程式碼了
以上一點小心得供大家參考吧
我的symfony作品:YOMOpets 寵物誌
有興趣可以一起來討論symfony喔
我的部落格:http://ricky.ez2.us/