สวัสดีครับ
ฉบับนี้รบกวนขอสอบถามเกี่ยวกับการ search หาข้อมูลในฐานข้อมูล Mysql
แนวคิด
ในฐานข้อมูล mysql ของผมนั้น ได้แบ่ง field ในการเก็บข้อมูลบริษัทผลิตอาหารออกเป็น 7 field ได้แก่ ชื่อบริษัท(1 field) , อีเมลล์(1 field), ประเทศ(1 field), กลุ่มอาหาร(3 field) และข่าวสารอาหาร(1 field)
ซึ่งเมื่อลูกค้าเข้ามาในหน้า search หาข้อมูลลูกค้า ลูกค้าสามารถ search หาได้ 2 วิธี ได้แก่
วิธีที่ 1 search หาตามชื่อบริษัท โดยลูกค้า click ไปที่ list box ซึ่งจะโชว์ตัวอักษรให้เลือก เมื่อ click search แล้ว ข้อมูลจะโชว์รายชื่อบริษัทออกมาโดยเรียงตามตัวอักษร
วิธีที่ 2 search หาตามกลุ่มอาหาร และประเทศ โดยลูกค้า click ไปที่ list box ซึ่งจะโชว์กลุ่มอาหาร ลูกค้า click เลือก และต้องมา click เลือกชื่อประเทศในอีก list box ด้วย จากนั้น click search แล้วข้อมูลชื่อบริษัทจะโชว์ออกมา
วิธีการเขียน
ผมได้เขียนหน้าโปรแกรมออกเป็น 3 หน้าได้แก่
หน้าที่ 1 เป็นหน้า search ที่ลูกค้าเปิดเข้ามาเลือก โดยเขียนเป็น html ดัง code ด้านล่างนี้
<html>
<title>List menu</title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-874">
<body>
<b>Alphabetical search</b>
<form name="form2" method="post" action="list.php">
<select name="alphabet">
<option value="select" selected></option>
<option value="a">a</option>
<option value="b">b</option>
<option value="c">c</option></select>
<input type="submit" value="search">
<hr>
<b>Product group search</b><br>
<form name="form3" method="post" action="list1.php">
<select name="product">
<option value="select" selected></option>
<option value="agri">Agricultural Products</option>
<option value="alkohol">Alkoholic Beverages</option>
<option value="bakery">Bakery Products</option></select>
<select name="country">
<option value="select" selected></option>
<option value="
<option value="
<option value="
<input type="submit" value="search">
</body>
</html>
โดยเมื่อลูกค้า click search by alphabet จะ action ไปที่ list.php
และเมื่อลูกค้า click search by product group และcountry จะ action ไปที่ list1.php
คำถาม
- หน้าที่เป็น html นี้ ที่ลูกค้าจะต้องเข้ามาเพื่อ search หาข้อมูลนี้ และวิธีการ search มี 2 แบบ ได้แก่ แบบ alphabet และแบบ product group นี้ ผมได้เขียนให้ action ไป 2 file.php ได้แก่
- click search by alphabet ส่งไป list.php
- click search by product group and country ส่งไป list1.php
นั้น ถูกต้องเหมือนกับที่เขียนกันทั่วไปหรือไม่ครับ
- ผมได้เขียน program list.php เพื่อมารองรับลูกค้า search by alphabet ตามข้างล่างนี้
<?
$link=mysql_connect("localhost","root","");
if(!$link)
{
print("Error");
}
else
{
mysql_select_db("test",$link);
$sql="select * from test order by company asc";
$res=mysql_query($sql,$link);
print("<table border=1>");
print("<tr><td>No.</td><td>Company</td><td>Email</td><td>Country</td><td>Product group</td><td>Food News</td></tr>");
while($row=mysql_fetch_row($res))
{
print("<tr>");
print("<td></td><td>$row[0]</td><td>$row[1]</td><td>$row[2]</td><td>$row[3]<br>$row[4]<br>$row[5]<br></td><td>$row[6]</td></tr>");
}
print("<table>");
}
?>
สอบถามว่าผมจะเขียนอย่างไรให้ข้อมูลเรียงตาม alphabet ตามที่ลูกค้าเลือกครับ?
- สำหรับ program list1.php นั้น ยังคิดไม่ออกเลยว่าจะเขียนอย่างไร เพราะลูกค้าต้อง click เลือกกลุ่มอาหารและประเทศพร้อมกัน ข้อมูลถึงจะโชว์ออกมา ช่วยแนะนำด้วยครับ
ด้วยความเคารพ
อนันต์
ส่วนการค้นหา 2 field นี้อยู่ที่ว่าจะต้องเลือกทั้งสองค่าหรือไม่ครับ ถ้าจะบังคับให้มีการเลือกทั้งสองค่า ก็สามารถใช้ javascript ในการตรวจสอบได้ครับ จากนั้นก็เอาข้อมูลไปค้นหาในแต่ละ field ที่ต้องการครับ
Thu 14 Sep 2006 16:33:33
ถูกต้องแล้วครับ เอาข้อมูลมาเรียงจาก A-Z ที่ผมเขียน a,b,c นั้นเป็นตัวอย่างครับ ไม่อยากเขียน A-Z เพราะจะยาวเกินไป พอเลือกที่ a แล้ว click search ข้อมูลที่ขึ้นด้วยตัวอักษร a ก็จะโชว์ออกมา ถ้าลูกค้าเลือกที่ m แล้ว click search ข้อมูลที่ขึ้นต้นด้วยตัวอักษร m ก็จะโชว์ออกมา แบบนี้จะเขียนโดยใช้ PHP เขียนเพื่อดึงข้อมูลจากฐานข้อมูลออกมานั้นจะเขียนอย่างไรครับ
ส่วนการค้นหานั้นบังคับให้เลือกทั้ง 2 field ครับ คือต้อง click เลือกกลุ่มอาหารและ click เลือกว่าอยู่ในประเทศอะไรด้วย สำหรับภาษา javascrip นั้น ผมยังไม่ได้ศึกษาเลยครับ เป็นไปได้ไหมครับที่เขียนเป็น PHP ช่วยกรุณาแนะนำว่าเขียนอย่างไรด้วยครับ
ขอบคุณมากครับ
อนันต์
การจะรู้ได้อย่างไรว่าในข้อมูลทั้งหมดนั้นมีตัวอักษรใดนำหน้าบ้างก็
SELECT DISTINCT SUBSTR(UPPER(field_name), 1) AS charactor FROM table_name ORDER BY charactor
จะได้ list ของตัวอักษรนำหน้าทั้งหมดที่มีอยู่ใน database เท่านั้นครับ
ส่วนเมื่อมีการเลือกที่ตัวอักษรใดๆแล้วให้มีการเอาเฉพาะที่มีอักษรนำหน้าตามที่เลือกเท่านั้นก็
SELECT field_name FROM table_name WHERE UPPER(SUBSTR(field_name, 1)) = 'A'
จากโค๊ดจะได้ข้อมูลที่มีตัวอักษร a และ A นำหน้าเท่านั้น
ส่วนที่จะให้ user เลือกทั้ง 2 ช่องก่อนที่จะค้นหานั้น ที่แนะนำ javascript เพื่อที่จะได้ไม่ต้องทำการ load หน้าเอกสารใหม่ มีวิธีคือ
<script language="javascript" type="text/javascript">
function validate(obj){
if(obj.product.value == "0"){
alert("Please select product");
obj.product.focus();
return false;
}else if(obj.country.value == "0"){
alert("Please select country");
obj.country.focus();
return false;
}
return true;
}
</script>
<b>Product group search</b><br>
<form name="form3" method="post" action="list1.php" onsubmit="return validate(this);">
<select name="product">
<option value="0">Please select</option>
<option value="agri">Agricultural Products</option>
<option value="alkohol">Alkoholic Beverages</option>
<option value="bakery">Bakery Products</option>
</select>
<select name="country">
<option value="0">Please select</option>
<option value="
<option value="
<option value="
</select>
<input type="submit" value="search"></form>
การทำงานของระบบคือ เมื่อมีการกด submit form จะมีการเรียกใช้งาน javascript function ชื่อ validate โดยส่ง object form ไปเป็น parameter เพื่อใช้ในการอ้างอิง โดยในฟังก์ชั่นจะตรวจสอบว่า product นั้นมี่ค่าเริ่มต้นหรือไม่ (ค่าเริ่มต้นมีค่าเป็น 0) ถ้าใช้จะแสดง popup alert ขึ้นมา ถ้าไม่ใช่ก็จะตรวจในส่วนของ country และกระทำเช่นเดียวกัน โดยในแต่ละส่วนที่มีการ return false นั้นหมายถึงว่า ไม่ให้ form ส่งค่าไปยังเอกสารปลายทาง ถ้าเป็น return true ก็จะส่งค่าต่างๆไปยังเอกสารปลายทาง
Thu 14 Sep 2006 17:46:42
ขอขอบคุณครับ ผมขอแบ่งข้อมูลที่คุณตอบกลับมาออกเป็น 3 ส่วน ได้แก่
ส่วนที่ 1 การจะรู้ได้อย่างไรว่าในข้อมูลทั้งหมดนั้นมีตัวอักษรใดนำหน้าบ้าง
ส่วนที่ 2 เมื่อมีการเลือกที่ตัวอักษรใดๆแล้วให้มีการเอาเฉพาะที่มีอักษรนำหน้าตามที่เลือกเท่านั้น
ส่วนที่ 3 ให้ user เลือกทั้ง 2 ช่องก่อนที่จะค้นหา
สำหรับส่วนที่ 1 นั้น ผมได้ทดสอบโดยการเขียน code ดังนี้
<?
$link=mysql_connect("localhost","root","");
if(!$link)
{
print("Error");
}
else
{
mysql_select_db("test",$link);
$sql="select distinct substr(upper(company),1)as charactor from test order by charactor";
$res=mysql_query($sql,$link);
print("<table border=1>");
print("<tr><td>No.</td><td>Company</td><td>Email</td><td>Country</td><td>Product group</td><td>Food News</td></tr>");
while($row=mysql_fetch_row($res))
{
print("<tr>");
print("<td></td><td>$row[0]</td><td>$row[1]</td><td>$row[2]</td><td>$row[3]<br>$row[4]<br>$row[5]<br></td><td>$row[6]</td></tr>");
}
print("<table>");
}
?>
ปรากฏว่าพอรันแล้วขึ้น error ดังนี้ครับ
Warning: mysql_fetch_row(): supplied argument is not a valid MySQL result resource in c:\appserv\www\test\list.php on line 14
|
No. |
Company |
|
Country |
Product group |
Food News |
ขอคำแนะนำด้วยครับ
อนันต์
ขอโทษด้วยครับ parameter ไม่ครบ และชื่อฟังก์ชั่นผิดครับ
Thu 14 Sep 2006 22:15:04
ขอบคุณมากสำหรับ Java Script ที่แนะนำมา ผลที่ได้เนียนกว่าการเขียนด้วย PHP เพราะต้องแสดงผลอีกหน้าอย่างที่คุณแนะนำ
ส่วนของ Java Script นี้ ผมคิดว่าจะนำไปประยุกต์ในเรื่องของการสมัครสมาชิกได้อีก
จาก code program ที่คุณแนะนำมาในเรื่อง การจะรู้ได้อย่างไรว่าในข้อมูลทั้งหมดนั้นมีตัวอักษรใดนำหน้าบ้าง
SELECT DISTINCT SUBSTRING(UCASE(field_name), 1, 1) AS charactor FROM table_name ORDER BY character
ซึ่งใช้ได้ผลครับ
สำหรับในส่วนที่ 2 เมื่อ user เลือกตัวอักษรใน list box แล้ว ให้มีการแสดงผลเฉพาะข้อมูลที่มีตัวอักษรนำหน้านั้น
ยกตัวอย่างเช่น
- Click เลือกอักษร a ข้อมูลจะแสดง
Alternate Co.,Ltd.
Austume Co.,Ltd.
All Seasons Co.,Ltd.
เป็นต้น
Code program ที่คุณแนะนำมาได้แก่
SELECT field_name FROM table_name WHERE UPPER(SUBSTR(field_name, 1)) = 'A'
Select company from test where upper(substr(company,1))= A
ปรากฎว่าเกิด error Warning: mysql_fetch_row(): supplied argument is not a valid MySQL result resource in c:\appserv\www\test\list.php on line 14
จึงรบกวนช่วยแนะนำอีกครั้งด้วยครับ พร้อมทั้งขอถามเพิ่มเติมด้วยครับว่า ตัวอักษรที่เลือกมี A,B,C Z นั้น จะต้องเปลี่ยนจาก A เป็น character หรือเปล่าครับ
ขอคำแนะนำด้วยครับ
อนันต์
Thu 14 Sep 2006 23:48:52
ขอขอบคุณอีกครั้งครับ แต่พอเขียนแล้ว ข้อมูลไม่โชว์ออกมาครับ
<?
$link=mysql_connect("localhost","root","");
if(!$link)
{
print("Error");
}
else
{
mysql_select_db("test",$link);
$sql="select * from test where ucase(substring(company,1))='a'";
$res=mysql_query($sql,$link);
print("<table border=1>");
print("<tr><td>No.</td><td>Company</td><td>Email</td><td>Country</td><td>Product group</td><td>Food News</td></tr>");
while($row=mysql_fetch_row($res))
{
print("<tr>");
print("<td></td><td>$row[0]</td><td>$row[1]</td><td>$row[2]</td><td>$row[3]<br>$row[4]<br>$row[5]<br></td><td>$row[6]</td></tr>");
}
print("<table>");
}
?>
ข้อมูลจะโชว์เพียงแค่นี้ครับ
No.
Company
Email
Country
Product group
Food News
ไม่โชว์ชื่อบริษัทที่มีอักษร a ออกมาครับ ทั้งๆที่ใน database มีชื่อบริษัท a อยู่ด้วยดังนี้
ขอคำแนะนำด้วยครับ
อนันต์
ตรงนี้โค๊ดของผมคือ ให้ทำการ เอาอักษรตัวแรก ใน field ชื่อ field_name ออกมาแล้วทำให้เป็นตัวพิมพ์ใหญ่ครับ เพื่อที่จะได้เอาทั้งอักษรที่เป็น a และ A ออกมาแสดงครับ
$sql="select * from test where ucase(substring(company,1))='a'";
โค๊ดของคุณเป็นคำสั่งเดียวกัน แต่คุณบอกว่าให้เอาตัวอีกษรตัวแรกของ field ชื่อ company แล้วทำให้เป็นตัวพิมพ์ใหญ่ แล้วดูว่ามี record ใดบ้างมีค่าเป็น a ซึ่งแน่นอนครับว่าไม่มี ที่ถูกควรเป็น
$sql="select * from test where ucase(substring(company,1))='A'";
Fri 15 Sep 2006 09:27:00
ขอบคุณครับ แต่เปลี่ยนตัวอักษรจาก 'a' มาเป็น 'A' ยังคงแสดงผมเหมือนเดิม คือไม่มีข้อมูลปรากฎครับ
| No. | Company | Country | Product group | Food News |
ที่ถูกควรเป็น
SELECT company FROM test WHERE UCASE(SUBSTRING(company, 1, 1)) = 'A'
Fri 15 Sep 2006 20:17:39
ขอขอบคุณครับ
ใช้ได้แล้วครับ ถ้า user click เลือก อักษร A ก็จะแสดงบริษัทที่มีอักษร A นำหน้า
ผมขอถามเพิ่มเติมครับ กรณีตัวอักษรที่ผมให้ user เลือกมีจาก A-Z ใน List menu ผมก็พยายามเปลี่ยนจาก 'A' เป็น 'chatactor' หรือ '$charactor' ก็ปรากฎว่ายังใช้ไม่ได้ครับ
คงต้องรบกวนขอคำแนะนำอีกครั้งด้วยครับ
อนันต์
SELECT company FROM test WHERE UCASE(SUBSTRING(company, 1, 1)) = 'A'
สามารถใส่ตัวแปรลงไปได้ครับเช่น
$charator = 'B';
$sql = "SELECT company FROM test WHERE UCASE(SUBSTRING(company, 1, 1)) = '".$charactor."'"
ที่มีปัญหาว่าใช้ไม่ได้หมายถึงอย่างไรครับ
Fri 15 Sep 2006 21:45:39
ขอขอบคุณครับ
ผมใช้ code program ตามที่คุณเขียนมา
<?
$link=mysql_connect("localhost","root","");
if(!$link)
{
print("Error");
}
else
{
mysql_select_db("test",$link);
$sql = "SELECT company FROM test WHERE UCASE(SUBSTRING(company, 1, 1)) = '".$charactor."'";
$res=mysql_query($sql,$link);
print("<table border=1>");
print("<tr><td>No.</td><td>Company</td><td>Email</td><td>Country</td><td>Product group</td><td>Food News</td></tr>");
while($row=mysql_fetch_row($res))
{
print("<tr>");
print("<td></td><td>$row[0]</td><td>$row[1]</td><td>$row[2]</td><td>$row[3]<br>$row[4]<br>$row[5]<br></td><td>$row[6]</td></tr>");
}
print("<table>");
}
?>
ปรากฎว่าเกิด error ดังนี้ครับ
Parse error: parse error, unexpected T_VARIABLE in c:\appserv\www\test\list_2.php on line 11
แล้วผมก็ได้เปลี่ยน code program ของคุณจาก
$sql = "SELECT company FROM test WHERE UCASE(SUBSTRING(company, 1, 1)) = '".$charactor."'"
เป็น
$sql = "SELECT company FROM test WHERE UCASE(SUBSTRING(company, 1, 1)) = '.$charactor.'";
ปรากฎว่าขึ้นเพียงแค่
| No. | Company | Country | Product group | Food News |
แต่ข้อมูลบริษัทไม่ออกมาเลยครับ
อนันต์
โค๊ดถูกแล้วนะครับ ถ้าตามที่ copy มา
ส่วนที่ว่าเปลี่ยนแล้วไม่มีข้อมูลออกมานั้นก็ไม่แปลกครับเนื่องจาก
$sql = "SELECT company FROM test WHERE UCASE(SUBSTRING(company, 1, 1)) = '.$charactor.'";
จะเป็นคำสั่ง
SELECT company FROM test WHERE UCASE(SUBSTRING(company, 1, 1)) = '..'
ซึ่งไม่น่าจะมีข้อมูลดังกล่าวครับ
อีกอย่างตัวแปร $chractor นั้นยังไม่มีการ Assign ค่าใดๆให้มันในบรรทัดใดๆเลยครับ จึงไม่ได้ข้อมูลตามที่ต้องการครับ ถ้าเป็นการส่งค่ามาจากหน้าใดๆให้รับค่าโดยใช้ Predefine Global Variables ครับ อันได้แก่
$_REQUEST คือค่าที่ส่งผ่าน Get และ Post
$_GET คือค่าที่ส่งผ่านวิธี Get
$_POST คือค่าที่ส่งผ่านวิธี Post
$_SESSION คือตัวแปร Session
$_COOKIE คือตัวแปร Cookie
$_SERVER คือค่าตัวแปรที่ส่งมายัง HTTP Server
$_ENV คือค่าตัวแปรสภาพแวดล้อมของระบบ
$_FILES คือค่าตัวแปรที่ Post ไฟล์
ซึ่งตัวแปรเปล่านี้เป็น associative array ซึ่งการใช้งานเช่น
$_GET["id"], $_POST["name"] ฯลฯ
Fri 15 Sep 2006 22:33:18
ขอบคุณครับสำหรับคำแนะนำ ตามความเข้าใจของผมนั้น ผมได้เขียน file list.html ดัง code program ด้านล่างนี้
List.html
<b>Alphabetical search</b>
<form name="form2" method="post" action="list_2.php">
<select name="alphabet">
<option value="select" selected></option>
<option value="A">A</option>
<option value="B">B</option>
<option value="C">C</option>
<option value="D">C</option>
<option value="E">C</option>
<option value="F">C</option>
<option value="G">C</option>
<option value="H">C</option>
<option value="I">C</option>
<option value="J ">C</option>
<option value="K">C</option>
<option value="L">C</option>
<option value="M">C</option>
<option value="N">C</option>
<option value="O">C</option>
<option value="P">C</option>
<option value="Q">C</option>
<option value="R">C</option>
<option value="S ">C</option>
<option value="T ">C</option>
<option value="U">C</option>
<option value="V">C</option>
<option value="W">C</option>
<option value="X">C</option>
<option value="Y">C</option>
<option value="Z">C</option>
</select>
<input type="submit" value="search">
</form>
___________________________________________________
เมื่อ user click เลือกอักษร A หรือ B หรือ C หรืออื่นๆ แล้ว จะมีการส่งค่า Post action ไปยัง file list_2.php ซึ่งได้แก่ code program ด้านล่างนี้
List_2.php
<?
$link=mysql_connect("localhost","root","");
if(!$link)
{
print("Error");
}
else
{
mysql_select_db("test",$link);
$sql = "SELECT company FROM test WHERE UCASE(SUBSTRING(company, 1, 1)) = '..'";
$res=mysql_query($sql,$link);
print("<table border=1>");
print("<tr><td>No.</td><td>Company</td><td>Email</td><td>Country</td><td>Product group</td><td>Food News</td></tr>");
while($row=mysql_fetch_row($res))
{
print("<tr>");
print("<td></td><td>$row[0]</td><td>$row[1]</td><td>$row[2]</td><td>$row[3]<br>$row[4]<br>$row[5]<br></td><td>$row[6]</td></tr>");
}
print("<table>");
}
?>
ผมไม่ทราบว่าจะเขียน code program เพื่อที่จะ assign ค่าอย่างไร คงต้องรบกวนอีกครั้งด้วยครับ
ด้วยความเคารพ
อนันต์
$link=mysql_connect("localhost","root","");
if(!$link)
{
print("Error");
}
else
{
mysql_select_db("test",$link);
$sql = "SELECT company FROM test WHERE UCASE(SUBSTRING(company, 1, 1)) = '".$_POST["alphabet"]."'";
$res=mysql_query($sql,$link);
print("<table border=1>");
print("<tr><td>No.</td><td>Company</td><td>Email</td><td>Country</td><td>Product group</td><td>Food News</td></tr>");
while($row=mysql_fetch_row($res))
{
print("<tr>");
print("<td></td><td>$row[0]</td><td>$row[1]</td><td>$row[2]</td><td>$row[3]<br>$row[4]<br>$row[5]<br></td><td>$row[6]</td></tr>");
}
print("<table>");
}
?>
ในหนังสือเท่าที่ผมเห็นทั้งหมด จะไม่มีการพูดถึง register_globals ซึ่งเป็นเรื่องสำคัญมาก อ่านเพิ่มได้ที่ http://forum.modoeye.com/module26-22.html
ซึ่งทาง php team นั้นได้เห็นความสำคัญและตั้งค่า register_globals เป็น off เพื่อความปลอดภัย แต่ในหนังสือยังสอนการเขียนแบบ register_globals เป็น on ทำให้ในการใช้งานจริงจะไม่สามารถทำงานได้ครับ
Sat 16 Sep 2006 04:09:48
ขอขอบคุณมาก แก้ไขได้แล้วครับ
ส่วนเรื่องของ register_globals นั้นผมเข้าไปอ่านแล้ว มีข้อสงสัยหลายอย่างเกี่ยวกับศัพท์เทคนิค คงจะต้องสอบถามอีกครั้งเมื่อเข้าไปเขียนการ register
ขอบคุณครับ
อนันต์

















