Check tồn tại trước khi insert vào CSDL

Chào mọi người, e đang có chút vấn đề khi xử lý dữ liệu vào CSDL
Input đầu vào dạng text area mỗi dòng 1 giá trị là link
Sau đó e cho các giá trị vào mảng

$textarea=$_POST['linkurl'];
$array = explode("\n", $textarea);

Sau đó e dùng foreach
để insert dữ liệu vào database có kèm check link đã tồn tại hay chưa như này

foreach ($array as $value) {
				echo $value."<br />";
				$sql = "SELECT * FROM listurl WHERE linkurl='$value'";
			$check = mysqli_query($conn, $sql);
				if(mysqli_num_rows($check)>0){
                                   echo "Link đã tồn tại";
				} else{
                                     	$status = checkstatus($value);
					$sql = "INSERT INTO drivelist(linkdrive,status) VALUES ('$value','$status')";
					$query = mysqli_query($conn,$sql);
					if($query){
						echo "Đã thêm link ".$value." Thành Công với trạng thái <b>".$status."</b> <br />";
						$i++;
					}
                                 }
			}

Tuy nhiên nếu nhập 1 url vào thì check link ok. Khi điền nhiều url vào và chèn 1 link đã thêm rồi vào giữa rồi submit thì nó vẫn chạy bình thường.
Ngoài ra e có 1 function checkstatus để check trạng thái link trả về là true hay false. Tuy nhiên nếu input là nhiều link thì tất cả trạng thái đều mặc định theo trạng thái của link đầu tiên.
Em đang vừa học vừa làm cái web theo php thuần nên nhờ mọi người chỉ giúp vấn đề và cách khác phục ạ
em cảm ơn!

Nếu không cần thông báo lại cho user là “Link đã tồn tại”, bạn chỉ cần dùng “replace into” thay cho “insert into”, với điều kiện linkurl phải là primary hoặc unique.

vậy là e đổi colum linkurl sang unique xong dùng replace into thì ko cần thiết phải check num_rows để xem link đã có hay ko ạ? mysql sẽ tự check nếu bị trùng thì ko insert vào ạ. E sẽ thử cảm ơn ạ :smiley:
Còn vấn đề của cái check status nữa e test đi test lại ko hiểu có vấn đề gì ạ

Không phải nếu trùng thì không insert mà nếu trùng thì update cái đã có

nếu trùng e muốn bỏ qua vì hiện tại table này e chỉ có duy nhất colum linkurl là chứa giá trị input vào thôi ạ. nên nếu trùng thì update thì nó vẫn thế mà nhỉ? e ko hiểu lắm

 INSERT IGNORE INTO

sẽ không làm gì nếu đã có trùng trước đó. Tất nhiên lúc này bạn phải chuyển linkurl thành primary key thì nó mới biết thế nào là trùng.

chuyển sang primary key thì hơi khó do e dùng id để sau này tiện check hơn là theo url đó
p/s: cho e hỏi lệnh nào trong mysql để check các url trùng trong cột và xóa đi không ạ

Đặt lệnh insert trong vòng for là 1 tội ác. Nên tạo câu lệnh insert rồi thực thi 1 lần thay vì thực thi n lần.

1 Like

e đang học nên chưa rõ lắm. có thể demo cho e câu lệnh để e tham khảo được không ạ?

Vì đặt trong vòng for thì sẽ phải open/close connection n lần, tốn quá nhiều connection.
Thay vì n câu insert:

insert into mytable(col1, col2) values('value1', 'value2');
insert into mytable(col1, col2) values('value3', 'value4');
insert into mytable(col1, col2) values('value5', 'value6');
...

thì có thể insert nhiều dòng dùng chỉ 1 câu insert (1 connection):

insert into mytable(col1, col2) values('value1', 'value2'),('value3', 'value4'),('value5', 'value6')....;
2 Likes

của e đầu vào là 1 list value người dùng input vào.
Vậy như của e khi input vào để sài 1 câu lệnh thì e chưa hình dung ra được do vd có n=20 dòng nhưng lần sau lại n=15 dòng. Nên nếu dùng 1 câu lệnh thế e chưa nghĩ ra sao cho chính xác ngoài cách cho vào 1 vòng lặp để insert từng dòng 1 vào

Có thể dùng for để nối chuỗi tạo câu insert.

1 Like

Không được đặt câu truy vấn trong for như vậy!

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?