Nilai penambahan dalam kueri pembaruan mysql

138

Saya telah membuat kode ini untuk memberi +1 poin, tetapi tidak berfungsi dengan baik.

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

variabel $ points adalah poin pengguna sekarang .. Saya ingin ditambah satu untuk itu .. jadi contoh jika dia punya seperti 5 poin, itu harus 5 + 1 = 6 .. tetapi tidak, itu hanya berubah ke 1

Apa yang saya lakukan salah? Terima kasih

Karem
sumber
2
Saya memiliki masalah yang sama kemudian menyadari bahwa jenis default dari bidang itu adalah 'NULL', mengubahnya menjadi 0 dan semuanya baik-baik saja.
Azmeer

Jawaban:

322

Anda juga bisa melakukan ini:

mysql_query("
    UPDATE member_profile 
    SET points = points + 1
    WHERE user_id = '".$userid."'
");
Tomas Markauskas
sumber
59
@Steve komentar Anda mungkin terdengar cerdas untuk seseorang yang tahu apa itu PDO, tetapi bagi saya yang baru saja menyelam ke PHP / MySQL, itu tidak benar-benar menyinari banyak masalah. Apakah PDO membuat kode itu lebih kecil atau lebih elegan? Jika demikian, harap edit jawaban atau poskan salah satu dari Anda di tempat Anda menunjukkan bagaimana lebih baik dengan PDO. Terima kasih.
Camilo Martin
5
@ CamiloMartin saya juga penasaran. Saya menemukan net.tutsplus.com/tutorials/php/…
PJ Brunet
11
@CamiloMartin halaman manual php.net untuk mysql_query memiliki catatan berikut: Ekstensi ini sudah tidak digunakan lagi pada PHP 5.5.0, dan akan dihapus di masa mendatang. Sebaliknya, ekstensi MySQLi atau PDO_MySQL harus digunakan. Lihat juga MySQL: memilih panduan API dan FAQ terkait untuk informasi lebih lanjut.
aland
9
Menggabungkan data pengguna seperti yang ditunjukkan ke dalam permintaan SQL adalah risiko injeksi SQL utama.
trognanders
1
@ Bigp: Saya mencoba UPDATE xyz SET points = MIN(points + 1, YOUR_LIMIT_VALUE_HERE)dan tidak berhasil. Apa yang bekerja adalah: UPDATE xyz SET points = points + 1 WHERE points < YOUR_LIMIT_VALUE_HERE.
Jealie
23

Anda dapat melakukan ini tanpa harus meminta jumlah poin aktual, sehingga akan menghemat waktu dan sumber daya selama eksekusi skrip.

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

Lain, apa yang Anda lakukan salah adalah bahwa Anda melewati jumlah poin lama sebagai string ( points='5'+1), dan Anda tidak dapat menambahkan nomor ke string. ;)

Daan
sumber
10

Semoga saya tidak akan offtopic pada posting pertama saya, tetapi saya ingin sedikit memperluas casting dari integer ke string karena beberapa responden tampaknya salah.

Karena ekspresi dalam kueri ini menggunakan operator aritmatika (simbol plus +), MySQL akan mengonversi string apa pun dalam ekspresi menjadi angka.

Untuk menunjukkan, berikut ini akan menghasilkan hasil 6:

SELECT ' 05.05 '+'.95';

Rangkaian string dalam MySQL membutuhkan fungsi CONCAT () sehingga tidak ada ambiguitas di sini dan MySQL mengubah string menjadi float dan menambahkannya bersama-sama.

Saya benar-benar berpikir alasan kueri awal tidak berfungsi kemungkinan besar karena variabel $ points sebenarnya tidak disetel ke poin pengguna saat ini. Entah itu diatur ke nol, atau tidak disetel: MySQL akan membuang string kosong ke nol. Sebagai ilustrasi, berikut ini akan mengembalikan 0:

SELECT ABS('');

Seperti yang saya katakan, saya harap saya tidak terlalu di luar topik. Saya setuju bahwa Daan dan Tomas memiliki solusi terbaik untuk masalah khusus ini.

pengguna272563
sumber
+1 compton poin yang sangat bagus, Anda benar tentang para pemeran yang bekerja, ada kutipan atau tidak. Selamat datang di SO!
Pekka
7
"UPDATE member_profile SET points = points + 1 WHERE user_id = '".$userid."'"
Mark Byers
sumber
1
bagaimana jika saya menggunakan variabel, bukan nilai = 1? haruskah saya melakukannya dengan cara ini "poin = poin + $ variabel"? atau "poin = poin + '$ variabel'"
Ivo San
7

Juga, untuk string "kenaikan", saat memperbarui, gunakan CONCAT

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

Siapa yang perlu memperbarui string dan angka SET @a = 0; UPDATE obj_disposition SET CODE = CONCAT('CD_', @a:=@a+1);

Rodolfo Souza
sumber
2

Anda harus menggunakan PDO untuk mencegah risiko injeksi SQL.

Anda dapat terhubung ke DB seperti ini:

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

Tidak perlu meminta DB untuk mendapatkan jumlah poin. Anda dapat menambahkan secara langsung dalam permintaan pembaruan ( points = points + 1).

(catatan: Juga, bukan ide yang baik untuk menambah nilai dengan PHP karena Anda harus memilih dulu data dan nilainya dapat diubah jika pengguna lain memperbaruinya.)

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

$req->execute(array(
    'user_id' => $userid
));
Sébastien Gicquel
sumber
1

Hapus 'sekitar point:

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

Anda "menuang" nilai integer ke string dalam kueri asli Anda ...

Amirshk
sumber
-2

Mengapa Anda tidak membiarkan PHP melakukan pekerjaan itu?

"UPDATE member_profile SET points= ' ". ($points+1) ." '  WHERE user_id = '".$userid."'"
Petr Peller
sumber
7
Poin bagus, tapi hati-hati dalam lingkungan bersamaan karena nilai DB mungkin telah berubah sementara itu.
Vincent Nikkelen
1
Terima kasih @VincentNikkelen, Anda memukul paku di kepala. Concurrency!
Jimmy Ilenloa
1
Jika Anda menggunakan metode ini, Anda harus SELECT data terlebih dahulu, yang berarti akses tambahan ke baris. Ini bukan cara untuk pergi jika Anda hanya perlu memperbarui nilainya.
Andres SK