[PHP Room] แชร์ PHP กันวันละนิด

เริ่มโดย EThaiZone, 05 มีนาคม 2007, 19:27:38

หัวข้อก่อนหน้า - หัวข้อถัดไป

0 สมาชิก และ 1 ผู้มาเยือน กำลังดูหัวข้อนี้

navy4100

 :-X :-Xl :'( :-Xส่งสัยเวเลทยังไม่ถึงขั้น อ่านไปอ่านมา งอสองตัวเลย :-X :P :'(
.......

Jenosize

พอดีเพิ่งหัดทำแบ่งหน้าคับ ออกอาการ งง เลยต้องตั้งมาถาม ไปดู code ของคนที่สอนก่อนนะครับ

อ้างถึง<?
$sql = "select * from table_name";
$rs = mysql_query($sql);
$totalrow = mysql_num_rows($rs); // ได้ตัวแปรเก็บจำนวนกระทู้ทั้งหมดแล้ว
?>

ต่อไปจะเป็นการแบ่งหน้า ในที่นี้คุณจำเป็นต้องทำค่า GET ใน url ของลิงค์คุณด้วย ยกเว้นหน้าแรก โดยให้ตัวแปรชื่อ $page ซึ่งจะเป็นค่าที่บอกว่าแสดงหน้าที่เท่าไร ใน url คุณจะต้องต่อท้ายเป็นดังนี้
http://www.domain.com/webboard/view.php?page=2
เป็นต้น ค่า GET ของ page=2 หมายความว่า ให้แสดงหน้าที่ 2


อ้างถึง<?
$pagesize = 20;  // แสดงจำนวนกระทู้ในแต่ละหน้า ในที่นี้จะแสดง 20 กระทู้
$totalpage = (int)($totalrow/$pagesize);  // หาจำนวนหน้าทั้งหมด
// ถ้าจำนวนหน้าเป็นเศษให้ปัดขึ้นไป
if(($totalrow%$pagesize)!=0){
$totalpage+ = 1;
}
// หา record แรกที่จะแสดงของแต่ละหน้า
if(isset($page)){
$pageno = $page;
$start = $pagesize*($pageno-1); << ที่ผมงงคือตรงนี้คับมันคือการห่าค่าเริ่มต้นของ record ตรงไหนคับ
}else{ 
$pageno = 1;
$start = 0;
}
?>
สู้ตายโว้ย.

pugkung

อ้างถึง//function list_page is Show link all page...
    function list_page($sql,$page_size,$src,$page='',$query_str)
   {
     $qr = mysql_query($sql);
     $rows = mysql_num_rows($qr);
     if($rows%$page_size == 0)
     {
       $total_page = $rows/$page_size;
     }
     else
     {
       $total_page = ($rows/$page_size)+1;
     }
     //print (int)$total_page." + $rows + $page_size";
     //exit;
     print "<br>";
     if((int)$total_page > 1){
       for($i=0;$i<(int)$total_page;$i++)
       {
         if($i == 0){
          if(empty($page) || $page == 1) print "<b>Page : </b> <a href=?page=1&Src=$src$query_str>&lt;&lt;</a>";
         else print "<b>Page : </b><a href=?page=".($page-1)."&Src=$src$query_str>&lt;&lt;</a>";
         print " [ ";
        }
          if($page == $i+1){
            print "<b><font color='red'>".($i+1)." </font></b>";
          }
          else{
            print "<a href=?page=".($i+1)."&Src=$src$query_str>".($i+1)."</a> ";           
          }
         if($i >= 0 && $i < (int)$total_page-1) print "| ";
        if($i==(int)$total_page-1){
         if($page == (int)$total_page) $page = (int)$total_page-1;
         print "] ";
         print "<a href=?page=".($page+1)."&Src=$src$query_str>&gt;&gt;</a>";
        }
       }
     }
   }//end function list page

เอางี้แล้วกัน ผมเอา function ที่ผมใช้อยู่มาแจกล่ะกันครับ ไม่ได้ หรูเริสอะไรแต่ก็พอใช้ได้ครับ

วิธีใช้ก็ นำเอา function ไปไว้ในที่ที่ต้องการให้แสดงเป็นหน้าออกมา

อ้างถึง
echo list_page($sql_list,$pageSize,$Src,$page,$Query_str);

Paramiter ที่ต้องการมีดังนี้
อ้างถึง
  $sql_list = คำสัง sql
  $pageSize = จำนวน แถว ที่ต้องการให้แสดงในแต่ละหน้า
  $Src = ข้อความของ Search ถ้าไม่มีไม่ต้องใส่ก็ได้ ให้ใส่เป็นค่าว่าง
  $page = หน้าที่แสดงในขณะนั้น ในกรณีเป็นหน้าแรก ให้ใส่เป็น 0 หรือ 1
  $Query_str = Query String ที่ต้องการส่ง *ต้องเริ่มต้นด้วยเครื่องหมาย & เท่านั้น

โค้ดอาจจะดูมั่วไปซักหน่อยนะครับ เพราะเขียนเอง ก็ไม่ได้เก่งอะไรมากมาย

Jenosize

ขอบคุณมากครับคุณ pugkung

แต่ผมสงสัย code ที่ผมลงไปหน่ะครับ พอช่วยอธิบายหน่อยได้ไหมคับ แบบว่า งง
สู้ตายโว้ย.

pugkung

มันคือการ เอาไปหา record ในฐานข้อมูลอ่ะครับ แบบว่าถ้าเราไม่ ลบ ออก 1 มันจะไปค้นหาในส่วนที่เกินของข้อมูลไป 1 record

งงป่าวเนี่ย

EThaiZone

$totalpage = (int)($totalrow/$pagesize);  // หาจำนวนหน้าทั้งหมด
// ถ้าจำนวนหน้าเป็นเศษให้ปัดขึ้นไป
if(($totalrow%$pagesize)!=0){
$totalpage+ = 1;
}


โค้ดท่อนนี้ ความจริงเขียนให้กระชับได้ครับ เป็น

$totalpage = ceil($totalrow/$pagesize); //หารแบบปัดเศษขึ้น


ส่วนตรงนี้
$start = $pagesize*($pageno-1); << ที่ผมงงคือตรงนี้คับมันคือการห่าค่าเริ่มต้นของ record ตรงไหนคับ

ที่ว่า ลบ 1 คือไปลบกับเลขหน้าครับ
ทำไปทำไม ก็เพราะว่า

เวลาเราค้นใน record มันจะต้องเริ่มจาก 0
แต่เลขหน้ามันเริ่มจาก 1
เวลานำมาคำนวนจุดเริ่มค้นจะต่างกันครับ

ตามสูตรนี้
จุดเริ่ม = ขนาดหน้า * (เลขหน้า - 1 )
0  =  20 * ( 1 - 1 )

แต่ถ้า ไม่มี -1 ล่ะ
20 = 20 * 1


พอเข้าใจปะครับ



Jenosize

เข้าใจแล้วครับ ขอบคุณมากๆเด้อ  ;D
สู้ตายโว้ย.

EThaiZone

#207
พอไม่ได้มาอัพ เหมือนขาดแหล่งจดไอเดียเลยอะ

วันนี้ก็มาจดเพิ่ม  (ผมไม่ได้ทำเพื่อใครเลย เพื่อตัวเองทั้งนั้น  ;D)

พอดีมีเคสว่า เดิมค่าพาทเป็นแบบนี้

$path = "../../";

ซึ่งผมเอาไว้เขียนไฟล์ลงตำแหน่งนั้น ในความหมายบรรทัดนี้คือย้อนไป 2 โฟลเดอร์

ซึ่งบน localhost มันทำงานได้ปกติ แต่พอใช้กับโฮสจริง... เออ.. เอ๋อเลย..
เอ๋อเหรอ Error นั้นเอง  :o

อ้างถึง[24-Jan-2008 00:00:44] PHP Warning:  fopen(../../newfile.php in /home/myhost/public_html/dir/dat/write.php on line 26
[24-Jan-2008 00:00:44] PHP Warning:  fwrite(): supplied argument is not a valid stream resource in /home/myhost/public_html/dir/dat/write.php on line 27

ปัญหาก็เพราะ ผมไม่ได้อ้างพาทเขียนไฟล์แบบเต็มๆ

นับ 5 วิ ผมนึกได้ ต้องเขียน php ไว้ public_html มาอ่านพาท แล้วเอาไปกรอกในคอนฟิก...

วิธีนี้ลำบากแฮะ ด้วยความขี้เกียจทำบ่อย เลยนึกต่อ จนได้คำตอบว่า

$path = preg_replace("#([^/]+/){2}(".basename(__FILE__).")$#", "", str_replace("\\", "/", __FILE__));

คือขั้นแรกก็เอาค่า __FILE__ มาใช้
แก้ \ เป็น / ก่อน ด้วย str_replace (สำหรับกรณีโฮสวินโดวน์)
ต่อมาก็ preg_replace เลย โดยเขียนตัดเอาชื่อโฟลเดอร์ต่อท้าย 2 โฟลเดอร์ืืืทิ้งซะ!

ปัญญานี้ก็แก้ได้เรียบร้อย ;D

ต่ออีกนิด

ทำไมผมใช้ __FILE__ ในเมื่อ
หลายคนคงนึกถึงตัว $_SERVER['PHP_SELF'] แต่ความต่างมันก็คือ
$_SERVER['PHP_SELF'] จะอ้างจากชื่อไฟลหลักที่ทำงาน อย่างถ้ามันไปอยู่ใน index2.php
แต่เราเรียก index.php แล้วไป include index2.php แต่ยังไง $_SERVER['PHP_SELF'] มันจะอ้างที่ index.php อยู่ครับ

แต่กลับกัน __FILE__ จะอ้างที่ index2.php แทน คือมันจะอ้างไฟล์ที่คำสั่งมันอยู่นั้นเอง

::) ::)

[อัพเดต!]

thenetxx

-*-

เป็นผม  ใส่ config ไว้


$rootpath = 'usr/home/public_html';


จบ เวลาเรียกใช้ไม่งง แถมง่ายกว่า เอาง่ายเข้าว่า เอิ๊กกก
Develop site but can't develop life
ASIA

EThaiZone

อ้างถึงจาก: thenetxx ใน 24 มกราคม 2008, 20:13:37
-*-

เป็นผม  ใส่ config ไว้


$rootpath = 'usr/home/public_html';


จบ เวลาเรียกใช้ไม่งง แถมง่ายกว่า เอาง่ายเข้าว่า เอิ๊กกก


แต่ผมขี้เกียจไง เพราะนึกถึงตอนปั๊มทีหลายสิบเว็บ 555+

(ความจริงคือลูกค้าจ้างครับ ผมทำให้สบายลูกค้ามากที่สุด ^^)

lowprofile

ผมแบ่งไว้เป็นสามชนิดครับ แล้วแต่ว่าจะเลือกใช้แบบไหน

define('ROOT_DIR', '../');
define('ROOT_URL', 'http://'.$_SERVER["HTTP_HOST"].'/');
define('DOC_ROOT', $_SERVER["DOCUMENT_ROOT"].'/');


เวลาใช้ในการ link (a href) ก็ใช้ ROOT_URL (เห็นบางคนบอกว่าดีกับการ seo แต่ผมเน้นใช้ .htaccess เลยต้องใช้ตัวนี้)
เวลาใช้ในการ include, require ก็ใช้ DOC_ROOT
ส่วน ROOT_DIR นี่ไม่ค่อยได้ใช้เท่าไหร่ครับ แต่ก็เผื่อไว้สำหรับอนาคต


แต่พวก PATH_SEPARATOR ไม่ค่อยได้ใช้เท่าไหร่
http://th2.php.net/set_include_path
ชีวิตนี้น้อยนัก

๏ พายเถิดพ่ออย่ารั้ง   รอพาย
จวนตะวันจักสาย   ส่องฟ้า
ของสดสิ่งควรขาย   จักขาด ค่าแฮ
ตลาดเลิกแล้วอ้า   บ่นอื้นเอาใคร ๚ะ๛


คราวนี้เป็นคราวเงินหมด
ธนาคาร : ไทยพาณิชย์ จำกัด (มหาชน) สาขา : อุดรธานี
ชื่อบัญชี : โครงการช่วยชาติโดยหลวงตามหาบัว ญาณสัมปันโน
เลขที่บัญชี : 510-2-83957-5

EThaiZone

ปกติถ้าไม่พลิกแพลง ผมเองก็ใช้แบบนี้

//ชื่อไฟล์ที่ทำงาน
$PHPSELF = basename($_SERVER['PHP_SELF']);
//ใช้ระบุพาทภายในแบบเต็ม
$localpath = dirname(__FILE__)."/";
//ใช้ระบุพาทเว็บภายนอกแบบเต็ม
$hostpath = preg_replace("#(/".$PHPSELF.")$#", "", "http://".$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF']);
//ใช้ระบุซัพโฟลเดอร์
$subpath = preg_replace("#(".$PHPSELF.")$#", "", $_SERVER['PHP_SELF']);

thenetxx

อืม ๆๆ set แบบคุณ Ethai (อิตัย) อิอิ

แล้วก็ใช้ define เอา แบบคุณ low ก็ง่ายดีแฮะ

น่าคิด
Develop site but can't develop life
ASIA

EThaiZone

#213
อ้างถึงจาก: thenetxx ใน 25 มกราคม 2008, 23:26:57
อืม ๆๆ set แบบคุณ Ethai (อิตัย) อิอิ

แล้วก็ใช้ define เอา แบบคุณ low ก็ง่ายดีแฮะ

น่าคิด

งั้นก็แบบนี้ (ฮา)

//ชื่อไฟล์ที่ทำงาน
define('PHPSELF', basename($_SERVER['PHP_SELF']));
//ใช้ระบุพาทภายในแบบเต็ม
define('LOCALPATH', dirname(__FILE__)."/");
//ใช้ระบุพาทเว็บภายนอกแบบเต็ม
define('HOSTPATH', preg_replace("#(/".PHPSELF.")$#", "", "http://".$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF']));
//ใช้ระบุซัพโฟลเดอร์
define('SUBPATH', preg_replace("#(".PHPSELF.")$#", "", $_SERVER['PHP_SELF']));


ตัว LOCALPATH ของผมคล้ายกับ DOC_ROOT
เพียงแต่ ใช้ในกรณีทำงานได้ทุกโฟลเดอร์ และมันหาตำแหน่งปััจจุบันได้เอง (เครดิิตยกให้ Tee++; ครับ)
ส่วน HOSTPATH  ก็คล้ายกับ ROOT_URL เพียงแต่ทำงานกับซัพโฟลเดอรได้ด้วย
ส่วนสุดท้ายตัว SUBPATH ใช้ในกรณีตรวจสอบว่าเป็นซัพโฟลเดอร์ได้หรือเปล่า ดูจากนี้ได้เลย

สรุปว่า 4 ตัวนี้ ถ้าคนเขียนใช้ดีๆ ผมรับรองเลยว่า
สามารถเขียนแบบไม่ต้องมานั่งแก้ config ระบุชื่อโดเมนลงไปเหมือนสมัยเก่าๆ ครับ
(นี้คือสาเหตุที่เขียนเป็นแบบนี้  ::))

EDIT: แก้เพิ่มตามทีุ่คุณ lowprofile บอก

EixQzUnG

พอดีผม จะเก็บ ค่า search อะคับ ไม่ให้มันเก็บ คำที่เกียวกับเว็ป เขียน if กันยังไง ดีคับ


ไม่มี ความรู้เรื่อง คำสัง จักการ กับ สตริงเลยนะคับ


แบบว่าป้องกัน คำว่า http://,.com,.net.org อะไร พวกนี้


เขียนไม่พอเป็นอะคับ แต่ เก็บค่า a-z ก-ฮ นะคับ



hurahura

คำสั่ง define มันดียังไงเหรอครับ

EThaiZone

อ้างถึงจาก: hurahura ใน 04 กุมภาพันธ์ 2008, 20:31:25
คำสั่ง define มันดียังไงเหรอครับ

ตอบท่าน hurahura (ทำไมผมชอบอ่านเป็น haruhura หว่า -*-)

ดีตรงไหน มันมีตรงที่
ค่าที่โดน define แล้วจะแก้ไขไม่ได้อีกในการทำงานนั้นๆ (ถ้าอยากแก้ก็มีทาง แต่ต้องลง extension เสริมลงไป) และ สามารถเรียกใช้แบบไม่มี $ ได้ พูดง่ายๆ คือค่าที่โดนทำแล้วมันจะเป็น constant (ค่าคงที่)

เลยจะเรียกใช้งานได้สะดวก เหมาะมากกับค่าที่เราไม่คิดเปลี่ยนแปลงอีก
และแถมเวลาเรียกใช้จะเห็นความแตกต่างในระดับหนึ่งด้วย

EThaiZone


ฉันไม่มีตัวตน

ผมขอถามมั่งนะครับ.ขอขอบคุณล่วงหน้าเลย..อิอิ.
ผมจะทำเว็บบอร์ดไทย แล้วให้มีบางห้องเป็นภาษาeng.
ถ้าผมต้องการ include แบนเนอร์เฉพาะห้องภาษาeng ผมจะใช้สคริปแบบไหนอ่ะครับ(ผมไม่ใช่โปรแกรมเมอร์นะ ผมอาศัยมั่วๆเอาอ่ะ).

ตย.เอาบอร์ดTSB นี่ล่ะ เช่น ผมต้องการติด adsense ห้อง Basic Information , แล้วห้องอื่นๆ ติด nipa
ห้องข่าวสารจากทีมงาน http://www.thaiseoboard.com/index.php?board,24.0
ห้องBasic Information http://www.thaiseoboard.com/index.php/board,9.0.html
ห้องTWG http://www.thaiseoboard.com/index.php/board,1.0.html

EThaiZone

#219
ตอบคุณ ninep

อ่า ถามแบบนี้ จ้างผมทำเลยดีกว่าไหมเนี่ย 555+ มะกี้ผมนั่งไล่โค้ดอยู่ตั้งนาน  :P

ไหนๆ ก็ไล่จนเสร็จ ให้แก้ตามนี้ครับ  :)

ขั้นแรกเปิดไฟล์ Display.template.php ของเืทมเพลต default ครับ  ( Themes/default/ )

ต้องแก้ทั้งหมด 2 อย่างครับ

อย่างแรกค้นหา (แถวบรรทัดที่ 6)
global $context, $settings, $options, $txt, $scripturl, $modSettings;

เจอแล้วแก้เป็น
global $context, $settings, $options, $txt, $scripturl, $modSettings, $board;

แล้ว หาบรรทัด (ราวๆ บรรทัดที่ 17)
<td valign="bottom">', theme_linktree(), '</td>';

หาเจอแล้ว เพิ่มคำสั่งต่อท้าย (คือไม่ได้ยุ่งกับของเดิมนะ)

$blist = array('1', '9');
$key = array_search($board, $blist);
if($key !== FALSE) {
echo 'Adsense Code';
}


ตรง Adsense Code ก็แก้เป็นโค้ด adsense ของคุณ

ตรง $blist = array('1', '9');
ก็คือใส่เลขหมวดของบอร์ด อย่าง 1 กับ 9 คือ หมวด TWG และ Basic Information


ประมาณนี้ครับ

แต่!!!! ผมไม่รับประกันว่าจะใช้ได้ เพราะไล่แต่โค้ด ไม่ได้ลองแก้และรันจริงๆ
ได้ผลอย่างไรก็มาบอกได้ครับ

(กลัวตัวแปร $board จะส่งค่าไม่ถึง หรือมีการจัดการตัวแปรให้เป็นไปซะก่อน - -*)

:)