最初の問題は、準備されたステートメントをまったく利用していなかったことです。パラメータを使用します(?
クエリで)、execute()
の値を入力します 電話してください。
また、ループの外側でクエリを準備し、ループの内側で実行します。これは、ステートメントを事前に準備することの重要な利点の1つであり、ステートメントを1回だけ準備する場合のオーバーヘッドが少なくなります。
最後に、クエリの前にデータベースをチェックしてから、2つのクエリのいずれかを実行する必要はありません。 INSERT...ON DUPLICATE KEY UPDATE
を使用して、MySQLに値がすでに存在するかどうかを確認させます。 構文。これは、データベースが適切に設定されていることに依存しているため、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));
}