 |
สอบถามเรื่อง 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 |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
|
|