Pierwsza kwestia, w ogóle nie korzystałeś z przygotowanych oświadczeń. Użyj parametrów (?
w zapytaniu), a następnie wypełnij je wartościami w execute()
zadzwoń.
Ponadto przygotuj zapytanie poza pętlą i wykonaj je w środku. Jest to jedna z kluczowych zalet przygotowywania oświadczeń z wyprzedzeniem, ponieważ są one mniejsze, gdy są przygotowywane tylko raz.
Wreszcie, nie ma potrzeby sprawdzania bazy danych przed zapytaniem, a następnie wykonywania jednego z dwóch zapytań. Po prostu pozwól MySQL sprawdzić, czy wartość już istnieje za pomocą INSERT...ON DUPLICATE KEY UPDATE
składnia. Polega to na prawidłowej konfiguracji bazy danych, więc powinna istnieć UNIQUE
indeks na (session.usr_id, session.site_id)
.
To nie zostało przetestowane, ale powinno Cię zachęcić:
$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));
}