สอบถามเรื่อง while ทีครับพอดีผมหัดใช้วิธี เขียน Class Database นะครับ
Code (PHP)
$objSelect = $clsMyDB->fncSelectRecord();
if(!$objSelect)
{
echo "Record not found<br>";
}
else
{
echo "Customer Detail.<br>";
echo "CustomerID = $objSelect[CustomerID]<br>";
echo "Name = $objSelect[Name]<br>";
echo "Email = $objSelect[Email]<br>";
echo "CountryCode = $objSelect[CountryCode]<br>";
echo "Budget = $objSelect[Budget]<br>";
echo "Used = $objSelect[Used]<br>";
}
เปลี่ยนเป็น
Code (PHP)
while($objSelect = $clsMyDB->fncSelectRecord())
{
echo "Customer Detail.<br>";
echo "CustomerID = $objSelect[CustomerID]<br>";
echo "Name = $objSelect[Name]<br>";
echo "Email = $objSelect[Email]<br>";
echo "CountryCode = $objSelect[CountryCode]<br>";
echo "Budget = $objSelect[Budget]<br>";
echo "Used = $objSelect[Used]<br>";
}
Date :
2012-04-30 10:24:48
By :
sakuraei
Code (PHP)
include_once 'config/Db.php';
$clsMSSIMSDB->strTable = "InventoryClass";
$clsMSSIMSDB->strCondition = " iInvCGrade = '1' ORDER BY cInvCCode";
$objSelect = $clsMSSIMSDB->fncSelectRecord();
if(!$objSelect){
echo "ไม่พบ Record <br/>";
} else {
echo '<body>';
echo '<div id="div-head-tree-menu">';
echo ': หมวดสินค้า :';
echo '</div>';
echo '<div id="div-tree-menu">';
echo '<ul id="tree-menu">';
while($objSelect = $clsMSSIMSDB->fncSelectRecord())
{
echo '<li>';
echo '<a href="#">';
echo '<span>';
echo '+';
echo '</span>';
echo "$objSelect[cInvCName]";
echo '</a>';
มันออก...มาแค่ record เดียวนะครับมันไม่ลูปให้เลยอะครับ
Date :
2012-04-30 10:46:27
By :
time.toon
จากบรรทัดนี้
04.$objSelect = $clsMSSIMSDB->fncSelectRecord();
ทำการดึงข้อมูลออกไปก่อนแล้ว 1 เรคคอร์ดครับ
ถ้าข้อมูลมีทั้งหมด 2 เรคคอร์ด ก็ที่เหลืออีกหนึ่งจะออกในลูป while ครับ
แนะนำให้ทำแบบนี้ครับ
Code (PHP)
include_once 'config/Db.php';
$clsMSSIMSDB->strTable = "InventoryClass";
$clsMSSIMSDB->strCondition = " iInvCGrade = '1' ORDER BY cInvCCode";
$count=0;
echo '<body>';
echo '<div id="div-head-tree-menu">';
echo ': หมวดสินค้า :';
echo '</div>';
echo '<div id="div-tree-menu">';
echo '<ul id="tree-menu">';
while($objSelect = $clsMSSIMSDB->fncSelectRecord())
{
echo '<li>';
echo '<a href="#">';
echo '<span>';
echo '+';
echo '</span>';
echo "$objSelect[cInvCName]";
echo '</a>';
$count++;
}
if(!$count) echo "ไม่พบ Record <br/>";
Date :
2012-04-30 10:56:25
By :
sakuraei
Code (PHP)
function fncSelectRecord()
{
$strSQL = "SELECT * FROM $this->strTable WHERE $this->strCondition ";
$objQuery = @mssql_query($strSQL);
return @mssql_fetch_array($objQuery);
}
มันลุปแต่
ประวัติการแก้ไข 2012-04-30 11:17:03
Date :
2012-04-30 11:16:42
By :
time.toon
คือตาม ฟังก์ชั่น นะครับ
ด้านล่างคือ ลูปที่ใช้ปกติไม่มีคลาสนะครับ
Date :
2012-04-30 11:18:50
By :
time.toon
ไอ้ตัว @ นี่ ทำให้เว็บช้านะครับ ยิ่งเยอะยิ่งอืด
Date :
2012-04-30 11:28:47
By :
pjgunner.com
1.ต้องแยกเป็นสอง เมธอดครับ
Code (PHP)
private $objQuery;
public function fncQuery()
{
$strSQL = "SELECT * FROM $this->strTable WHERE $this->strCondition ";
$this->objQuery = @mssql_query($strSQL);
}
function fncSelectRecord()
{
return @mssql_fetch_array($this->objQuery);
}
เวลาเอาไปใช้ก็แบบนี้ครับ
Code (PHP)
$clsMSSIMSDB->strCondition = " iInvCGrade = '1' ORDER BY cInvCCode";
$count=0;
$clsMSSIMSDB->fncQuery();
....
.....
......
while($objSelect = $clsMSSIMSDB->fncSelectRecord())
{
2.อาจใช้ คีย์เวิร์ด static มาช่วย
Code (PHP)
private static $objQuery;
function fncSelectRecord()
{
$strSQL = "SELECT * FROM $this->strTable WHERE $this->strCondition ";
$this->objQuery = @mssql_query($strSQL);
return @mssql_fetch_array($objQuery);
}
ทดสอบดูน่ะครับ เพราะผมคีย์สดไม่ได้ลองโค้ดเลย แจ้งผลกลับมาด้วยน่ะครับ
Date :
2012-04-30 11:29:26
By :
sakuraei
Date :
2012-04-30 11:50:50
By :
sakuraei
ถ้าเกิดคุณใช้ static คุณไม่สามารถใช้ คลาสนี้ พร้อมกันสอง instance ได้ เพราะข้อมูลของตัวใหม่จะทับตัวเก่า
ผมไม่เคยใช้ mssql นะคับ
ทำไมมันออกเรคคอร์ดเดียว เพราะว่า คุณเรียนเมธอดด้วย
while(เรียกเมธอด) มันทำการคิวรี่ใหม่ทุกรอบ และเมธอดของคุณใช้ fetch รอบเดียว ก็คือแถวแรก เท่านั้น
วิธีคือ ให้คิวรี่เมธอดนึง แล้วเก็บตัวแปรไว้ใน instance แล้วเวลาดึงค่อยเอามาจากที่นั่น
Date :
2012-04-30 11:56:24
By :
pjgunner.com
ผมเคยเขียน OO DB เหมือนกัน ต้องใช้เทคนิค Instance บวกกับพวก skeleton อีกนิด ก็จะตัดปัญหาเรื่องการเรียกคลาสซ้ำกันได้
Date :
2012-04-30 11:59:30
By :
sakuraei
ผีกระดูก ป่าว
คลาสแบบนี้อาจมีการใช้ หลาย instance พร้อมกัน ไม่ควรใช้ singleton
Date :
2012-04-30 12:02:57
By :
pjgunner.com
ตอนนี้ No.8 ข้อที่ 1 ปลอดภัยครับ ใช้ได้ตามปกติครับ
Date :
2012-04-30 12:50:38
By :
sakuraei
จากรูปนะครับ เจียร-ขัด-ตัด-ถู
คือ while($objSelect = $clsMSSIMSDB->fncSelectRecord())
echo "$objSelect[cInvCName]";
แต่ submenu ผมต้อง QUERY ใหม่ครับ
$clsMSSIMSDB->strCondition = "iInvCGrade = '2'AND cInvCCode LIKE '$objSelect[cInvCCode]%'
แต่มันใช้ $clsMSSIMSDB->strCondition ซ้ำไม่ได้นะครับ
echo "$objSelect_1[cInvCName]";
Date :
2012-04-30 13:01:42
By :
time.toon
สร้าง object ใหม่อีกอันนึงคับ
Date :
2012-04-30 13:06:01
By :
pjgunner.com
$clsMSSIMSDB2 = new ออปเจ็ค (เอาไว้นอกด้านนอกลูปน่ะครับ)
แล้วก็ใช้ $clsMSSIMSDB2 ในลูปเพื่อ คิวรี่และดึงค่า
Date :
2012-04-30 13:08:38
By :
sakuraei
หรือจะใช้การโคนนิ่งก็ได้ครับ
$clsMSSIMSDB2 = clone $clsMSSIMSDB;
Date :
2012-04-30 13:11:24
By :
sakuraei
ช่วยดูอีกหน่อยเถอะครับ มันออกไม่ครบ นะครับ
Code (PHP)
<?
include_once 'config/Db.php';
$clsMSSIMSDB->strTable = "InventoryClass";
$clsMSSIMSDB->strCondition = "iInvCGrade = '1' ORDER BY cInvCCode";
$count=0;
$clsMSSIMSDB->fncQuery();
echo '<body>';
echo '<div id="div-head-tree-menu">';
echo ': หมวดสินค้า :';
echo '</div>';
echo '<div id="div-tree-menu">';
echo '<ul id="tree-menu">';
while($objSelect = $clsMSSIMSDB->fncSelectRecord())
{
echo '<li>';
echo '<a href="#">';
echo '<span>';
echo '+';
echo '</span>';
echo "$objSelect[cInvCName]";
echo '</a>';
echo '<ul id="menu-lv1">';
$clsMSSIMSDB2 = clone $clsMSSIMSDB;
$clsMSSIMSDB2->strTable = "InventoryClass";
$clsMSSIMSDB2->strCondition = "iInvCGrade = '2'AND cInvCCode LIKE '$objSelect[cInvCCode]%' ORDER BY cInvCCode ";
$clsMSSIMSDB2->fncQuery();
while($objSelect_1 = $clsMSSIMSDB2->fncSelectRecord())
{
echo '<li>› ';
echo '<a href="page_sub2?id=$objSelect[cInvCCode]">';
echo "$objSelect_1[cInvCName]";
echo '</a>';
echo '</li>';
}
echo '</ul>';
}
$clsMSSIMSDB->__destruct;
echo '</li>';
echo '</ul>';
echo '</div>';
echo '</body>';
echo '</html>';
?>
เหมือนมันหยุด ลูป ที่ อุปกรณ์ก่อสร้างนะครับ แต่ Submenu ด้านในก็ออกครบและตรงกับหมวดนะครับ
Date :
2012-04-30 13:47:18
By :
time.toon
!@#$% ปิดกระทู้ครับ ได้แล้วครับ....ขอบคุณทุกท่านครับ
เริ่มต้นกะ OOP
Date :
2012-04-30 14:15:21
By :
time.toon
Load balance : Server 04