पहला मुद्दा, आप तैयार बयानों का बिल्कुल भी फायदा नहीं उठा रहे थे। पैरामीटर का उपयोग करें (?
क्वेरी में) और फिर उन्हें 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));
}