Masalah pertama, Anda sama sekali tidak memanfaatkan pernyataan yang disiapkan. Gunakan parameter (?
dalam kueri) lalu isi dengan nilai di execute()
panggilan.
Juga, siapkan kueri Anda di luar loop, dan jalankan di dalam. Ini adalah salah satu keuntungan utama dari menyiapkan pernyataan di muka, ada lebih sedikit overhead jika hanya disiapkan sekali.
Terakhir, tidak perlu memeriksa database sebelum kueri Anda dan kemudian menjalankan salah satu dari dua kueri. Biarkan MySQL memeriksa apakah nilainya sudah ada dengan INSERT...ON DUPLICATE KEY UPDATE
sintaksis. Ini bergantung pada database yang diatur dengan benar, jadi harus ada UNIQUE
indeks di (session.usr_id, session.site_id)
.
Ini belum teruji, tetapi akan membantu Anda:
$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));
}