สอบถามเรื่อง oop ของ Mysql Connection มันไม่ clear ค่าเมื่อเรียก function ซ้ำกัน
เพิ่งหัดเขียน oop ครับ เริ่มกับการ Mysql connection ก่อน ตาม Code ด้านล่างครับ
Code (PHP)
<?
class DBTools{
/*
select and where condition
$this->DBCharSet="UTF8";
$this->SelectTable="database";
$this->SelectField="field1 field2"; // for display column field
$this->WhereData="field1='test' and field2 like '%like%' ";
define navigator
$this->ShowNav=1; 0=disable
$this->line_per_page=20;
$this->page_space=3;
$this->get_page=$_GET['page'];
$this->NavParam="param1=1¶m2=2";
show data
$this->ShowData=1;
$this->ShowQuery=1; show query syntax
$this->ShowTableData();
*/
function __construct(){
unset($SelectTable);
unset($WhereData);
unset($ShowQuery);
unset($DataOrder);
unset($SelectField);
unset($line_per_page);
unset($page_space);
unset($NavParam);
unset($get_page);
}
function ConnDatabase($MyHost,$MyDB,$MyUsername,$MyPassword){
$this->GoConn=mysql_connect($MyHost,$MyUsername,$MyPassword);
$this->GoDB=mysql_select_db($MyDB);
mysql_query("SET character_set_results=".$this->DBCharSet);
mysql_query("SET NAMES ".$this->DBCharSet);
}
function ShowTableData(){
if($this->WhereData ==null)
{
$query_data="select * from ".$this->SelectTable;
}
if($this->WhereData !=null)
{
$query_data="select * from ".$this->SelectTable." where ".$this->WhereData;
}
if($this->ShowQuery==1)
{
echo $query_data;
}
if($this->ShowNav==1)
{
$per_page=$this->line_per_page;
$page_space=$this->page_space;
$nav_param=$this->NavParam;
$count=1;
$get_page=$this->get_page;
if ( !$get_page )
{ $get_page = 1; }
$prev_page = $get_page - 1;
$next_page = $get_page+ 1;
$page_start = ( $per_page * $get_page) - $per_page;
// calculate start no. for list count no.
$count=(( ($per_page)*($get_page) )-$per_page)+1;
////////////
$result_count=mysql_query($query_data);
$query_data .= " LIMIT ".$page_start." , ".$per_page;
$result_data= mysql_query($query_data);
$result_num_record=mysql_num_rows($result_count);
$num_rows=$result_num_record;
// if all record less than per page variable that define num_page to 1 (page no.1)
if ( $num_rows <= $per_page ){
$num_pages = 1;
}else if ( ( $num_rows % $per_page ) == 0 ){
$num_pages = ( $num_rows / $per_page );
}else{
$num_pages = ( $num_rows / $per_page ) + 1;
$num_pages = ( int ) $num_pages; }
//// create previous button
echo "<table width=1024>";
echo "<tr>";
if($get_page==1){echo "<td>|";}
if ( $prev_page ){echo "<td><a href=".$_SERVER['PHP_SELF']."?page=".$prev_page."&".$nav_param."><img border=0 src=images/previous_arrow.gif>Previous </a>|"; }
$i=1;
////////////////// create number of page ////////////////////////////////
while($i<=$num_pages)
{
if ( $i != $get_page)
{
if(($i<=($get_page+$page_space))&&($i>=($get_page-$page_space)) )
{
echo "<a href=".$_SERVER['PHP_SELF']."?page=".$i."&".$nav_param."><b> ".$i." </b></a>|";}
}elseif($i==$get_page){echo "<b> ".$i." </b>|";}
$i++;
}
/////////////////// create next button /////////////////////////////////////
if ( $get_page != $num_pages ) {echo "<a href=".$_SERVER['PHP_SELF']."?page=".$next_page."&".$nav_param."> Next</a><img border=0 src=images/next_arrow.gif> </td>"; }
echo "</tr>";
echo "</table>";
echo "<table><tr><td>".number_format($num_rows)." Records: ".number_format($get_page)." of ".number_format($num_pages)." pages</td></tr></table>";
}
if($this->ShowNav==0)
{
}
if($this->ShowData==1)
{
$show_field=$this->SelectField;
$show_field=explode(" ",$show_field);
while($object_data=mysql_fetch_array($result_data))
{
?>
<div class="data_row">
<?
$count_field=0;
while($count_field<count($show_field))
{
?>
<div class="data_field">
<?=$object_data[$show_field[$count_field]];?>
</div>
<?
$count_field++;
}
?>
</div>
<?
}
}
}
function SelectRecord()
{
if($this->SelectField !=null)
{
$selectField=$this->SelectField;
}else{
$selectField="*";
}
if($this->WhereData ==null)
{
$query_data="select ".$selectField." from ".$this->SelectTable;
}
if($this->WhereData !=null)
{
$query_data="select ".$selectField." from ".$this->SelectTable." where ".$this->WhereData;
}
if($this->DataOrder!=NULL)
{
$query_data .=" order by ".$this->DataOrder;
}
if($this->DataLimit !=null)
{
$query_data .=" limit ".$this->DataLimit;
}
if($this->ShowQuery==1)
{
echo $query_data;
}
$result_data=mysql_query($query_data);
return $result_data;
}
function InsertRecord(){
$insert_query="insert into ".$this->SelectTable." (".$this->InsertField.") values (".$this->DataField.")";
$insert_result=mysql_query($insert_query);
if($this->ShowQuery==1)
{
echo $insert_query;
}
if($insert_result)
{return true;}else{return false;}
}
function DeleteRecord(){
$delete_query="delete from ".$this->SelectTable." where ".$this->DeleteField."";
$delete_result=mysql_query($delete_query);
if($delete_result)
{return true;}else{return false;}
}
function UpdateRecord(){
$update_query="update ".$this->SelectTable." set ".$this->UpdateField." where ".$this->WhereData."";
$update_result=mysql_query($update_query);
if(mysql_affected_rows()>0)
{return true;}else{return false;}
}
function __destruct(){
@mysql_free_result($result_data);
@mysql_free_result($insert_result);
}
}
?>
ตามประสา งูๆ ปลาๆ ครับ
คราวนี้ผมก็ include เข้ามา แล้วเรียกใช้อีก file นึง
Code (PHP)
$clsMyDB->SelectTable="favs_category";
$clsMyDB->WhereData="category_id='".$objSelect['category_id']."' and member_id='".$_SESSION['valid_member_id']."' ";
$clsMyDB->DataOrder="category_id ASC";
//$clsMyDB->ShowQuery=1;
$fetchOldData=$clsMyDB->SelectRecord();
$num_rows=mysql_num_rows($fetchOldData);
if($num_rows==1){
$class_style="favs_category_box_toggle2";
?>
<script type="text/javascript">
$('#category_array').val($('#category_array').val()+" "+"<?=$objSelect['category_id']?>");
</script>
<?
}else{
$class_style="favs_category_box_toggle1";
}
$clsMyDB->SelectTable="topic left join blog on topic.blog_id=blog.blog_id";
//$clsMyDB->SelectField="topic.add_type_id,topic.topic_id,topic.topic_counter,topic.subject,topic.description,topic.member_id, blog.access_level";
$clsMyDB->DataOrder="topic.topic_counter DESC";
//$clsMyDB->ShowQuery=1;
$clsMyDB->WhereData="blog.category_id='".$objSelect['category_id']."'";
$clsMyDB->DataLimit=5;
$fetchDataTopic=$clsMyDB->SelectRecord();
while($getChild=mysql_fetch_array($fetchDataTopic))
{ code บลาๆๆๆ}
จากเงื่อนไขแรกผมก็เรียกดูข้อมูลได้ปกตินะครับ แต่พอเงื่อนไข 2 ผมก็ต้องการเรียกซ้อนลึกลงไปอีกชั้นนึง
ปรากฏว่า ตัวแปร $clsMyDB มันดันดึง query แรกมาประมวลผลซะงั้น
ไม่รู้ผมอธิบายเข้าใจมั้ยนะครับ code บางส่วนตัดออก มันยาว
เพราะ
$clsMyDB=new DBTools();
$clsMyDB->DBCharSet="UTF8";
$clsMyDB->ConnDatabase($MyHost,$MyDB,$MyUsername,$MyPassword);
ก็อยู่ใน include ไฟล์นึง เอาเป็นว่ามันทำงานได้ชัวร์
แต่ปัญหาคือ ถ้าเรียก function oop ซ้อนกัน บางครั้งมันจะเรียก $clsMyDB บางค่าจากเงื่อนไขแรก
มาเกี่ยวกับเงื่อนไขล่าง เหมือนมันไม่ clear หรือเริ่มรับค่าใหม่
อยากให้เมื่อเรียก $clsMyDB->SelectTable="บลาๆ"; ให้่มัน clear ค่า SelectField ,DataOrder, ShowQuery,WhereData จากเงื่อนไขแรก อะไรประมาณนี้ เพราะมันจะเอาค่าพวกนี้จากเงื่อนไขแรกมาทำงานในเงื่อนไขสองด้วย
แก้ไขยังไงดีครับTag : PHP, MySQL
Date :
2013-05-28 22:28:25
By :
slack_man
View :
888
Reply :
3
ที่มันไม่เคลียร์ค่าก็เพราะหน้าที่เรียกใช้คำสั่ง ยังทำงานไม่จบอาจจะต้องเรียกใช้อีกหลายครั้ง เช่น
$clsMyDB->SelectTable = "favs_category";
คำสั่งแรกอาจจะนับจำนวนทั้งหมดที่อยู่ในเงื่อนไข
คำสั่งที่สองเพื่ออัพเดต ตาราง
คำสั่งที่สาม ....
พอใช้ตารางใหม่
$clsMyDB->SelectTable="topic left join blog on topic.blog_id=blog.blog_id";
ค่า SelectField ,DataOrder, ShowQuery,WhereData ก็จะติดมาด้วย
แก้โดยถ้าไม่ใช้แล้วก็เซ็ตเป็น NULL ไปเลยครับ
ดูจากโค๊ด
Code (PHP)
if($this->WhereData ==null)
{
$query_data="select * from ".$this->SelectTable;
}
ถ้าเซ็ต
$clsMyDB->WhereData = null;
$clsMyDB->SelectField = null;
//แล้วเรียก
$clsMyDB->SelectTable = "ตารางใหม่";
เงื่อนไขเดิมก็จะหายไป หรือเป็นไปตามเงื่อนไขใหม่ที่กำหนดนอกเหนือจาก NULL
ประวัติการแก้ไข 2013-05-28 23:21:02
Date :
2013-05-28 23:19:40
By :
{Cyberman}
ขอบคุณครับ ตอนนี้ทำ function เสริมให้มัน clear ก่อนเรียกทุกครั้งละ
Date :
2013-05-29 00:03:53
By :
slack_man
ตอบความคิดเห็นที่ : 2 เขียนโดย : slack_man เมื่อวันที่ 2013-05-29 00:03:53
ลองเอาโค๊ดนี้ไปใช้ดูนะครับรองรับ mysqli ด้วยครับ
Connect To Your Database Using OOP PHP5 With Mysql And Mysqli
พอได้คลาสหลักแล้ว ก็สร้างคลาสสำหรับบันทึกลงแต่ละตารางเพื่อง่ายต่อการเรียกใช้
เช่น มีตาราง tb_student ก็สร้างคลาส
Class Student extends MainClass
{
const tbName = "tb_student";
public function load()
{
}
public function insert()
{
}
public function update()
{
}
public function delete()
{
}
//.... เมธอดอื่นๆ ของแต่ละตาราง
//....
//....
//....
//....
}
ฐานข้อมูลเรามีกี่ตารางก็สร้างคลาสตามนั้น เวลาเรียกใช้ก็จะแยกออกจากกัน
โดยไม่ต้องประกาศชื่อตาราง หรือเงื่อนไขทุกครั้งที่เรียกใช้
มาเรียนรู้ OOP ไปด้วยกันนะครับ ^^
Date :
2013-05-29 06:56:27
By :
{Cyberman}
Load balance : Server 01