Първи въпрос, изобщо не се възползвахте от подготвени изявления. Използвайте параметри (?
в заявката) и след това ги попълнете със стойности в execute()
обадете се.
Също така, подгответе заявката си извън цикъл и я изпълнете вътре. Това е едно от основните предимства на изготвянето на изявления предварително, има по-малко разходи, когато се изготвят само веднъж.
И накрая, няма нужда да проверявате базата данни преди вашата заявка и след това да изпълнявате една от двете заявки. Просто оставете MySQL да провери дали стойността вече съществува с INSERT...ON DUPLICATE KEY UPDATE
синтаксис. Това разчита на правилното настройване на базата данни, така че трябва да има UNIQUE
индекс на (session.usr_id, session.site_id)
.
Това е непроверено, но трябва да ви накара да продължите:
$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));
}