Premier problème, vous ne profitiez pas du tout des déclarations préparées. Utilisez des paramètres (le ?
dans la requête) puis remplissez-les avec des valeurs dans execute()
appeler.
Préparez également votre requête en dehors d'une boucle et exécutez-la à l'intérieur. C'est l'un des principaux avantages de la préparation des relevés à l'avance, il y a moins de frais généraux lorsqu'ils ne sont préparés qu'une seule fois.
Enfin, il n'est pas nécessaire de vérifier la base de données avant votre requête, puis d'exécuter l'une des deux requêtes. Laissez MySQL vérifier si la valeur existe déjà avec INSERT...ON DUPLICATE KEY UPDATE
syntaxe. Cela dépend de la configuration correcte de la base de données, il devrait donc y avoir un UNIQUE
index sur (session.usr_id, session.site_id)
.
Ceci n'a pas été testé, mais devrait vous aider :
$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));
}