Erste Ausgabe, Sie haben vorbereitete Aussagen überhaupt nicht ausgenutzt. Verwenden Sie Parameter (das ?
in der Abfrage) und diese dann in execute()
mit Werten füllen anrufen.
Bereiten Sie Ihre Abfrage auch außerhalb einer Schleife vor und führen Sie sie innerhalb aus. Dies ist einer der Hauptvorteile der Erstellung von Auszügen im Voraus, es gibt weniger Overhead, wenn sie nur einmal erstellt werden.
Schließlich ist es nicht erforderlich, die Datenbank vor Ihrer Abfrage zu überprüfen und dann eine von zwei Abfragen auszuführen. Lassen Sie MySQL einfach mit INSERT...ON DUPLICATE KEY UPDATE
prüfen, ob der Wert bereits existiert Syntax. Dies hängt davon ab, dass die Datenbank richtig eingerichtet ist, also sollte es einen UNIQUE
geben Index auf (session.usr_id, session.site_id)
.
Dies ist ungetestet, sollte Sie aber zum Laufen bringen:
$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));
}