ช่วยเเก้โคดเว็ปบอร์ดนี้ให้หน่อยครับ คือผมต้องการให้เรียกตามชื่อกระทู้เลยอ่ะครับไม่ใช้เรียงตามหมายเลขอ่ะครับ
คือผมต้องการให้เรียกตามชื่อกระทู้เลยอ่ะครับไม่ใช้เรียงตามหมายเลขอ่ะครับ
ต้องเเก้โคดส่วนไหนบางครับ
โคดนี้ได้มาจากหนังสือครับ
webboard_db
CREATE DATABASE webboard_db;
USE webboard_db;
CREATE TABLE questions (
qID INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
qTopic VARCHAR(255) NOT NULL,
qDetail LONGTEXT NOT NULL,
qDate DATETIME NOT NULL,
qName VARCHAR(50) NOT NULL,
qIPAddress VARCHAR(15),
qAnswerCount INT UNSIGNED NOT NULL
);
CREATE TABLE answers (
aQuestionID INT UNSIGNED NOT NULL,
aID INT UNSIGNED NOT NULL,
aDetail LONGTEXT NOT NULL,
aDate DATETIME NOT NULL,
aName VARCHAR(50) NOT NULL,
aIPAddress VARCHAR(15),
PRIMARY KEY (aQuestionID, aID)
);
GRANT SELECT, INSERT, UPDATE, DELETE
ON webboard_db.*
TO 'webboard'@'localhost'
IDENTIFIED BY 'board123';
add_answer.php
<?php
//ลบช่องว่างออกจากข้างหน้าและข้างหลังของทุกๆฟีลด์ที่ส่งค่ามา
foreach ($_POST as $key => $value)
$_POST[$key] = trim($value);
if (validate_form($err)) {
process_form();
}
else {
echo '<font color="red"><b>เกิดข้อผิดพลาด</b><br>';
echo $err . "</font><br>";
echo '<input type="button" value="กลับไปแก้ไข" onclick="history.back();">';
}
//ฟังก์ชั่นที่ใช้ตรวจสอบฟอร์ม
function validate_form(&$err) {
//กำหนดฟีลด์บังคับ (ฟีลด์ที่ห้ามปล่อยว่าง)
$required = array("name" => "ชื่อของคุณ",
"detail" => "คำตอบ/ความคิดเห็น");
$err = "";
//วนลูปตรวจสอบฟีลด์บังคับทุกฟีลด์
foreach ($required as $field => $label) {
if ($_POST[$field] == "")
$err .= "<li>คุณไม่ได้ป้อน<b>$label</b></li>";
}
//ส่งคืนค่าออกไปจากฟังก์ชั่น
if ($err)
return FALSE; //กรณีมีข้อผิดพลาดในฟอร์ม
else
return TRUE; //กรณีไม่มีข้อผิดพลาดในฟอร์ม
}
//ฟังก์ชั่นที่ใช้ประมวลผลฟอร์ม (เก็บคำตอบลงฐานข้อมูล)
function process_form() {
$cn = mysqli_connect("localhost", "webboard", "board123");
mysqli_select_db($cn, "webboard_db");
//เก็บหมายเลขกระทู้ไว้ในตัวแปร $q_id
$q_id = $_POST["question_id"];
//หาจำนวนคำตอบของกระทู้ที่ระบุหมายเลขมา
$sql = "SELECT qAnswerCount FROM questions WHERE qID={$q_id}";
$result = mysqli_query($cn, $sql);
$row = mysqli_fetch_array($result);
//กำหนดหมายเลขของคำตอบที่กำลังจะบันทึกลงฐานข้อมูล โดยให้เป็นค่าถัดจากจำนวนคำตอบที่มีอยู่ในขณะนั้น
$next_answer_id = $row["qAnswerCount"] + 1;
/* ใส่ backslash ข้างหน้าตัวอักษรที่อาจทำให้คำสั่ง SQL มีปัญหาเมื่อนำค่าเหล่านี้ไปแทนลงในคำสั่ง (แต่ถ้าในไฟล์ php.ini มีการกำหนด magic_quotes_gpc = On ไว้ ก็ไม่ต้องเรียกใช้ฟังก์ชั่น addslashes เอง เพราะว่า PHP จะเรียกฟังก์ชั่นนี้ให้โดยอัตโนมัติอยู่แล้วสำหรับค่าที่ส่งมาทาง GET, POST และ COOKIE) */
$detail = addslashes($_POST["detail"]);
$name = addslashes($_POST["name"]);
//หาวัน/เวลาปัจจุบัน โดยจัดรูปแบบตามที่ MySQL กำหนด
$now = date("Y-m-d H:i:s");
$ip = $_SERVER["REMOTE_ADDR"];
//เก็บคำตอบลงฐานข้อมูล
$sql = "INSERT INTO answers (aQuestionID, aID, aDetail, aDate, aName, aIPAddress) VALUES ({$q_id}, $next_answer_id, '$detail', '$now', '$name', '$ip')";
$result = mysqli_query($cn, $sql);
if ($result) {
//ปรับปรุงค่าของฟีลด์ qAnswerCount ในเทเบิล questions
$sql = "UPDATE questions SET qAnswerCount=qAnswerCount+1 ";
$sql .= "WHERE qID={$q_id}";
$result = mysqli_query($cn, $sql);
echo "ส่งคำตอบเข้าสู่เว็บบอร์ดเรียบร้อยแล้ว<br>";
echo "<a href=\"show_question.php?id={$q_id}\">คลิกที่นี่</a>";
echo "เพื่อกลับไปยังกระทู้<br>";
echo "<hr><a href=\"list_questions.php\">หน้าหลักของเว็บบอร์ด</a>";
}
else {
echo "ส่งคำตอบเข้าสู่เว็บบอร์ดไม่สำเร็จ เนื่องจากเกิดข้อผิดพลาดบางอย่าง<br>";
}
mysqli_close($cn);
}
?>
add_question.php
<?php
if (isset($_POST["send"])) {
//ลบช่องว่างออกจากข้างหน้าและข้างหลังของทุกๆฟีลด์ที่ส่งค่ามา
foreach ($_POST as $key => $value)
$_POST[$key] = trim($value);
if (validate_form($err)) {
process_form();
}
else {
echo '<font color="red"><b>เกิดข้อผิดพลาด</b><br>';
echo $err . "</font><br>";
echo '<input type="button" value="กลับไปแก้ไข" onclick="history.back();">';
}
}
else {
show_form();
}
//ฟังก์ชั่นที่ใช้ตรวจสอบฟอร์ม
function validate_form(&$err) {
//กำหนดฟีลด์บังคับ (ฟีลด์ที่ห้ามปล่อยว่าง)
$required = array("name" => "ชื่อของคุณ",
"topic" => "หัวข้อกระทู้",
"detail" => "รายละเอียดของกระทู้");
$err = "";
//วนลูปตรวจสอบฟีลด์บังคับทุกฟีลด์
foreach ($required as $field => $label) {
if ($_POST[$field] == "")
$err .= "<li>คุณไม่ได้ป้อน<b>$label</b></li>";
}
//ส่งคืนค่าออกไปจากฟังก์ชั่น
if ($err)
return FALSE; //กรณีมีข้อผิดพลาดในฟอร์ม
else
return TRUE; //กรณีไม่มีข้อผิดพลาดในฟอร์ม
}
//ฟังก์ชั่นที่ใช้แสดงฟอร์มสำหรับตั้งกระทู้ใหม่
function show_form() {
echo <<<HTMLBLOCK
<h3>ตั้งกระทู้ใหม่</h3>
<form method="POST" action="{$_SERVER['PHP_SELF']}">
ชื่อของคุณ: <input type="text" name="name" size="20" maxlength="50"><br>
หัวข้อ: <input type="text" name="topic" size="40" maxlength="255"><br>
รายละเอียด: <br>
<textarea cols="50" rows="5" name="detail"></textarea><br>
<input type="submit" name="send" value="ส่งกระทู้เข้าเว็บบอร์ด">
</form>
<hr><a href=list_questions.php>หน้าหลักของเว็บบอร์ด</a>
HTMLBLOCK;
}
//ฟังก์ชั่นที่ใช้ประมวลผลฟอร์ม (เก็บกระทู้ใหม่ลงฐานข้อมูล)
function process_form() {
$cn = mysqli_connect("localhost", "webboard", "board123");
mysqli_select_db($cn, "webboard_db");
/* ใส่ backslash ข้างหน้าตัวอักษรที่อาจทำให้คำสั่ง SQL มีปัญหาเมื่อนำค่าเหล่านี้ไปแทนลงในคำสั่ง (แต่ถ้าในไฟล์ php.ini มีการกำหนด magic_quotes_gpc = On ไว้ ก็ไม่ต้องเรียกใช้ฟังก์ชั่น addslashes เอง เพราะว่า PHP จะเรียกฟังก์ชั่นนี้ให้โดยอัตโนมัติอยู่แล้วสำหรับค่าที่ส่งมาทาง GET, POST และ COOKIE) */
$topic = addslashes($_POST["topic"]);
$detail = addslashes($_POST["detail"]);
$name = addslashes($_POST["name"]);
//หาวัน/เวลาปัจจุบัน โดยจัดรูปแบบตามที่ MySQL กำหนด
$now = date("Y-m-d H:i:s");
$ip = $_SERVER["REMOTE_ADDR"];
//เก็บกระทู้ลงฐานข้อมูล
$sql = "INSERT INTO questions (qTopic, qDetail, qDate, qName, qIPAddress, qAnswerCount) VALUES ('$topic', '$detail', '$now', '$name', '$ip', 0)";
$result = mysqli_query($cn, $sql);
if ($result) {
/* ฟังก์ชั่น mysqli_insert_id จะให้ค่าของฟีลด์ที่เป็น auto-increment หลังจากรันคำสั่ง SQL ล่าสุด */
$id = mysqli_insert_id($cn);
echo "ส่งกระทู้เข้าสู่เว็บบอร์ดเรียบร้อยแล้ว<br>";
echo "หมายเลขกระทู้ของคุณคือ {$id}<br>";
echo "<a href=\"show_question.php?id={$id}\">คลิกที่นี่</a>";
echo "เพื่อแสดงกระทู้ของคุณ<br>";
echo "<hr><a href=\"list_questions.php\">หน้าหลักของเว็บบอร์ด</a>";
}
else {
echo "ส่งกระทู้เข้าสู่เว็บบอร์ดไม่สำเร็จ เนื่องจากเกิดข้อผิดพลาดบางอย่าง<br>";
}
mysqli_close($cn);
}
?>
functions.php
<?php
//ฟังก์ชั่นที่ใช้แปลงค่า Timestamp ไปเป็นสตริงวัน/เวลาภาษาไทย
function format_thai_date($timestamp) {
setlocale(LC_TIME, "tha"); //กำหนด locale settings เป็นไทย
//สร้างสตริงวัน/เวลาภาษาไทยจากค่า Timestamp (ยังขาดเลขปี พ.ศ.)
$thai_date = strftime("%d %b พ.ศ. %H:%M:%S", $timestamp);
//ถ้าเลขวันที่มี 0 นำหน้า ให้ลบ 0 ทิ้ง (ฟังก์ชั่น strftime แสดงเลขวันที่ 2 หลักเสมอ)
if ($thai_date[0] == "0") {
$thai_date = substr($thai_date, 1);
}
//แทนที่คำว่า "พ.ศ." ในตัวแปร $thai_date ด้วยเลขปี พ.ศ. (เฉพาะ 2 ตัวท้าย)
$thai_date = str_replace("พ.ศ.", substr((date("Y", $timestamp) + 543), -2), $thai_date);
return $thai_date;
}
?>
list_questions.php
<h3>เว็บบอร์ด</h3>
<hr><a href="add_question.php">ตั้งกระทู้ใหม่</a><hr>
<?php
//รวมโค้ดในเพจ functions.php เข้ามา
include("functions.php");
//เชื่อมต่อกับ MySQL Server โดยล็อกอินเข้าไปในชื่อ webboard
$cn = mysqli_connect("localhost", "webboard", "board123");
//ขอใช้ฐานข้อมูลชื่อ webboard_db
mysqli_select_db($cn, "webboard_db");
//ดึงข้อมูลมาทุกกระทู้ โดยเรียงลำดับตามหมายเลขกระทู้จากมากไปหาน้อย
$sql = "SELECT * FROM questions ORDER BY qID DESC";
$result = mysqli_query($cn, $sql);
//วนลูปเพื่อแสดงกระทู้ทั้งหมดออกมา 1 กระทู้ต่อ 1 บรรทัด
while ($row = mysqli_fetch_array($result)) {
$id = htmlspecialchars($row["qID"]);
$topic = htmlspecialchars($row["qTopic"]);
$name = htmlspecialchars($row["qName"]);
$num_answer = $row["qAnswerCount"];
//แปลงสตริงวัน/เวลาที่ได้จากฐานข้อมูลไปเป็นค่า Timestamp
$datetime = strtotime($row["qDate"]);
//แปลงค่า Timestamp ไปเป็นสตริงวัน/เวลาภาษาไทย
$thai_date = format_thai_date($datetime);
/* แสดงหัวข้อกระทู้เป็นไฮเปอร์ลิงค์ เมื่อคลิกจะเรียกไปยังเพจ show_question.php พร้อมทั้งส่งหมายเลขกระทู้ไปให้ด้วย (โดยระบุ Query String ต่อท้าย) */
echo <<<HTMLBLOCK
<b>{$id}</b>
<a href="show_question.php?id={$id}" target="_blank">{$topic}</a>
{$name} ({$num_answer}) [ {$thai_date} ]<br>
HTMLBLOCK;
}
//ปิดการเชื่อมต่อกับ MySQL Server
mysqli_close($cn);
?>
show_question.php
<?php
/* การเรียกใช้เพจนี้จะต้องส่งตัวแปรชื่อ id ผ่านมาทาง Query String เพื่อระบุหมายเลขของกระทู้ที่ต้องการให้แสดงออกมา */
//รวมโค้ดในเพจ functions.php เข้ามา
include("functions.php");
$cn = mysqli_connect("localhost", "webboard", "board123");
mysqli_select_db($cn, "webboard_db");
//ดึงข้อมูลของกระทู้ที่ระบุหมายเลขมา
$q_id = $_GET["id"];
$sql = "SELECT * FROM questions WHERE qID={$q_id}";
$result = mysqli_query($cn, $sql);
/* ถ้าไม่มีเรคอร์ดใดๆเลยในผลลัพธ์ ให้จบการทำงานของเพจนี้ทันที ซึ่งปกติไม่ควรเกิดเหตุการณ์นี้หากลิงค์มาจากเพจ list_questions.php อย่างถูกต้อง ยกเว้นว่ากระทู้เพิ่งถูกลบไปพอดี */
if (mysqli_num_rows($result) == 0) {
echo "ไม่มีข้อมูลของกระทู้หมายเลข {$q_id}<br>";
mysqli_close($cn);
exit;
}
//อ่านผลลัพธ์มา 1 เรคอร์ด (ไม่มีทางที่ผลลัพธ์จะมีมากกว่า 1 เรคอร์ดแน่นอน)
$row = mysqli_fetch_array($result);
/* อ่านค่าของฟีลด์ต่างๆมาเก็บลงตัวแปร โดยมีการใช้ฟังก์ชั่น htmlspecialchars แปลงตัวอักษรที่มีความหมายพิเศษในภาษา HTML เช่น < > ไปเป็น HTML Entity ก่อน เพื่อให้แสดงออกมาในเพจได้อย่างถูกต้อง และยังใช้ฟังก์ชั่น nl2br กับค่าของฟีลด์ที่เก็บรายละเอียดคำถาม เพื่อให้ขึ้นบรรทัดใหม่ตามที่ผู้ใช้พิมพ์เข้ามา */
$topic = htmlspecialchars($row["qTopic"]);
$detail = nl2br(htmlspecialchars($row["qDetail"]));
$name = htmlspecialchars($row["qName"]);
$ip = $row["qIPAddress"];
/* ตรงจุดนี้ถ้าต้องการกรองคำหยาบ, ทำลิงค์ให้กับข้อความที่มีรูปแบบเป็นไฮเปอร์ลิงค์ หรือทำการประมวลผลใดๆกับข้อความของกระทู้ก็ตาม ให้นำตัวแปร $detail ไปจัดการก่อนที่จะแสดงผลออกมา */
//แปลงสตริงวัน/เวลาที่ได้จากฐานข้อมูลไปเป็นค่า Timestamp
$datetime = strtotime($row["qDate"]);
//แปลงค่า Timestamp ไปเป็นสตริงวัน/เวลาภาษาไทย
$thai_date = format_thai_date($datetime);
//แสดงกระทู้ออกมา
echo <<<HTMLBLOCK
<table width="100%" border="1" cellspacing="0" cellpadding="5" bgcolor="#FFCC99">
<tr><td><h3>{$topic}</h3>{$detail}<hr>
จากคุณ: {$name} [ $thai_date ] <font color="gray">[ IP: $ip ]</font></td></tr>
</table>
HTMLBLOCK;
//ดึงคำตอบทั้งหมดของกระทู้ที่ระบุหมายเลขมา
$sql = "SELECT * FROM answers WHERE aQuestionID={$q_id} ORDER BY aID";
$result = mysqli_query($cn, $sql);
//วนลูปแสดงคำตอบทั้งหมดของกระทู้
while ($row = mysqli_fetch_array($result)) {
$a_id = $row["aID"];
$detail = nl2br(htmlspecialchars($row["aDetail"]));
$name = htmlspecialchars($row["aName"]);
$ip = $row["aIPAddress"];
/* ตรงจุดนี้ถ้าต้องการกรองคำหยาบ, ทำลิงค์ให้กับข้อความที่มีรูปแบบเป็นไฮเปอร์ลิงค์ หรือทำการประมวลผลใดๆกับข้อความของคำตอบก็ตาม ให้นำตัวแปร $detail ไปจัดการก่อนที่จะแสดงผลออกมา */
//แปลงสตริงวัน/เวลาที่ได้จากฐานข้อมูลไปเป็นค่า Timestamp
$datetime = strtotime($row["aDate"]);
//แปลงค่า Timestamp ไปเป็นสตริงวัน/เวลาภาษาไทย
$thai_date = format_thai_date($datetime);
//แสดงคำตอบออกมา
echo <<<HTMLBLOCK
<br>
<table width="100%" border="1" cellspacing="0" cellpadding="5" bgcolor="#FFFFCC">
<tr><td><b>ความคิดเห็นที่ {$a_id}</b><br><br>{$detail}<hr>
จากคุณ: {$name} [ $thai_date ] <font color="gray">[ IP: $ip ]</font></td></tr>
</table>
HTMLBLOCK;
}
mysqli_close($cn);
?>
Tag : - - - -
Date :
2009-12-09 00:06:56
By :
อย่างรู้ครับ
View :
2775
Reply :
6
ไม่มีใครตอบเลย
Date :
2009-12-09 20:30:49
By :
tonsay123
ขอบคุณครับ
Date :
2009-12-09 21:45:02
By :
tonsay123
แล้วถ้าเราจะเอา รูปภาพด้วยต้องแก้โค้ตตรงไหนบ้าง
Date :
2010-11-16 13:38:58
By :
อิม
โค้ดนี้เราจะตอบเว็บบอร์ดไม่ได้หรอ
Date :
2011-07-16 16:11:57
By :
บิว
Load balance : Server 01