Giá trị gia tăng trong truy vấn cập nhật mysql


138

Tôi đã tạo mã này để cho ra +1 điểm, nhưng nó không hoạt động đúng.

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

biến $ points là điểm người dùng hiện tại .. Tôi muốn nó cộng thêm một điểm cho nó .. vì vậy, ví dụ nếu anh ta có 5 điểm, thì nên là 5 + 1 = 6 .. nhưng không, nó chỉ thay đổi đến 1

Tôi đã làm gì sai? cảm ơn bạn


2
Tôi đã có một vấn đề tương tự sau đó nhận ra loại mặc định của trường là 'NULL', đã thay đổi thành 0 và tất cả đều ổn.
Azmeer

Câu trả lời:


322

Bạn cũng có thể làm điều này:

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

59
@ Nhận xét nhận xét của bạn nghe có vẻ thông minh đối với người biết PDO là gì, nhưng đối với tôi, người mới tìm hiểu về PHP / MySQL, nó không thực sự chiếu sáng nhiều vấn đề. PDO có làm cho mã đó nhỏ hơn hoặc thanh lịch hơn không? Nếu vậy, vui lòng chỉnh sửa câu trả lời hoặc đăng một trong những câu hỏi của riêng bạn, nơi bạn cho thấy nó tốt hơn với PDO như thế nào. Cảm ơn.
Camilo Martin

5
@CamiloMartin Mình cũng tò mò. Tôi đã tìm thấy net.tutsplus.com/tutorials/php/ này
PJ Brunet

11
@CamiloMartin trang hướng dẫn sử dụng php.net cho mysql_query có lưu ý sau: Phần mở rộng này không được dùng nữa kể từ phiên bản PHP 5.5.0 và sẽ bị xóa trong tương lai. Thay vào đó, nên sử dụng phần mở rộng MySQLi hoặc PDO_MyQuery . Xem thêm MySQL: chọn hướng dẫn APICâu hỏi thường gặp liên quan để biết thêm thông tin.
aland

9
Kết hợp dữ liệu người dùng như được thể hiện trong truy vấn SQL là một rủi ro tiêm SQL chính.
kẻ phản diện

1
@bigp: Tôi đã thử UPDATE xyz SET points = MIN(points + 1, YOUR_LIMIT_VALUE_HERE)và nó không hoạt động. Những gì đã làm việc là : UPDATE xyz SET points = points + 1 WHERE points < YOUR_LIMIT_VALUE_HERE.
Jealie

23

Bạn có thể làm điều này mà không phải truy vấn số điểm thực tế, vì vậy nó sẽ giúp bạn tiết kiệm thời gian và tài nguyên trong quá trình thực thi tập lệnh.

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

Khác, những gì bạn đã làm sai là bạn đã chuyển số lượng điểm cũ dưới dạng một chuỗi ( points='5'+1) và bạn không thể thêm một số vào một chuỗi. ;)


10

Hy vọng tôi sẽ không phản đối bài viết đầu tiên của mình, nhưng tôi muốn mở rộng một chút về việc truyền số nguyên thành chuỗi vì một số người trả lời có vẻ đã sai.

Vì biểu thức trong truy vấn này sử dụng toán tử số học (ký hiệu cộng +), MySQL sẽ chuyển đổi bất kỳ chuỗi nào trong biểu thức thành số.

Để chứng minh, sau đây sẽ tạo ra kết quả 6:

SELECT ' 05.05 '+'.95';

Nối chuỗi trong MySQL yêu cầu hàm CONCAT () vì vậy không có sự mơ hồ ở đây và MySQL chuyển đổi các chuỗi thành float và thêm chúng lại với nhau.

Tôi thực sự nghĩ rằng lý do truy vấn ban đầu không hoạt động rất có thể là do biến $ points thực tế không được đặt thành các điểm hiện tại của người dùng. Nó được đặt thành 0 hoặc không được đặt: MySQL sẽ chuyển một chuỗi rỗng thành 0. Để minh họa, sau đây sẽ trả về 0:

SELECT ABS('');

Như tôi đã nói, tôi hy vọng tôi không quá lạc đề. Tôi đồng ý rằng Daan và Tomas có giải pháp tốt nhất cho vấn đề đặc biệt này.


+1 compton điểm rất tốt, bạn có đúng về dàn diễn viên làm việc không, có trích dẫn hay không. Chào mừng đến với SO!
Pekka

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

1
Nếu tôi sử dụng biến thay vì value = 1 thì sao? Tôi có nên làm theo cách này "points = points + $ biến" không? hoặc "points = points + '$ biến'"
Ivo San

7

Ngoài ra, để "tăng" chuỗi, khi cập nhật, sử dụng CONCAT

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

3

Ai cần cập nhật chuỗi và số SET @a = 0; UPDATE obj_disposition SET CODE = CONCAT('CD_', @a:=@a+1);


2

Bạn nên sử dụng PDO để ngăn ngừa rủi ro tiêm SQL.

Bạn có thể kết nối với DB như thế này:

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

Không cần truy vấn DB để có được số điểm. Bạn có thể tăng trực tiếp trong truy vấn cập nhật ( points = points + 1).

(lưu ý: Ngoài ra, không nên tăng giá trị với PHP vì trước tiên bạn cần chọn dữ liệu và giá trị có thể thay đổi nếu người dùng khác được cập nhật.)

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

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

1

Xóa 'xung quanh point:

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

Bạn đang "truyền" một giá trị số nguyên thành chuỗi trong truy vấn ban đầu của mình ...


-2

Tại sao bạn không để PHP thực hiện công việc?

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

7
Điểm tốt, nhưng hãy cẩn thận trong một môi trường đồng thời vì giá trị DB có thể đã thay đổi trong thời gian này.
Vincent Nikkelen

1
Cảm ơn @VincentNikkelen, bạn đã đánh vào đầu đinh. Đồng thời!
Jimmy Ilenloa

1
Nếu bạn sử dụng phương pháp này, trước tiên bạn nên CHỌN dữ liệu, có nghĩa là quyền truy cập bổ sung vào hàng. Đây không phải là cách để đi nếu bạn chỉ cần cập nhật giá trị.
Andres SK
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.