Vấn đề đầu tiên, bạn đã hoàn toàn không tận dụng được các báo cáo đã chuẩn bị. Sử dụng các tham số (?
trong truy vấn) và sau đó điền chúng bằng các giá trị trong execute()
gọi.
Ngoài ra, hãy chuẩn bị truy vấn của bạn bên ngoài một vòng lặp và thực thi nó bên trong. Đây là một trong những lợi thế quan trọng của việc chuẩn bị trước các báo cáo, sẽ ít tốn chi phí hơn khi chúng chỉ được lập một lần.
Cuối cùng, không cần kiểm tra cơ sở dữ liệu trước truy vấn của bạn và sau đó thực hiện một trong hai truy vấn. Chỉ cần để MySQL kiểm tra xem giá trị đã tồn tại hay chưa bằng INSERT...ON DUPLICATE KEY UPDATE
cú pháp. Điều này phụ thuộc vào cơ sở dữ liệu được thiết lập đúng cách, vì vậy phải có UNIQUE
lập chỉ mục trên (session.usr_id, session.site_id)
.
Điều này chưa được kiểm tra, nhưng bạn sẽ thực hiện được:
$stmt1 = $handler->prepare("SELECT id,comments,likes,views FROM sites WHERE usr_id = ?");
$stmt2 = $handler->prepare("INSERT INTO session SET comments = ?, likes = ?, views = ?, usr_id = ?, site_id = ? ON DUPLICATE KEY UPDATE comments = VALUES(comments), likes = VALUES(likes), views = VALUES(views)");
$stmt1->execute(array($usr_id));
while($row = $stmt1->fetch(PDO::FETCH_ASSOC)) {
$site_id = $row["id"];
$stmt2->execute(array($comments, $likes, $views, $usr_id, $site_id));
}