ค่าที่เพิ่มขึ้นในแบบสอบถามการปรับปรุง mysql


139

ฉันทำรหัสนี้เพื่อแจก +1 แต้ม แต่มันไม่ทำงานอย่างถูกต้อง

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

ตัวแปร $ points คือคะแนนของผู้ใช้ตอนนี้ .. ฉันต้องการให้มันบวกหนึ่งลงไป .. ยกตัวอย่างเช่นถ้าเขามี 5 คะแนนมันควรจะเป็น 5 + 1 = 6 .. แต่มันไม่เปลี่ยน ถึง 1

ฉันทำอะไรผิด ขอบคุณ


2
ฉันมีปัญหาที่คล้ายกันจากนั้นตระหนักถึงประเภทเริ่มต้นของเขตข้อมูลคือ 'NULL' เปลี่ยนเป็น 0 และทั้งหมดเป็นอย่างดี
Azmeer

คำตอบ:


323

คุณสามารถทำสิ่งนี้ได้เช่นกัน:

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

59
@ ความคิดเห็นของคุณอาจฟังดูฉลาดสำหรับคนที่รู้ว่า PDO คืออะไร แต่สำหรับฉันที่เพิ่งดำดิ่งสู่ PHP / MySQL มันไม่ได้ส่องแสงมากนักในเรื่องนี้ PDO ทำให้โค้ดนั้นเล็กลงหรือสง่างามกว่านี้หรือไม่? ถ้าเป็นเช่นนั้นโปรดแก้ไขคำตอบหรือโพสต์ของคุณเองที่คุณแสดงให้เห็นว่าดีกว่ากับ PDO ขอบคุณ
Camilo Martin

5
@CamiloMartin ฉันก็อยากรู้อยากเห็นเหมือนกัน ฉันพบว่ามีประโยชน์นี้net.tutsplus.com/tutorials/php/…
PJ Brunet

11
@CamiloMart ในหน้าคู่มือ php.netสำหรับ mysql_query มีหมายเหตุดังต่อไปนี้: ส่วนขยายนี้เลิกใช้แล้วใน PHP 5.5.0 และจะถูกลบออกในอนาคต แทนMySQLiหรือPDO_MySQLนามสกุลควรใช้ ดูเพิ่มเติมที่MySQL: เลือกคู่มือAPIและคำถามที่พบบ่อยที่เกี่ยวข้องสำหรับข้อมูลเพิ่มเติม
Aland

9
การเชื่อมข้อมูลผู้ใช้ที่แสดงในแบบสอบถาม SQL เป็นความเสี่ยงในการฉีด SQL ที่สำคัญ
trognanders

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สิ่งที่ได้ทำงานคือ:
Jealie

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 จะแปลงสตริงให้ลอยและรวมเข้าด้วยกัน

ฉันคิดว่าเหตุผลที่การค้นหาเริ่มต้นไม่ทำงานมักเป็นไปได้มากที่สุดเนื่องจากตัวแปร $ points ไม่ได้ตั้งค่าตามจุดปัจจุบันของผู้ใช้ มันถูกตั้งค่าเป็นศูนย์หรือไม่ได้ตั้งค่า: MySQL จะส่งสตริงว่างเป็นศูนย์ สำหรับภาพประกอบต่อไปนี้จะคืนค่า 0:

SELECT ABS('');

อย่างที่ฉันพูดฉันหวังว่าฉันจะไม่เป็นหัวข้อเกินไป ฉันยอมรับว่า Daan และ Tomas มีทางออกที่ดีที่สุดสำหรับปัญหานี้โดยเฉพาะ


+1 คอมพ์ตันคะแนนที่ดีมากคุณพูดถูกเกี่ยวกับนักแสดงจะมีคำพูดหรือไม่ ยินดีต้อนรับสู่ SO!
Pekka

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

1
เกิดอะไรขึ้นถ้าฉันใช้ตัวแปรแทน value = 1 ฉันควรทำอย่างนี้ "points = points + $ variable"? หรือ "points = points + '$ variable'"
Ivo San

7

นอกจากนี้ยังเป็นสตริง "ส่วนเพิ่ม" เมื่อใช้งานให้ปรับปรุง CONCAT

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


2

คุณควรใช้ PDO เพื่อป้องกันความเสี่ยงในการฉีด SQL

คุณสามารถเชื่อมต่อกับฐานข้อมูลดังนี้:

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
จุดที่ดี แต่ควรระมัดระวังในสภาพแวดล้อมที่เกิดขึ้นพร้อมกันเนื่องจากค่าฐานข้อมูลอาจมีการเปลี่ยนแปลงในระหว่างนี้
Vincent Nikkelen

1
ขอบคุณ @VincentNikkelen คุณตีตะปูบนหัว เห็นพ้องด้วย!
Jimmy Ilenloa

1
หากคุณใช้วิธีนี้คุณควรเลือกข้อมูลก่อนซึ่งหมายถึงการเข้าถึงแถวเพิ่มเติม นี่ไม่ใช่วิธีที่จะไปหากคุณเพียงแค่ต้องอัปเดตค่า
Andres SK
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.