Zaprvé, vůbec jste nevyužívali připravená prohlášení. Použijte parametry (?
v dotazu) a poté je vyplňte hodnotami v execute()
zavolejte.
Také připravte svůj dotaz mimo smyčku a spusťte jej uvnitř. To je jedna z klíčových výhod přípravy výkazů předem, je zde menší režie, když jsou sestavovány pouze jednou.
Konečně není třeba před dotazem kontrolovat databázi a poté provádět jeden ze dvou dotazů. Nechte MySQL zkontrolovat, zda hodnota již existuje pomocí INSERT...ON DUPLICATE KEY UPDATE
syntax. To závisí na správném nastavení databáze, takže by měl existovat UNIQUE
index na (session.usr_id, session.site_id)
.
Toto není testováno, ale mělo by vám pomoci:
$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));
}