|
|
|
สอบถามการใช้ foreach เช็คข้อมูลซ้ำกับ database เพื่อป้องกันไม่ให้ INSERT ข้อมูลที่ซ้ำกัน |
|
|
|
|
|
|
|
ตอนนี้ ถ้าข้อมูลที่ได้รับไม่ซ้ำก็ผ่านฉลุย แต่ติดตรงที่ ถ้ามีข้อมูลที่ซ้ำกันเข้ามา ระบบยังยอมให้ INSERT ลงตารางอยู่ครับ
Code (PHP)
$array[] = array(
'username' => $_POST['course_username'],
'fullname' => $_POST['course_fullname'],
'title' => $_POST['course_title'],
'sec' => $_POST['course_sec'],
'datebook' => $date->format('Y-m-d'),
'start_time' => $course_start_time,
'end_time' => $course_end_time,
'note_other' => $_POST['course_note_other'],
'note1' => $_POST['course_note1'],
'note2' => ($_POST['course_point']).($_POST['course_note2']).($_POST['course_point']),
'icon1' => $_POST['course_icon1'],
'icon2' => $_POST['course_icon2'],
'icon3' => $_POST['course_icon3'],
'icon4' => $_POST['course_icon4'],
'icon5' => $_POST['course_icon5'],
'icon_note2' => $_POST['course_icon_note2'],
);
}
//ตรวจข้อมูลซ้ำ
foreach($array as $course){
$check = "SELECT * FROM schedule WHERE (course_start_time = '".$course[start_time]."' OR course_end_time = '".$course[end_time]."') AND course_date = '".$course[datebook]."'";
$result = mysqli_query($mysqli, $check) or die ("Error in query: $check " . mysqli_error());
$num = mysqli_num_rows($result);
}
if($num > 0)
{
echo "<script>";
echo "alert('ห้องไม่ว่างครับ !\\nกรุณาติดต่อผู้จอง เพื่อขอปรับเปลี่ยนตาราง');";
echo "window.history.back();";
echo "</script>";
}else{
//เพิ่มเข้าไปในฐานข้อมูล
foreach($array as $course){
$sql = "INSERT INTO schedule (course_username, course_fullname, course_title, course_sec, course_date, course_start_time, course_end_time, course_note_other, course_note1, course_note2, course_icon1, course_icon2, course_icon3, course_icon4, course_icon5, course_icon_note2)
VALUES('".$course[username]."', '".$course[fullname]."', '".$course[title]."', '".$course[sec]."', '".$course[datebook]."', '".$course[start_time]."', '".$course[end_time]."', '".$course[note_other]."', '".$course[note1]."', '".$course[note2]."', '".$course[icon1]."', '".$course[icon2]."', '".$course[icon3]."', '".$course[icon4]."', '".$course[icon5]."', '".$course[icon_note2]."')";
$result = mysqli_query($mysqli, $sql) or die ("Error in query: $sql " . mysqli_error());
}
mysqli_close($mysqli);
if($result){
$str1 = $_POST["course_title"];
$str2 = $_POST["course_sec"];
$str3 = $_POST["course_note1"];
$str4 = $_POST["course_note_other"];
echo "<script language=\"JavaScript\">";
echo "alert('จองห้องเรียนสำเร็จ : $str1 $str2 $str3 $str4');";
echo "parent.window.location.reload()";
echo "</script>";
}
}
?>
Tag : PHP, MySQL
|
|
|
|
|
|
Date :
2020-03-27 01:19:46 |
By :
pisaranon |
View :
3490 |
Reply :
9 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ต้องทราบก่อนว่า ฟิลด์ไหนที่กำหนดว่าห้ามซ้ำ
เราก็เขียนเงื่อนไข WHERE เพื่อค้นหาค่าซ้ำ
หากไม่ซ้ำจึงทำการรันคำสั่ง INSERT ครับ
|
|
|
|
|
Date :
2020-03-27 09:32:38 |
By :
{Cyberman} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
แนะนำให้ ทำ unique key
แล้วตรวจสอบ error result query จากการ insert
|
|
|
|
|
Date :
2020-03-27 09:45:34 |
By :
Chaidhanan |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
echo $num เพื่อดูค่าที่คิวรีออกมาว่าตรงตามต้องการหรือไม่
$array[] ไม่จำเป็นต้อง foreach เป็นตัวแปรใหม่เข้าจากมันโดยตรงเลยก็ได้
การตรวจสอบค่าซ้ำควรมี id หรือฟิลด์หนึ่งที่ข้อมูลไม่ซ้ำกัน
และการคิวรี่ตรวจสอบการใช้ AND หรือ OR ให้ถูกต้องเช็คจากค่า $num
|
|
|
|
|
Date :
2020-03-27 17:32:01 |
By :
PhrayaDev |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
คือแบบนี้ครับ
ในกรณีรับข้อมูล array มาชุดเดียวสามารถป้องกันการบันทึกซ้ำได้
แต่ในกรณีรับข้อมูล array มามากว่า 1 ชุด ซึ่งบางชุดซ้ำและไม่ซ้ำ ไม่สามารถป้องการการบันทึกได้
เลยอยากให้ ถ้าการรับชุดข้อมูลใดๆในแต่ละรอบ รับมาไม่ซ้ำกับข้อมูลที่มีทั้งหมดจึงจะยอมให้ INSERT แต่ถ้าซ้ำแม้แต่ชุดเดียวไม่ยอมให้ INSERT
|
ประวัติการแก้ไข 2020-03-29 19:27:05 2020-03-29 19:29:31
|
|
|
|
Date :
2020-03-29 19:23:41 |
By :
pisaranon |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
วิธีที่ถูกต้อง
จำเป็นต้องใช้ innodb ในการเก็บข้อมูล เพื่อใช้เครื่องมือ commit / rollback
MyIsam ไม่รองรับการทำ commit / rollback
https://www.php.net/manual/en/mysqli.rollback.php
|
|
|
|
|
Date :
2020-03-29 20:39:10 |
By :
Chaidhanan |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
html:
Code (PHP)
<input type="text" name="test[]">
php: ตรวจสอบก่อน Insert หรือ Update
$test =$_POST['test'];
if (count(array_unique( array_diff_assoc($test, array_unique($test)))) > 0)
{
//statement
}
หรือ
javascript:
Code (JavaScript)
function duplicate(arr){var sorted_arr=arr.sort();var results=[];for(var i=0;i<arr.length-1;i++){if(sorted_arr[i+1]==sorted_arr[i]){results.push(sorted_arr[i]);}}return results.length;}
ถ้าจะให้ Cool ก็ form validate ก่อน
|
|
|
|
|
Date :
2020-03-30 10:56:41 |
By :
fossil31 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ขอบคุณทุกท่านครับ ตอนนี้ยังไม่สำเร็จ แต่จะลองเปลี่ยนแนวทางหลายๆรูปแบบดูครับ
|
|
|
|
|
Date :
2020-04-02 10:35:55 |
By :
pisaranon |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ไม่ลองเอาโค้ดมาดูหน่อยเหรอครับ
ว่าปรับแต่งแล้วไม่สำเร็จเป็นอย่างไรบ้างครับ
จะได้ช่วยกันดูต่อ
|
|
|
|
|
Date :
2020-04-02 12:28:27 |
By :
{Cyberman} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ตอนนี้ใช้ array ในการตรวจสอบร่วมด้วยครับ ใช้งานได้ครับ ขอบคุณทุกท่านครับผม
https://www.thaicreate.com/php/forum/135071.html
Code (PHP)
foreach($array as $course){
$check = "SELECT * FROM schedule
WHERE course_start_time = '".$course[start_time]."' AND course_date = '".$course[datebook]."'";
$query = mysqli_query($mysqli, $check);
$num = mysqli_num_rows($query);
if ($num) {
$numArray[] = '1';
} else {
$numArray[] = '0';
}
}
if (in_array("1", $numArray))
{
echo "<script>";
echo "alert('ไม่ว่างครับ');";
echo "window.history.back();";
echo "</script>";
}
|
ประวัติการแก้ไข 2020-04-02 15:43:29
|
|
|
|
Date :
2020-04-02 15:37:13 |
By :
pisaranon |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Load balance : Server 02
|