Mysql अद्यतन क्वेरी में वृद्धि मूल्य


139

मैंने +1 अंक देने के लिए यह कोड बनाया है, लेकिन यह ठीक से काम नहीं करता है।

mysql_query("
    UPDATE member_profile 
    SET points= ' ".$points." ' + 1 
    WHERE user_id = '".$userid."'
");

$ अंक चर उपयोगकर्ता के अंक अभी है .. मैं इसे इसके लिए एक प्लस करना चाहता हूं .. इसलिए उदाहरण अगर उसे 5 अंक पसंद थे, तो यह 5 + 1 = 6 होना चाहिए .. लेकिन यह नहीं बदलता है, बस बदल जाता है से १

मैंने क्या गल्त किया है? धन्यवाद


2
मेरे पास एक समान मुद्दा था, तब पता चला कि फ़ील्ड का डिफ़ॉल्ट प्रकार 'NULL' था, इसे 0 में बदल दिया और सब कुछ ठीक हो गया।
अज़मेर

जवाबों:


323

आप यह भी कर सकते हैं:

mysql_query("
    UPDATE member_profile 
    SET points = points + 1
    WHERE user_id = '".$userid."'
");

59
@ आपकी टिप्पणी से किसी ऐसे व्यक्ति के लिए चतुराई हो सकती है जो जानता है कि पीडीओ क्या है, लेकिन मेरे लिए जो सिर्फ PHP / MySQL में डाइविंग कर रहा है, वह वास्तव में इस मामले में बहुत अधिक प्रकाश नहीं डालता है। क्या पीडीओ उस कोड को छोटा या अधिक सुरुचिपूर्ण बनाता है? यदि हां, तो कृपया उत्तर को संपादित करें या अपनी खुद की एक पोस्ट करें जहां आप दिखाते हैं कि यह पीडीओ के साथ बेहतर कैसे है। धन्यवाद।
कैमिलो मार्टिन

5
@CamiloMartin मैं भी उत्सुक था। मुझे यह उपयोगी net.tutsplus.com/tutorials/php/…
PJ ब्रुनेट

11
@CamiloMartin mysql_query के लिए php.net मैनुअल पेज पर निम्नलिखित नोट है: यह एक्सटेंशन PHP 5.5.0 के रूप में चित्रित किया गया है, और भविष्य में हटा दिया जाएगा। इसके बजाय, MySQLi या PDO_MySQL एक्सटेंशन का उपयोग किया जाना चाहिए। MySQL भी देखें : अधिक जानकारी के लिए API गाइड और संबंधित FAQ चुनना
अलंड

9
SQL क्वेरी में प्रदर्शित उपयोगकर्ता डेटा को एक प्रमुख SQL इंजेक्शन जोखिम है।
ट्रोगनेन्डर्स

1
@bigp: मैंने कोशिश की UPDATE xyz SET points = MIN(points + 1, YOUR_LIMIT_VALUE_HERE)और यह काम नहीं किया। क्या काम किया था: UPDATE xyz SET points = points + 1 WHERE points < YOUR_LIMIT_VALUE_HERE
जेले २०'१

23

आप ऐसा कर सकते हैं बिना अंकों की वास्तविक राशि के, इसलिए यह स्क्रिप्ट निष्पादन के दौरान आपके कुछ समय और संसाधनों को बचाएगा।

mysql_query("UPDATE `member_profile` SET `points`= `points` + 1 WHERE `user_id` = '".intval($userid)."'");

और, जो आप गलत कर रहे थे वह यह है कि आपने एक स्ट्रिंग ( points='5'+1) के रूप में पुराने अंकों को पास कर दिया है , और आप एक स्ट्रिंग में एक संख्या नहीं जोड़ सकते। ;)


10

आशा है कि मैं अपनी पहली पोस्ट पर अपमानजनक नहीं हूं, लेकिन पूर्णांक की कास्टिंग पर थोड़ा विस्तार करना चाहूंगा क्योंकि कुछ उत्तरदाताओं को यह गलत लगता है।

क्योंकि इस क्वेरी में अभिव्यक्ति एक अंकगणितीय ऑपरेटर (प्लस प्रतीक +) का उपयोग करता है, MySQL अभिव्यक्ति में किसी भी स्ट्रिंग को संख्याओं में बदल देगा।

प्रदर्शित करने के लिए, निम्नलिखित परिणाम 6 का उत्पादन करेगा:

SELECT ' 05.05 '+'.95';

MySQL में स्ट्रिंग संघनन के लिए CONCAT () फ़ंक्शन की आवश्यकता होती है, इसलिए यहां कोई अस्पष्टता नहीं है और MySQL स्ट्रिंग्स को फ्लोट में परिवर्तित करता है और उन्हें एक साथ जोड़ता है।

मुझे वास्तव में लगता है कि शुरुआती क्वेरी काम नहीं करने का कारण सबसे अधिक संभावना है क्योंकि $ पॉइंट वेरिएबल वास्तव में उपयोगकर्ता के वर्तमान बिंदुओं पर सेट नहीं था। यह या तो शून्य पर सेट किया गया था, या परेशान था: MySQL शून्य को एक खाली स्ट्रिंग डालेगा। चित्रण के लिए, निम्नलिखित 0 वापस आएगा:

SELECT ABS('');

जैसा मैंने कहा, मुझे आशा है कि मैं बहुत अधिक विषय नहीं हूं। मैं मानता हूं कि दान और टॉमस के पास इस विशेष समस्या का सबसे अच्छा समाधान है।


+1 कॉम्पटन बहुत अच्छे बिंदु हैं, आप कलाकारों के काम करने के बारे में सही हैं, उद्धरण हों या न हों। एसओ में आपका स्वागत है!
पेका

7
"UPDATE member_profile SET points = points + 1 WHERE user_id = '".$userid."'"

1
क्या होगा यदि मैंने मूल्य = 1 के बजाय चर का उपयोग किया है? क्या मुझे इसे इस तरह करना चाहिए "अंक = अंक + $ चर"? या "अंक = अंक + '$ चर'"
इवो ​​सैन

7

इसके अलावा, "वृद्धि" स्ट्रिंग के लिए, जब अद्यतन, उपयोग करें CONCAT

update dbo.test set foo=CONCAT(foo, 'bar') where 1=1


2

SQL इंजेक्शन जोखिम को रोकने के लिए आपको PDO का उपयोग करना चाहिए।

आप इस तरह DB से जुड़ सकते हैं:

try {
    $pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
    $bdd = new PDO('mysql:host=xxxx;dbname=xxxx', 'user', 'password', $pdo_options);
    $bdd->query('SET NAMES "utf8"');
} catch (PDOException $e) {
    exit('Error');
}

अंकों की संख्या प्राप्त करने के लिए DB को क्वेरी करने की आवश्यकता नहीं है। आप सीधे अपडेट क्वेरी ( points = points + 1) में वृद्धि कर सकते हैं ।

(ध्यान दें: इसके अलावा, PHP के साथ मूल्य बढ़ाना एक अच्छा विचार नहीं है क्योंकि आपको पहले डेटा का चयन करने की आवश्यकता है और यदि अन्य उपयोगकर्ता इसे अपडेट करते हैं तो मूल्य बदल सकता है।)

$req = $bdd->prepare('UPDATE member_profile SET 
            points = points + 1
            WHERE user_id = :user_id');

$req->execute(array(
    'user_id' => $userid
));

1

के 'आसपास निकालें point:

mysql_query("UPDATE member_profile SET points=".$points."+1 WHERE user_id = '".$userid."'");

आप अपनी मूल क्वेरी में स्ट्रिंग के लिए एक पूर्णांक मान "कास्टिंग" कर रहे हैं ...


-2

आप PHP को काम क्यों नहीं करने देते?

"UPDATE member_profile SET points= ' ". ($points+1) ." '  WHERE user_id = '".$userid."'"

7
अच्छी बात है, लेकिन एक समवर्ती वातावरण में लापरवाह हो सकता है क्योंकि इस बीच DB मूल्य बदल गया हो सकता है।
विंसेंट निक्केलन

1
धन्यवाद @VincentNikkelen, आपने सिर पर कील मारा। संगामिति!
जिमी इलेनॉला

1
यदि आप इस विधि का उपयोग करते हैं, तो आपको पहले डेटा का चयन करना चाहिए, जिसका अर्थ है पंक्ति में अतिरिक्त पहुंच। यह जाने का तरीका नहीं है यदि आपको केवल मूल्य अपडेट करने की आवश्यकता है।
एंड्रेस एसके
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.