รบกวนพี่ๆครับ ช่วงนี้ถามบ่อยมากครับ เรื่อง ระบบ search mysql ครับ
ลองใช้ CONCAT() ครับ เช่น
Code (PHP)
SELECT * FROM xxx WHERE CONCAT(field1,' ',field2) LIKE '%$key%'
Date :
2021-06-08 20:21:59
By :
arm8957
กรณีคอน ตอบความคิดเห็นที่ : 1 เขียนโดย : arm8957 เมื่อวันที่ 2021-06-08 20:21:59
รายละเอียดของการตอบ ::
ใช้ concat ได้ครับ แต่ถ้าจะ ไขว้ กับตัว check box มันไม่ยอมออกครับ
แบบว่า เลือกcheckbox ด้วย กรอก keyeord ด้วยครับ เพราะว่าข้อมูลที่จะลง db เตรียมใว้มีประมานหลายพัน record เลยครับ ก็เลยคิดว่า ในกลุ่มเงื่อนไขการค้นหา ถ้าระบุ สโคปการค้นให้แคบลงข้อมูลจะได้ออกมาไม่กี่แถวที่ตรงๆกันเท่านั้นครับ
Code (PHP)
$sql = "select * from tb_criminal1 WHERE concat(criminal_fname,',',criminal_lname,',',group_arrest,',',id_card) LIKE '%$strKeyword%' OR LIKE '%$strgroup%' limit {$start} , {$perpage} ";
ประวัติการแก้ไข 2021-06-08 23:17:06
Date :
2021-06-08 22:47:33
By :
gmgo
ตอบความคิดเห็นที่ : 5 เขียนโดย : arm8957 เมื่อวันที่ 2021-06-09 11:35:59
รายละเอียดของการตอบ ::
มัน Error ตัวแปรครับ
Notice: Undefined index: txtKeyword in /Applications/XAMPP/xamppfiles/htdocs/eds-csd/views/operation1-detail.php on line 28
Notice: Undefined index: group1 in /Applications/XAMPP/xamppfiles/htdocs/eds-csd/views/operation1-detail.php on line 29
Notice: Undefined index: group2 in /Applications/XAMPP/xamppfiles/htdocs/eds-csd/views/operation1-detail.php on line 30
Notice: Undefined index: group3 in /Applications/XAMPP/xamppfiles/htdocs/eds-csd/views/operation1-detail.php on line 31
Notice: Undefined index: group4 in /Applications/XAMPP/xamppfiles/htdocs/eds-csd/views/operation1-detail.php on line 32
Notice: Undefined index: group5 in /Applications/XAMPP/xamppfiles/htdocs/eds-csd/views/operation1-detail.php on line 33
Warning: mysqli_fetch_array() expects parameter 1 to be mysqli_result, bool given in /Applications/XAMPP/xamppfiles/htdocs/eds-csd/views/operation1-detail.php on line 46
Code (PHP)
$strKeyword = ($_GET['txtKeyword'] != '') ? $_GET['txtKeyword'] : NULL;
$checklist1 = ($_GET['group1'] != '') ? $_GET['group1'] : NULL;
$checklist2 = ($_GET['group2'] != '') ? $_GET['group2'] : NULL;
$checklist3 = ($_GET['group3'] != '') ? $_GET['group3'] : NULL;
$checklist4 = ($_GET['group4'] != '') ? $_GET['group4'] : NULL;
$checklist5 = ($_GET['group5'] != '') ? $_GET['group5'] : NULL;
//$date_start = ($_GET['date_start'] != '') ? $_GET['date_start'] : NULL;
//$date_end = ($_GET['date_end'] != '') ? $_GET['date_end'] : NULL;
$sql = " SELECT * FROM criminal1 WHERE 1 ";
$sql .= ! empty($strKeyword) ? " AND CONCAT(criminal_fname,',',criminal_lname,',',group_arrest,',',id_card) LIKE '%$strKeyword%' " : "";
$sql .= ! empty($checklist1) ? " AND group_arrest LIKE '%$checklist1%' " : "";
$sql .= ! empty($checklist2) ? " AND group_arrest LIKE '%$checklist2%' " : "";
$sql .= ! empty($checklist3) ? " AND group_arrest LIKE '%$checklist3%' " : "";
$sql .= ! empty($checklist4) ? " AND group_arrest LIKE '%$checklist4%' " : "";
$sql .= ! empty($checklist5) ? " AND group_arrest LIKE '%$checklist5%' " : "";
//$sql .= ( ! empty($date_start) && ! empty($date_end) ) ? " AND field_date BETWEEN '$date_start' AND '$date_end' " : "";
echo $query = mysqli_query($con, $sql);
while($result=mysqli_fetch_array($query,MYSQLI_ASSOC)){
echo $sql;
}
ผมเขียนถูกไหมครับ 5555 น่าจะมั่วที่ผม
Date :
2021-06-09 12:54:30
By :
gmgo
Code (PHP)
echo $var;// error เพราะไม่ได้ประกาศใช้ตัวแปร
$var = array();
echo $var['index'];// error เพราะไม่ได้กำหนด index, key
if (isset($var['index'])) {
echo $var['index'];// ไม่ error เพราะตรวจก่อนแล้ว
}
echo (isset($var['index']) && $var['index'] !== '' ? $var['index'] : '');
// ถ้าเขียนแบบยาวจะเป็น
if (isset($var['index']) && $var['index'] !== '') {
echo $var['index'];
} else {
echo '';
}
// -----------------------------
// ข้อควรระวัง
// isset ตรวจแม้กระทั่ง null
$var = array(
'index' => null,
);
var_dump(isset($var['index']));// จะได้ false ทั้งที่มันมีตัวแปรและมี array index นี้อยู่แท้ๆ
// วิธีแก้ถ้าต้องตรวจว่ามันมี key นี้จริงๆแม้จะ null ก็ตาม
var_dump(array_key_exists('index', $var));// จะได้ true.
ประวัติการแก้ไข 2021-06-09 19:58:04 2021-06-09 19:59:57
Date :
2021-06-09 19:56:44
By :
mr.v
ตอบความคิดเห็นที่ : 7 เขียนโดย : mr.v เมื่อวันที่ 2021-06-09 19:56:44
รายละเอียดของการตอบ ::
พยามตามโค้ดและไล่ถึงความสัมพันธ์ ที่พี่เขียนให้ดู แต่ก็ไม่เข้าใจ5555 เวลไม่ถึงจริงๆครับ
ทีแรก ผมคิดว่า ถ้าหาก ตัว Checkbox เก็บเป็น Array น่าจะส่งค่าไป mysql ได้ โดยน่าจะมี syntax อะไรสักอย่างมาเชื่อม
เพราะรอง echo ออก มาดู ค่าที่ได้เป็น a1,a2 แต่พอใส่ตัวแปรใน mysql มันน่าไจะไม่รู้จัก ก็เลยตัด , ได้เป็น a1a2 ปรากฎว่าค้นหาไม่เจอ
แต่ถ้า เป็น a1 หรือ a2 ค่าเดียวกับหาเจอ ทั้งๆที่มันควร จะวิ่งไปเทียบ a1a2 มีคำไหนที่เหมือนกัน ผมเข้าใจผิด ใช่ไหมครับ
และจึงมานั่งคิดเล่นๆว่า ถ้าใส่แค่ค่าเดียวแล้วมันค้นเจอ แสดงว่ามันทำการค้นแค่ครั้งเดียว แต่ถ้าเราส่งค่าตัวแปรที่เป็น Array ให้มัน ในตัวคำสั่ง mysql ก็ต้องอยู่ ภายใต้ loop เช่น $A,$B,$C เท่ากับว่ามันต้องวิ่งเทียบทีละคำสั่ง พอครบละค่อย return ผลลัพธืกลับมา เป็น
$A1=xxx
$A2=xxx
$A3=xxx
ถ้าผมเข้าใจถูก มันต้องเขียน loop ยังไงครับ และหากเข้าใจผิด รบกวนพี่อธิบายให้หน่อยครับ
ถ้าไม่ได้จริงๆ ผมคงต้องกลับไปดู เรื่อง Switch case และ ทำที่ละเคส แบบประมาณว่า
7ตัวเลือก ก็เอามันมาจับคู่กัน ซึ่ง ผมก็ไม่รู้ว่า มันจะได้กี่คำสั่ง กว่าจะไขว้กันครบ ก็เลยนึกถึง เว็บบิต ว่าเค้าเขียนยังไง มี ตั้ง 20 กว่า Checkbox
มันจำเป็นต้องทำ เพราะว่า ต้องเอาผลลัพธ์ตัวนี้ไปทำเป็นกราฟสถิติ โดยผู้ใช้จะเรียกดู เคสไหนกับเคสไหนก็ได้ และช่วงเวลาไหนก็ได้ ซึ่งยากขึ้นไปอีก คิดแล้วท้อจริงๆครับ กับความเป็นมือใหม่ แต่ได้งานใหญ่มาทำคนเดียว อุส่าทิ้งไอทีตั้งแต่จบหนีมาสอบราชการ สุดท้ายได้กลับมาทำอีก5555 รบกวนด้วยนะครับ
Date :
2021-06-09 23:36:59
By :
gmgo
ที่บอกไปแก้ปัญหา Notice: Undefined index อย่างเดียว
ถ้าไม่เข้าใจให้สร้างไฟล์ใหม่ขึ้นมาเพื่อทดลอง อย่าไปเขียนเลยในโปรเจ็ค เพราะมันจะไม่รู้เรื่องถ้าไม่เข้าใจ
ทดลองก่อนจนเข้าใจตามที่บอก จนอ๋อนั่นแหละ ถึงค่อยเอาไปเขียนจริง
สร้างไฟล์เปล่าๆมาเขียน echo $var; รันดูมันว่ายังไงใช่อย่างที่บอกมั้ย
ลบทิ้งแล้วเขียน
$var = array();
echo $var['index'];
ดูว่ามันว่าไงใช่อย่างที่บอกมั้ย
แก้บรรทัด echo เอาอันนี้ใส่
if (isset($var['index'])) {
echo $var['index'];// ไม่ error เพราะตรวจก่อนแล้ว
}
ดูมันเป็นยังไง
ไล่ลองไปเรื่อยๆจนกว่าจะเข้าใจมัน
แล้วก็อ่าน
https://www.php.net/manual/en/function.isset.php
https://www.php.net/manual/en/function.array-key-exists.php
เอกสารจากทาง php เอง
แล้วจะใช้แบบไหนก็เลือกเอา
Date :
2021-06-10 00:43:43
By :
mr.v
ทำได้แล้วครับขอบคุณครับทุกท่าน
ประยุกต์ เอารูปแบบการต่อสตริง มาใช้ ร่วมกับ IF else และใช้ คำสั่ง strpos เช็ค where เอาแล้วค่อยเอาไปต่อ คำสั่ง select*from where xxx....
ใช้ OR และ IN(ผลลัพธ์ array1,ผลลัพธ์ array2,ผลลัพธ์ array3..ผลลัพธ์ arrayN)Code
[head]Code (PHP)
<th>
<tr> <!---->
<td><input type="checkbox" name="group[]" id="group1" class="form-check-input" value="g1" > </input></td>
<td>กลุ่ม1 ฐานความผิดเกี่ยวกับชีวิต ร่างกาย ฯ </td>
<td> </td>
<td><input type="checkbox" name="group[]" id="group4" class="form-check-input" value="g4"> </input></td>
<td>กลุ่ม4 ฐานความผิดที่รัฐเป็นผู้เสียหาย</td>
<td> </td>
<td rowspan="3">วันที่</td>
<td rowspan="3"><input type="date" name="start_date" id="start_date" class="form-control" > </input></td>
<td rowspan="3">ถึง</td>
<td rowspan="3">วันที่</td>
<td rowspan="3"><input type="date" name="end_date" id="end_date" class="form-control"> </input></td>
</tr>
<tr>
<td><input type="checkbox" name="group[]" id="group2" class="form-check-input" value="g2" > </input></td>
<td>กลุ่ม2 ฐานความผิดเกี่ยวกับทรัพย์</td>
<td> </td>
<td><input type="checkbox" name="group[]" id="group5" class="form-check-input" value="g5"> </input></td>
<td>กลุ่ม5 ฐานความผิดอื่นๆ</td>
</tr>
<tr>
<td><input type="checkbox" name="group[]" id="group3" class="form-check-input" value="g3"> </input></td>
<td>กลุ่ม3 ฐานความผิดพิเศษ</td>
<td> </td>
</tr>
<tr align="center">
<td colspan="11">
</br> <div class="input-group" style="width: 750px" align="center">
<input type="text" name="txtKeyword" class="form-control form-control-lg" value="" placeholder="ใส่คำที่ต้องการค้นหา" >
<button class="btn-lg btn-primary" type="submit"> ค้นหา
</button>
</div>
</td>
</tr>
</th>
</table>
อันนี้เป็นรูปแบบการเก็บค่าตัวแปร ที่ คุณ mr.v แนะนำ ผมลองใช้ดูจนเข้าใจรูปแบบมันละ ก็เลยจัดให้เป็นแบบนี้
Code (PHP)
if (isset($_POST['txtKeyword']) && $_POST['txtKeyword'] !== '') {
$strKeyword=$_POST['txtKeyword'];
}else{
echo '';
}
if (isset($_POST['group']) && $_POST['group'] !== '') {
$strgroup=implode("','", $_POST['group']);
}else{
echo '';
}
(PHP)[/head]
$sql="select * from tb_criminal1";
if(!empty($strKeyword)) { //ถ้าตัวแปร strKeyword ไม่ว่าง คือมีการกรอกข้อมูลเข้ามาผ่านทาง textbox ค้นหา
$sql.=" where criminal_fname like '%$strKeyword%' "; //การต่อประโยคเงื่อนไข ใช้เครื่องหมาย .= จะเพิ่มคำเข้าไปในตัวแปรได้
}
// กรณีมีการเลือก checkbox คู่กับการกรอกช่องค้นหา เพื่อค้นหาให้แคบลง เพิ่มคำสั่งด้านล่าง
if(!empty($strgroup)) { // ถ้าค้นหาค่า strgroup มาด้วย ตัวนี้คือ checkboxที่รับค่าเป็น array จากฟรอม
$pos = strpos($sql, "where"); //ใช้คำสั่ง strpos หาคำว่า where ใน $sql="select * from tb_criminal1";
if ($pos == true) { // ถ้าเจอคำว่า where จริง ให้ทำเงื่อนไขด้านล่าง
$sql.="OR group_arrest IN('$strgroup') "; //ถ้ามีคำว่า where ให้ใส่ OR group_arrest IN('$strgroup')
} else {
$sql.=" where group_arrest IN('$strgroup') "; //ถ้าไม่มีคำว่า where ให้ใช้คำสั่ง where group_arrest IN('$strgroup')ไปต่อ
//คำสั่ง select sql ด้านบน
}
}
ผมเองก็เพิ่งทราบว่า OR group_arrest IN('$strgroup') มันช้แบบนี้ได้หาอยู่นานลองสลับมั่วๆดู
กรณีที่ต้องการ ค้นหาข้มูล ในคอลัมเดียวกัน มากกว่า 1 คีย์เวิด โดย ใช้ OR ไม่ได้ หรือผมเขียนไม่เป็น เลยเห็นจาก stacoverflow .ใช้ IN(1,2,3..) แต่คำสั่งนี้มันก็มีปัญหา ว่ากรณีข้อความ ต้องมี ' ' ปกติ impolde(',',$_POST['']); ค่าจะได้ 1,2,3 วิธีคือ impolde("','",$_POST['']);
-ข้อมูลจะตรงรูปแบบ 'a1','a2' ก็จะใช้ได้ละครับ
ผมไล่ code และอธิบายให้ออกมาในรูปแบบที่ผมเข้าใจ สำหรับผิดพลาดประการใดก็ขออภัยด้วยนะครับ บางทีอาจจะมีหลายท่านกำลังตามหาแบบผมอยู่นะครับ
ตอนนี้จะได้ไปดูส่วน ของ กราฟต่อครับ ขอบคุณครับ
Date :
2021-06-10 14:52:58
By :
gmgo
การใช้ var in ('xx','yy','zz') มันมีข้อจำกัด ว่าสิ่งที่หา กับ ฟีลด์ที่หา ต้องเหมือนกันเป๊ะ
คือ var ต้องเท่ากับ xx หรือ var ต้องเท่ากับ yy หรือ var ต้องเท่ากับ zz
แต่ถ้าจะหา xx อยู่ใน var หรือ yy อยู่ใน var หรือ zz อยู่ใน var
ใช้ แบบนี้ จะครอบคลุมมากกว่า
( fieldname like '%search1%' or fieldname like '%search2%' or fieldname like '%search3%')
หรือหันไปใช้ regular expression
or ( fieldname REGEXP '(search1|search2|search3)' )
Date :
2021-06-10 15:40:19
By :
Chaidhanan
ตอบความคิดเห็นที่ : 11 เขียนโดย : Chaidhanan เมื่อวันที่ 2021-06-10 15:40:19
รายละเอียดของการตอบ ::
( fieldname like '%search1%' or fieldname like '%search2%' or fieldname like '%search3%')
ผมคิดว่ากรณีแบบนี้น่าจะเหมากับ Input ที่ไม่ fix ค่า มากกว่าใช่ไหมครับ
แต่ถ้าเป็นแบบ ตัวแปรที่มีค่าคงที่ เชื่อน checkbox1='g1' แบบนี้น่าจะไม่มีปัญหาครับ เพราะบังคับให้เป็นคำนี้เลย ส่วนใน texboxsearch ก็ยังคงใช้เป็น %var% แต่สุดท้ายแล้ว การค้นหามันก็ยังคงได้แค่ระดับ 1 ยังไม่เท่า search Engine ที่พิมคำผิดแล้วเดาเป็นคำที่ถูกต้องให้ หรือผมอาจจะพัฒนาต่อโดย เอา API ของระบบใหญ่ มาเป็นตัว Query แบบว่า เวลาพิมก็จะเดาข้อมูลขุ้นมาโชว์ให้เลยประมาณนี้ แต่คง phase หน้า
แต่ว่าตอนนี้ติดปัญหานี้แทนครับ แบ่งหน้าไม่ได้
$sql .= "limit {$start} , {$perpage}"; ผมจะเอา limit ไปต่อตรงไหนของ mysql ดีครับ โดยไม่ให้กระทบกับเงื่อนไขด้านล่าง
ผมเข้าใจว่ามันจะอยู่ท้ายสุดของชุดคำสั่ง sql แต่พอลองวางแล้วกลับ error
Code (PHP)
$sql="select * from tb_criminal1";
////
if(!empty($strKeyword)) { //ถ้าตัวแปร productname ไม่ว่าง คือมีการกรอกช่องค้นหาชื่อสินค้ามาด้วย
$sql.=" where concat(criminal_fname,',',criminal_lname,',',group_arrest,',',id_card) like '%$strKeyword%' "; //การต่อประโยคเงื่อนไข ใช้เครื่องหมาย .= จะเพิ่มคำเข้าไปในตัวแปรได้
$sql .= "limit {$start} , {$perpage}";
}
// กรณีระบุค่า price เพื่อหาสินค้าและราคามาทั้งสองอย่าง เพิ่มคำสั่งด้านล่าง
if(!empty($strgroup)) { // ถ้าค้นหาค่า price มาด้วย
$pos = strpos($sql, "where"); //ใช้คำสั่ง strpos หาคำว่า where ในตัวแปร sql
if ($pos == true) { // ถ้าเจอคำว่า where ในตัวแประ $sql
$sql.="OR group_arrest IN('$strgroup')"; //ถ้ามีคำว่า where แล้วในตัวแปร sql ให้ใส่ and ต่อ
} else {
$sql.=" where group_arrest IN('$strgroup') "; //ถ้าไม่มีคำว่า where ให้ใช้ query นี้ต่อ
}
}
if(!empty($type_search)) { // ถ้าค้นหาค่า price มาด้วย
$pos = strpos($sql, "where"); //ใช้คำสั่ง strpos หาคำว่า where ในตัวแปร sql
if ($pos == true) { // ถ้าเจอคำว่า where ในตัวแประ $sql
$sql.=" AND type_arrest IN('$type_search') "; //ถ้ามีคำว่า where แล้วในตัวแปร sql ให้ใส่ and ต่อ
} else {
$sql.=" where type_arrest IN('$type_search') "; //ถ้าไม่มีคำว่า where ให้ใช้ query นี้ต่อ
}
}
Date :
2021-06-10 19:23:37
By :
gmgo
Code (PHP)
$str_select = 'select field1, field2, field3';
$str_from = 'table1, table2';
$str_where = 'field1 = 1';
$str_where .= ($str_where>''? ' and ' : '') . 'field2 = 2';
$sql = $str_select . ' from '.$str_from.' where '.$str_where.' limit xx, yyy';
แยกส่วนแบบนี้จะ dynamic มากกว่า นะครับ
แต่ที่สำคัญกว่านั้น เออเร่อร์ อะไรต้องแสดงมันออกมาด้วย จะได้รู้ว่าควรจะแก้ไขตรงไหน
Date :
2021-06-10 19:51:29
By :
Chaidhanan
ตอบความคิดเห็นที่ : 13 เขียนโดย : Chaidhanan เมื่อวันที่ 2021-06-10 19:51:29
รายละเอียดของการตอบ ::
ถ้าใช้ if มาเช็คจะง่ายกว่าไหมครับ แต่นึดเงื่อนไขไม่ออกครับ
ผลลัพธ์ ครับ select * from tb_criminal1 where concat(criminal_fname,',',criminal_lname,',',group_arrest,',',id_card) like '%สม%' limit 0 , 5 AND type_arrest IN('1') limit 0 , 5
มันมี ลิมตมา2รอบ ผมลองวางดูครับ คิดว่าคงจะผิด รบกวนพี่ดูให้หน่อยครับ ถ้าใช้ if ได้ ผมน่าจะถนัดกว่าครับ
Code (PHP)
เงื่อนไขที่1
if(empty($strKeyword) && empty($strgroup) && empty($type_search)){
$sql="select * from tb_criminal1 limit {$start} , {$perpage}";//กรณีเป็นค่าว่างทั้งหมด
}else{
$sql="select * from tb_criminal1 "; แต่ถ้าใส่ค่ามา หยิบตรงนี้ไปทำ
}
if(!empty($strKeyword)) {
$sql.=" where concat(criminal_fname,',',criminal_lname,',',group_arrest,',',id_card) like '%$strKeyword%' ";
$sql .= "limit {$start} , {$perpage}";/*ใส่แบบนี้error ครับ */
}
if(!empty($strgroup)) {
$pos = strpos($sql, "where");
if ($pos == true) {
$sql.="OR group_arrest IN('$strgroup') limit {$start} , {$perpage}";
} else { //ถ้าไม่มีคำว่า where ให้ใช้ query นี้ต่อ
} $sql.=" where group_arrest IN('$strgroup') limit {$start} , {$perpage}";
}
if(!empty($type_search)) {
$pos = strpos($sql, "where");
if ($pos == true) {
$sql.=" AND type_arrest IN('$type_search') limit {$start} , {$perpage}";
} else {
$sql.=" where type_arrest IN('$type_search') limit {$start} , {$perpage} ";
}
}
ผลลัพธ์ตอน echo $sql ครับ select * from tb_criminal1 where concat(criminal_fname,',',criminal_lname,',',group_arrest,',',id_card) like '%สม%' limit 0 , 5 AND type_arrest IN('1') limit 0 , 5
มันมี ลิมตมา2รอบ ผมลองวางดูครับ คิดว่าคงจะผิด รบกวนพี่ดูให้หน่อยครับ ถ้าใช้ if ได้ ผมน่าจะถนัดกว่าครับ
เวลา มันจะ Error ตอน เราเลือก เงื่อนไข ตัวแปรที่ต่างกัน ครับ
Date :
2021-06-10 20:40:18
By :
gmgo
แล้วจะรีบ ใส่มันทำไมล่ะครับ
ไว้จะคิวรี่ ค่อยใส่ก็ได้ มันไม่หายไปไหนหรอก 5555
Date :
2021-06-10 20:48:20
By :
Chaidhanan
ไม่ Error แล้วครับ 5555 แค่นี้เลย
Code (PHP)
$sql_limit="$sql limit {$start} , {$perpage}";
echo $sql_limit;//ทดสอบดู คำสั่ง
$query = mysqli_query($con, $sql_limit);
ขอบคุณครับผม
Date :
2021-06-10 21:16:01
By :
gmgo
Load balance : Server 01