Primeira questão, você não estava tirando vantagem das declarações preparadas. Use parâmetros (o
?
na consulta) e, em seguida, preencha-os com valores no execute()
ligar. Além disso, prepare sua consulta fora de um loop e execute-a dentro. Essa é uma das principais vantagens de preparar declarações com antecedência, pois há menos sobrecarga quando elas são preparadas apenas uma vez.
Por fim, não há necessidade de verificar o banco de dados antes de sua consulta e, em seguida, executar uma das duas consultas. Apenas deixe o MySQL verificar se o valor já existe com
INSERT...ON DUPLICATE KEY UPDATE
sintaxe. Isso depende do banco de dados ser configurado corretamente, então deve haver um UNIQUE
indexar em (session.usr_id, session.site_id)
. Isso não foi testado, mas deve ajudá-lo:
$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));
}