
มีดังนี้คับ
1.จะค้นหาอะไรก็ได้ที่พิมใน text box
2.จะเลือกอะไรก็ได้ใน list menu
3.ทั้งพิมใน text box และทั้งเลือก ใน list box ก้ได้ จ้นค้นหาข้อมูลได้ทั้งหมด จะทำยังไงดีคับ ผมมืดอีกแล้วคับ ที่ผมทำก้ได้แค่ เงื่อนไขเดียวอ่ะคับ ช่วยผมหน่อยน่ะคับ ขอบคุณล่วงหน้าคับ
select * from ชื่อตาราง where ชื่อฟิลด์='ความต้องการ' and ชื่อฟิลด์='ประเภทสินทรัพย์' and ชื่อฟิลด์='ที่ตั้งสินทรัพย์' and ชื่อฟิลด์='ราคาสินทรัพย์'
ทั้งนี้ก็ขึ้นอยู่กับการออกแบบฐานข้อมูลด้วยครับ
ลองดูนะครับ
เช่น น้อยกว่า 1000000 ตั้งแต่ 1000001-2000000 ประมาณนี้อ่ะคับ
$sql = "SELECT * FROM vis_data where (land_add='$txt' OR id_sub='$type%' OR price='$price' OR detail='$province' OR want='$want')"; แบบนี้เลยอ่ะครับ แต่ก้ยังไม่ได้ผล เราจะมีวิธีแก้ยังไงดีคับ
ลอง นี่ดูครับ
$sql = "SELECT * FROM vis_data where (land_add like '%$txt%' and id_sub like '%$type%' and price like '%$price%' and detai llike '%$province%' and want='$want')";
เครื่องหมาย = จะคืนค่า เมือฟิลด์นั้น มีค่าเท่ากันทั้งฟิลดฺ์
คำสั่ง LIKE สำหรับค้นหาบางส่วนของข้อความ โดยแทนส่วนที่ไม่ทราบด้วย %
ดังนั้นคำสั้งด้านบนมนคงหาไม่เจอ เนื่ิงจากใช้ เครื่องหมายเท่ากับ ทำให้ทุกฟิลด์ต้องกรอกครบทั้งหมด แต่จริงๆ แล้ว การค้นหา เรามักค้นหาเพียง ส่วนหนึ่งส่วนใดของข้อความ มากกว่าทั้งหมด
option radio select ข้อมูลพวกนี้ ตรสจสอบโดยใช้ เท่ากับ
text textera ตรวจสอบโดยใช้ LIKE
จากตัวอย่างรูปด้านบน จะเขียนคำสั่ง sql ได้ ประมาณ
SELECT * FROM land_add LIKE '%$txt%' OR id_sub = '$type'.....
สิ่งที่ควรคำนึงถึงด้วยก็คือการจัดเก็บข้อมูล ว่าจัดเก็บยังไง ยกตัวอย่างเช่น ช่วงราคา เราระบุราคาเป็นตัวเลข ลงในช่องกรอก หรือเรามีตัวเลือก ช่วงราคาให้เขาใช้
สมมุติ เราระบุราคาเป็นตัวเลข 5000 การค้นหาแบบเป็นช่าวง ก็ $price BETWEEN 0 AND 10000 หรือ $price >=0 AND $price <= 10000 ก็ได้
อันหมายถึงช่วงราคาระหว่าง 0 ถึง 10000
แต่เราอาจระบุช่วงเป็นตัวเลขเฉพาะก็ได้ ถ้า การกำหนดตอนกรอกใช้ช่วงเฉพาะเช่นกัน ยกตัวอยาง
ให้ 0-10000 = 0, 10001-50000 = 2, 50001 -100000 = 3
การค้นหาก็จะใช้กับการตรวจสอบกับ 0 1 2 หรือ 3 แทน
งงมะ เอาแค่นี้ก่อน เรื่องมันยาวววววววว........
<select name="price">
<option value="" selected>ราคาสินทรัพย์</option>
<option value="<1000001">ต่ำกว่า 1,000,001</option>
<option value="between 1000001 and 3000000" >1,000,001 - 3,000,000</option>
<option value="between 3000001 and 5000000" >3,000,001 - 5,000,000</option>
<option value="between 5000001 and 7000000" >5,000,001 - 7,000,000</option>
<option value="between 7000001 and 10000000" >7,000,001 - 10,000,000</option>
<option value="between 10000000 and 15000000" >10,000,001 - 15,000,000</option>
<option value=">15000000">มากกว่า 15,000,000</option>
</select>
เวลาเรากด submit น่ะคับ ก็จะได้ค่าที่ส่งไปน่ะคับ เช่น <1000001 หรือไม่ ก้ between 1000001 and 3000000 แล้วเวลาเราจะค้นหาข้อมูลยังเหรอครับ ในฐานข้อมูลเก็บเป็น VACHAR อ่ะคับ จะ query ขึ้นมายังไงถึงจะได้ตามเงื่อนไขราคาอ่ะคับ
เอาส่วนที่ผมทำเลยน่ะคับ ติดที่ช่วงราคายังทำไม่ได้อ่ะคับ ผมมั่วได้ใจมั้ยล่ะคับ ยังไงก้ขอความช่วยเหลือจากผู้รู้หน่อยล่ะกันน่ะครับ
<?
$want=$_POST["want"];
$type=$_POST["type"];
$txt=$_POST["txt"];
$province=$_POST["province"];
$price=$_POST["price"];
include 'md.php';
print "ผลการค้นหา $want   $txt $type $province $price";
mysql_query('SET NAMES UTF8');
if($txt!="")
{
$sql="SELECT * FROM `vis_data` WHERE (`land_add` LIKE '%$txt%' OR `detail` LIKE '%$txt%' OR `price` LIKE '%$txt%' OR `want` LIKE'%$txt%')";
}
if($want!="")
{
$sql="SELECT * FROM `vis_data` WHERE (`land_add` LIKE '%$want%' OR `detail` LIKE '%$want%' OR `want` LIKE'%$want%')";
}
if($type!="")
{
$sql="SELECT * FROM `vis_data` WHERE (`land_add` LIKE '%$type%' OR `detail` LIKE '%$type%' OR `name_sub` LIKE'%$type%')";
}
if($province!="")
{
$sql="SELECT * FROM `vis_data` WHERE (`land_add` LIKE '%$province%' OR `detail` LIKE '%$province%')";
}
if($price!="")
{
$price=" AND price $price";
//$sql="SELECT * FROM `vis_data` WHERE `price`='$price'";
}
เป็นต้น
1. select มาทั้งหมด โดยไม่ส่นใจ price แล้วเอามา if ทีหลัง ถ้า อยู่ในช่วงให้แสดง (ถึกกันเห็นๆๆ ไม่แนะนำครับ)
2. ทำแบบ คุณ gOragod ว่า คือเปลี่ยน ค่า price ใน db ให้เป็น ตัวเลข 1 2 3 .. แทน ช่วงนะครับ (วิธีนี้จะง่ายแต่จำกัดที่เราต้องเปลี่ยนข้อมูลใน db)
3. ทำ view ครับ
ชอบวิธีไหน ลองดู ครับ
if($price!="")
{
$sql="SELECT * FROM `vis_data` WHERE price $price";
}
ลองใช้แบบนี้ดู แต่ยังไม่ได้ทดสอบนะไม่รู้ run ผ่านป่าว<select name="price">
<option value="" selected>ราคาสินทรัพย์</option>
<option value="1000001_">ต่ำกว่า 1,000,001</option>
<option value="1000001_3000000" >1,000,001 - 3,000,000</option>
<option value="3000001_5000000" >3,000,001 - 5,000,000</option>
<option value="5000001_7000000" >5,000,001 - 7,000,000</option>
<option value="7000001_10000000" >7,000,001 - 10,000,000</option>
<option value="10000000_15000000" >10,000,001 - 15,000,000</option>
<option value="_15000000">มากกว่า 15,000,000</option>
</select>
.............
<?php
//...
$price=$_POST["price"];
//...
if ($price != '')
{
list($min,$max) = explode('_',$price);
if ($max==='') $sql .= ' AND price < '.($min*1);
else if ($min==='') $sql .= ' AND price > '.($max*1);
else $sql .= ' AND price BETWEEN '.(min*1).' AND '.(max*1);
}
อีกอย่างหนึ่งทีสำคัญ วิธีข้างต้นไม่ปลอดภัยครับ อาจโดน hack ได้ง่ายมาก เราไม่ควรส่งข้อความที่เป็น query ไปกับ ข้อมูลครับ ควรส่งเป็นตัวแปรเพื่อเทียบเคียง
<select name="price">
<option value="" selected>ราคาสินทรัพย์</option>
<option value="0">ต่ำกว่า 1,000,001</option>
<option value="1" >1,000,001 - 3,000,000</option>
<option value="2" >3,000,001 - 5,000,000</option>
<option value="3" >5,000,001 - 7,000,000</option>
<option value="4" >7,000,001 - 10,000,000</option>
<option value="5" >10,000,001 - 15,000,000</option>
<option value="6">มากกว่า 15,000,000</option>
</select>
เวลา submit ค่าที่ส่งมาจะเป็น price=0 ถีง price=6
แล้วค่อยมาอ่านค่าเอาจาก array ข้างล่างอีกที
<?php
$price = array( '< 1000001', 'BETWEEN 100001 AND 300000'.......);
$sql = $price[$_POST[price]];
?>








ในกรณีที่ผมต้องการให้ค่าที่ไม่ว่างออกมาแสดงผมต้องเขียนยังไงครับ
SELECT * FROM tbName WHERE Field is Not Null
ถูกไหมครับ
ปกติผมจะเลี่ยงไม่ใช้ NULL ครับ ปัญหาเยอะ