ใครก็ได้ช่วยผมที เกี่ยวกับการค้นหาแบบหลายขั้นตอนและหลายเงื่อนไขค
มีไฟล์ตัวอย่างการค้นหาน่ะครับ ผมจนปัญญาจริงๆคับ
มีดังนี้คับ
1.จะค้นหาอะไรก็ได้ที่พิมใน text box
2.จะเลือกอะไรก็ได้ใน list menu
3.ทั้งพิมใน text box และทั้งเลือก ใน list box ก้ได้ จ้นค้นหาข้อมูลได้ทั้งหมด จะทำยังไงดีคับ ผมมืดอีกแล้วคับ ที่ผมทำก้ได้แค่ เงื่อนไขเดียวอ่ะคับ ช่วยผมหน่อยน่ะคับ ขอบคุณล่วงหน้าคับ
มีดังนี้คับ
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";
}
<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 ครับ ปัญหาเยอะ