GORAGOD.com

freelance, web developer, web designer, hosting, domain name

ใครก็ได้ช่วยผมที เกี่ยวกับการค้นหาแบบหลายขั้นตอนและหลายเงื่อนไขค

มีไฟล์ตัวอย่างการค้นหาน่ะครับ ผมจนปัญญาจริงๆคับ
มีดังนี้คับ
1.จะค้นหาอะไรก็ได้ที่พิมใน text box
2.จะเลือกอะไรก็ได้ใน list menu
3.ทั้งพิมใน text box และทั้งเลือก ใน list box ก้ได้ จ้นค้นหาข้อมูลได้ทั้งหมด จะทำยังไงดีคับ ผมมืดอีกแล้วคับ ที่ผมทำก้ได้แค่ เงื่อนไขเดียวอ่ะคับ ช่วยผมหน่อยน่ะคับ ขอบคุณล่วงหน้าคับ
25 มี.ค. 2552 16 2,975

ถ้าต้องการเพิ่มเงื่อนไข ก็ใส่เพิ่ม ใน where ไงครับ เช่น

select * from ชื่อตาราง where ชื่อฟิลด์='ความต้องการ' and ชื่อฟิลด์='ประเภทสินทรัพย์' and ชื่อฟิลด์='ที่ตั้งสินทรัพย์' and ชื่อฟิลด์='ราคาสินทรัพย์'

ทั้งนี้ก็ขึ้นอยู่กับการออกแบบฐานข้อมูลด้วยครับ

ลองดูนะครับ

#1

แต่ว่าผม ใช้ OR น่ะครับ เพราะว่าจะต้องเลือกรายการใดรายการหนึ่งก้ได้อ่ะครับ และอีกส่วนก้คือว่า จะต้องค่าระหว่าง ของ ราคาด้วยอ่ะคับ
เช่น น้อยกว่า 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')"; แบบนี้เลยอ่ะครับ แต่ก้ยังไม่ได้ผล เราจะมีวิธีแก้ยังไงดีคับ
#2

ลอง นี่ดูครับ

$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')";

#3

ขอบใจนะ เริ่มเป็นแล้ว เอาคำสั้ง sql มาให้ดู คนตอบจะได้ตอบง่ายขึ้น ดีกว่าถามกว้างๆ ให้เขียนโค้ดให้

เครื่องหมาย = จะคืนค่า เมือฟิลด์นั้น มีค่าเท่ากันทั้งฟิลดฺ์
คำสั่ง 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 แทน

งงมะ เอาแค่นี้ก่อน เรื่องมันยาวววววววว........
#4

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

<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 ขึ้นมายังไงถึงจะได้ตามเงื่อนไขราคาอ่ะคับ
#5

เอาส่วนที่ผมทำเลยน่ะคับ ติดที่ช่วงราคายังทำไม่ได้อ่ะคับ ผมมั่วได้ใจมั้ยล่ะคับ ยังไงก้ขอความช่วยเหลือจากผู้รู้หน่อยล่ะกันน่ะครับ
<?

$want=$_POST["want"];
$type=$_POST["type"];
$txt=$_POST["txt"];
$province=$_POST["province"];
$price=$_POST["price"];

 include 'md.php';
  print  "ผลการค้นหา $want &nbsp $txt &nbsp; $type &nbsp; $province &nbsp; $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'";
  }
 เป็นต้น

#6

มันมีหลายวิธีครับ
1.  select มาทั้งหมด โดยไม่ส่นใจ price แล้วเอามา if ทีหลัง ถ้า อยู่ในช่วงให้แสดง (ถึกกันเห็นๆๆ ไม่แนะนำครับ)
2. ทำแบบ คุณ gOragod  ว่า คือเปลี่ยน ค่า price ใน db ให้เป็น ตัวเลข 1 2 3 .. แทน ช่วงนะครับ (วิธีนี้จะง่ายแต่จำกัดที่เราต้องเปลี่ยนข้อมูลใน db)
3. ทำ view ครับ

ชอบวิธีไหน ลองดู ครับ
#7

มั่วได้แร้ะคับ ท่อนสุดท้าย
if($price!="")
  {
  $sql="SELECT * FROM `vis_data` WHERE price $price";
  }
#8

ลองใช้แบบนี้ดู แต่ยังไม่ได้ทดสอบนะไม่รู้ 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);

}
#9

ในกรณีของจำนวนเงิน ควรเก็บข้อมูลเป็นตัวเลขนะครับ ถ้าเก็บเป็น VARCHAR จะใช้คำนวณไม่ได้ อาจผิดพลาดได้ครับ ให้ระวัง

อีกอย่างหนึ่งทีสำคัญ วิธีข้างต้นไม่ปลอดภัยครับ อาจโดน 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]];
?>
#10

สังเกตุมั้ย ว่าครั้งแรกที่ถาม ไม่ได้รับคำตอบ แต่พอใส่ข้อมูลมาพอสมควร ก็สามารถหาคำตอบได้
#11

ขอบคุณมากครับ ทุกคนเลยน่ะครับ เดี๋ยวพรุ่งนี้ผมจะลองแก้ สคริป ใหม่น่ะคับ ไม่ผิดหวังเลยจริงๆ อบอุ่นครับ คนไทยมีน้ำใจ เดี๋ยวไม่ได้ยังผมก้ต้องมารบกวนอีกน่ะครับ
#12

ผมกำลังต้องการพอดีเลยครับ ขอบคุณครับ
#13

สอบถามเพิ่มเติมครับ

ในกรณีที่ผมต้องการให้ค่าที่ไม่ว่างออกมาแสดงผมต้องเขียนยังไงครับ

SELECT * FROM tbName  WHERE Field is Not Null

ถูกไหมครับ
#14

field = ''

ปกติผมจะเลี่ยงไม่ใช้ NULL ครับ ปัญหาเยอะ
#15

ขอบคุณครับ ได้แล้วครับ ผมก็ลืมคิดไปเลยครับ
#16
ความคิดเห็น
ไฟล์อัปโหลด ชนิด jpg, jpeg ขนาดไฟล์ไม่เกิน 2M
^