MySQL güncelleme sorgusundaki artış değeri


140

Bu kodu +1 puan vermek için yaptım, ancak düzgün çalışmıyor.

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

$ points değişkeni şu anda kullanıcının puanlarıdır .. Bunu artı bir tane istiyorum .. 5 örnek gibi olsaydı, 5 + 1 = 6 olmalı .. ama değişmez, sadece değişir 1'e

Neyi yanlış yaptım? teşekkür ederim


2
Ben benzer bir sorun vardı sonra alanın varsayılan türü 'NULL' olduğunu fark, 0 olarak değiştirdi ve her şey iyi oldu.
Azmeer

Yanıtlar:


324

Sadece bunu da yapabilirsiniz:

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

59
@ Yorumunuz PDO'nun ne olduğunu bilen biri için zekice gelebilir, ancak benim için sadece PHP / MySQL'e dalış yapan kişi, konuya çok fazla ışık tutmuyor. PDO bu kodu daha küçük veya daha zarif yapar mı? Öyleyse, lütfen cevabı düzenleyin veya PDO ile nasıl daha iyi olduğunu gösterdiğiniz yerlerden birini gönderin. Teşekkürler.
Camilo Martin

5
@CamiloMartin Ben de merak ettim. Bunu yararlı buldum net.tutsplus.com/tutorials/php/…
PJ Brunet

11
@CamiloMartin mysql_query için php.net kılavuzları sayfasında şu not vardır: Bu uzantı PHP 5.5.0'dan itibaren kullanımdan kaldırılmıştır ve gelecekte kaldırılacaktır. Bunun yerine, MySQLi veya PDO_MySQL uzantısı kullanılmalıdır. Daha fazla bilgi için ayrıca bkz. MySQL: API kılavuzu seçme ve ilgili SSS .
aland

9
Kullanıcı verilerinin bir SQL sorgusunda gösterildiği gibi birleştirilmesi büyük bir SQL enjeksiyon riskidir.
trognanders

1
@bigp: Denedim UPDATE xyz SET points = MIN(points + 1, YOUR_LIMIT_VALUE_HERE)ve işe yaramadı. Ne işi yaptığım: UPDATE xyz SET points = points + 1 WHERE points < YOUR_LIMIT_VALUE_HERE.
Jealie

23

Gerçek nokta sayısını sorgulamak zorunda kalmadan bunu yapabilirsiniz, böylece komut dosyası yürütme sırasında size biraz zaman ve kaynak tasarrufu sağlayacaktır.

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

Aksi halde, yanlış yaptığınız şey eski sayıları dize ( points='5'+1) olarak geçmeniz ve dizeye sayı ekleyememenizdir. ;)


10

Umarım ilk yazımda oftopik olmayacağım, ancak bazı yanıtlayanların yanlış yaptığı göründüğü için tamsayı dizgiye yaymak için biraz genişletmek istiyorum.

Bu sorgudaki ifade bir aritmetik işleç (artı simgesi +) kullandığından, MySQL ifadedeki tüm dizeleri sayılara dönüştürür.

Göstermek için aşağıdakiler 6 sonucunu verecektir:

SELECT ' 05.05 '+'.95';

MySQL'de dize birleştirmesi CONCAT () işlevini gerektirir, bu nedenle burada belirsizlik yoktur ve MySQL dizeleri kayan noktaya dönüştürür ve birlikte ekler.

Aslında ilk sorguyu çalışma nedeni büyük olasılıkla $ points değişken aslında kullanıcının geçerli noktalarına ayarlanmadı çünkü düşünüyorum. Sıfıra ayarlandı veya ayarlanmadı: MySQL boş bir dize sıfıra atacak. Örnek olarak, aşağıdakiler 0 döndürür:

SELECT ABS('');

Dediğim gibi, umarım konu dışı değilim. Daan ve Tomas'ın bu sorun için en iyi çözümlere sahip olduklarını kabul ediyorum.


+1 compton çok iyi puan, döküm çalışma hakkında haklısın, tırnak olsun ya da olmasın. SO hoş geldiniz!
Pekka

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

1
value = 1 yerine değişken kullandıysam ne olur? bu şekilde yapmalıyım "points = points + $ değişken"? veya "puan = puan + '$ değişken'"
Ivo San

7

Ayrıca, dize "artırmak" için, güncelleme yaparken, CONCAT

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

3

Kimlerin dize ve sayıları güncellemesi gerekiyor SET @a = 0; UPDATE obj_disposition SET CODE = CONCAT('CD_', @a:=@a+1);


2

SQL enjeksiyon riskini önlemek için PDO kullanmalısınız.

DB'ye şu şekilde bağlanabilirsiniz:

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

Puan almak için DB sorgulamaya gerek yok. Doğrudan güncelleme sorgusunda ( points = points + 1) artırabilirsiniz .

(not: Ayrıca, değeri PHP ile artırmak iyi bir fikir değildir, çünkü önce verileri seçmeniz gerekir ve diğer kullanıcılar güncellenirse değer değiştirilebilir.)

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

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

1

'Etrafını çıkarın point:

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

Orijinal sorgunuzda dizeye bir tamsayı değeri "dönüştürüyorsunuz" ...


-2

Neden PHP'nin işi yapmasına izin vermiyorsun?

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

7
İyi bir nokta, ancak DB değeri bu arada değişmiş olabileceğinden, eşzamanlı bir ortamda dikkatli olun.
Vincent Nikkelen

1
Teşekkürler @VincentNikkelen, kafasına çiviyi vurdun. Eşzamanlılık!
Jimmy Ilenloa

1
Bu yöntemi kullanırsanız, ilk önce verileri SEÇMELİSİNİZ, bu da satıra ek erişim anlamına gelir. Değeri güncellemeniz gerekiyorsa, bu gitmek için bir yol değildir.
Andres SK
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.