মাইএসকিএল আপডেট ক্যোয়ারিতে বর্ধিত মান


139

আমি +1 পয়েন্ট দেওয়ার জন্য এই কোডটি তৈরি করেছি, তবে এটি সঠিকভাবে কাজ করে না।

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

এখনই $ পয়েন্টের ভেরিয়েবলটি ব্যবহারকারীর পয়েন্টসমূহ এখনই .. আমি এটিতে এটির সাথে আরও একটি যুক্ত করতে চাই .. সুতরাং উদাহরণস্বরূপ যদি তার 5 টি পয়েন্ট থাকে তবে এটি 5 + 1 = 6 হওয়া উচিত .. তবে এটি না, এটি কেবল পরিবর্তন হয় থেকে 1

আমি কি ভুল করেছি? ধন্যবাদ


2
আমার অনুরূপ সমস্যা হয়েছিল তখন বুঝতে পারলাম ক্ষেত্রটির ডিফল্ট ধরণটি 'NULL' ছিল, এটিকে 0 তে পরিবর্তন করা হয়েছে এবং সবকিছু ঠিক আছে।
আজমির

উত্তর:


323

আপনি কেবল এটি করতে পারেন:

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

59
@ স্টিভ আপনার মন্তব্য কারও পক্ষে চতুর হতে পারে যারা জানেন যে পিডিও কী, তবে আমার পক্ষে যিনি কেবল পিএইচপি / মাইএসকিউএল ডাইভিং করছেন, বিষয়টি সত্যই সত্যিকার অর্থে খুব বেশি আলোকপাত করে না। পিডিও কি সেই কোডটি আরও ছোট বা আরও মার্জিত করে তোলে? যদি তা হয় তবে দয়া করে উত্তরটি সম্পাদনা করুন বা আপনার নিজের পোস্ট করুন যেখানে PDO এর সাথে এটি আরও কীভাবে ভাল দেখায়। ধন্যবাদ।
ক্যামিলো মার্টিন

5
পছন্দ করেছেন আমি এই সহায়ক নেট.টুটস্পলস.com
পিজে ব্রুনেট

11
@ ক্যামিলোমার্টিন পিএইচপিএন ম্যানুয়াল পৃষ্ঠাতে মাইএসকিএল_কোয়ারির জন্য নিম্নলিখিত নোটটি রয়েছে: এই এক্সটেনশনটি পিএইচপি 5.5.0 হিসাবে অবচয় করা হয়েছে এবং ভবিষ্যতে সরানো হবে। পরিবর্তে, MySQLi বা PDO_MySQL এক্সটেনশন ব্যবহার করা উচিত। মাইএসকিউএল আরও দেখুন : আরও তথ্যের জন্য একটি এপিআই গাইড এবং সম্পর্কিত FAQ নির্বাচন করা
অ্যাল্যান্ড

9
এসকিউএল কোয়েরিতে প্রদর্শিত হিসাবে ব্যবহারকারীর ডেটা প্রতিরোধ করা একটি বড় এসকিউএল ইঞ্জেকশন ঝুঁকি।
ট্রাইগানডাররা

1
@ বিগ্প: আমি চেষ্টা করেছি UPDATE xyz SET points = MIN(points + 1, YOUR_LIMIT_VALUE_HERE)এবং এটি কার্যকর হয়নি। কি কাজ করেনি ছিল: UPDATE xyz SET points = points + 1 WHERE points < YOUR_LIMIT_VALUE_HERE
জেলি 20'17

23

আপনি পয়েন্টের আসল পরিমাণ জিজ্ঞাসা না করে এটি করতে পারেন, সুতরাং এটি স্ক্রিপ্ট সম্পাদনার সময় আপনাকে কিছু সময় এবং সংস্থান সাশ্রয় করবে।

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

অন্যথায়, আপনি যা ভুল করছেন তা হ'ল আপনি স্ট্রিং ( points='5'+1) হিসাবে পুরানো পরিমাণের পয়েন্টটি পেরিয়ে গেছেন এবং আপনি কোনও স্ট্রিংতে একটি সংখ্যা যুক্ত করতে পারবেন না। ;)


10

আশা করি আমি আমার প্রথম পোস্টে অফটপিক যাচ্ছি না তবে কিছু উত্তরদাতাকে ভুল বলে মনে হচ্ছে বলে আমি স্ট্রিংয়ের সাথে পূর্ণসংখ্যার কাস্টিংয়ের বিষয়ে কিছুটা প্রসারিত করতে চাই।

যেহেতু এই ক্যোয়ারির এক্সপ্রেশন একটি পাটিগণিত অপারেটর (প্লাস প্রতীক +) ব্যবহার করে, মাইএসকিউএল এক্সপ্রেশনটির কোনও স্ট্রিংকে সংখ্যায় রূপান্তরিত করে।

প্রদর্শনের জন্য, নিম্নলিখিতগুলি ফলাফল 6 এনে দেবে:

SELECT ' 05.05 '+'.95';

মাইএসকিউএলে স্ট্রিং কনটেনটেশনের জন্য কনক্যাট () ফাংশন প্রয়োজন তাই এখানে কোনও অস্পষ্টতা নেই এবং মাইএসকিউএল স্ট্রিংগুলিকে ফ্লোটে রূপান্তরিত করে এবং সেগুলি একসাথে যুক্ত করে।

আমি আসলে মনে করি যে প্রাথমিক কোয়েরিটি কাজ করছে না তার কারণটি সম্ভবত সম্ভবত because পয়েন্টের ভেরিয়েবলটি ব্যবহারকারীর বর্তমান পয়েন্টগুলিতে সেট করা হয়নি। এটি হয় শূন্যে সেট করা ছিল, না আনসেট করা হয়েছিল: মাইএসকিউএল খালি স্ট্রিংকে শূন্যে ফেলে দেবে। উদাহরণস্বরূপ, নিম্নলিখিত 0 ফিরে আসবে:

SELECT ABS('');

যেমনটি আমি বলেছিলাম, আমি আশা করি আমি খুব বেশি অফ-টপিক হব না আমি সম্মত হই যে ডান এবং টমাসের এই বিশেষ সমস্যার জন্য সর্বোত্তম সমাধান রয়েছে।


+1 কম্পটন খুব ভাল পয়েন্ট, আপনি কাস্ট কাজ সম্পর্কে ঠিক বলেছেন, সেখানে উক্তি থাকুক বা না থাকুক। তাই আপনাকে স্বাগতম!
পেক্কা

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

1
আমি যদি মান = 1 এর পরিবর্তে ভেরিয়েবল ব্যবহার করি? আমি কি এইভাবে "পয়েন্টস = পয়েন্টস + I ভেরিয়েবল" করব? বা "পয়েন্টস = পয়েন্টস + '$ ভেরিয়েবল'"
আইভো সান

7

এছাড়াও, "ইনক্রিমেন্ট" স্ট্রিংয়ের সাথে আপডেট করার সময় ব্যবহার করুন CONCAT

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


2

এসকিউএল ইঞ্জেকশন ঝুঁকি রোধ করতে আপনার PDO ব্যবহার করা উচিত।

আপনি এটির মতো ডিবিতে সংযোগ করতে পারেন:

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');
}

পয়েন্টের সংখ্যা পেতে ডিবিকে জিজ্ঞাসা করার দরকার নেই। আপনি আপডেটের ক্যোয়ারিতে সরাসরি বৃদ্ধি করতে পারেন (points = points + 1 ) এ ।

(দ্রষ্টব্য: এছাড়াও, পিএইচপি দিয়ে মান বাড়ানো ভাল ধারণা নয় কারণ আপনাকে প্রথমে ডেটা নির্বাচন করতে হবে এবং অন্যান্য ব্যবহারকারীরা যদি এটি আপডেট করা হয় তবে মান পরিবর্তন করতে পারে))

$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

আপনি পিএইচপিকে কাজটি করতে দিচ্ছেন না কেন?

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

7
ভাল কথা, তবে একযোগে পরিবেশে সাবধান থাকুন কারণ এর মধ্যে ডিবি মান পরিবর্তন হতে পারে।
ভিনসেন্ট নিক্কেলেন

1
ধন্যবাদ @ ভিনসেন্টনিকেলেন, আপনি মাথায় পেরেকটি মারলেন। Concurrency!
জিমি Ilenloa

1
আপনি যদি এই পদ্ধতিটি ব্যবহার করেন তবে আপনার প্রথমে ডেটা নির্বাচন করা উচিত, যার অর্থ সারিটিতে একটি অতিরিক্ত অ্যাক্সেস। আপনার যদি কেবল মূল্য আপডেট করতে হয় তবে এটি যাওয়ার উপায় নয়।
আন্দ্রে এসকে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.