2010-02-13 47 views
98

Tôi đã tạo mã này để đưa ra +1 điểm, nhưng nó không hoạt động đúng cách.Giá trị gia tăng trong truy vấn cập nhật mysql

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

các $ chỉ biến là user's điểm ngay bây giờ .. Tôi muốn nó cộng với một với nó .. vì vậy ví dụ nếu ông có giống như 5 điểm, nó sẽ là 5 + 1 = 6 .. nhưng không, nó chỉ thay đổi thành 1

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

+1

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 nó thành 0 và tất cả đều tốt. – Azmeer

Trả lời

222

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

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

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

+5

@CamiloMartin Tôi cũng tò mò. Tôi thấy http://net.tutsplus.com/tutorials/php/pdo-vs-mysqli-which-should-you-use/ –

+8

@CamiloMartin [hướng dẫn sử dụng php.net] hữu ích này (http://php.net /manual/en/function.mysql-query.php) trang cho mysql_query có ghi chú sau: Tiện ích mở rộng này không được chấp nhận như của PHP 5.5.0 và sẽ bị xóa trong tương lai. Thay vào đó, [MySQLi] (http://www.php.net/manual/en/book.mysqli.php) hoặc [PDO_MySQL] (http://www.php.net/manual/en/ref.pdo- mysql.php) nên được sử dụng. Xem thêm hướng dẫn [MySQL: chọn một API] (http://www.php.net/manual/en/mysqlinfo.api.choosing.php) và [FAQ có liên quan] (http://www.php.net/manual) /en/faq.databases.php#faq.databases.mysql.deprecated) để biết thêm thông tin. – aland

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

nếu tôi sử dụng biến thay vì giá trị = 1 thì sao? tôi có nên làm theo cách này "điểm = điểm + $ biến" không? hoặc "điểm = điểm + '$ biến'" –

1

Tháo ' quanh point:

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

Bạn đang "đúc" một giá trị số nguyên để chuỗi trong truy vấn ban đầu của bạn ...

0

Tại sao bạn không để cho PHP làm công việc?

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

Điểm tốt, nhưng phải cẩn thận trong môi trường đồng thời vì giá trị DB có thể đã thay đổi trong thời gian chờ đợi. –

+1

Cảm ơn @VincentNikkelen, bạn đã chạm vào móng trên đầu. Đồng thời! –

+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à 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ị. – andufo

16

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

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

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

10

Hope Tôi sẽ không Offtopic về bài đăng đầu tiên của tôi, nhưng tôi muốn mở rộng một chút trên Đúc các số nguyên để chuỗi như một số người trả lời có vẻ sai.

Bởi vì biểu thức trong truy vấn này sử dụng toán tử số học (dấ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'; 

String nối trong MySQL đòi hỏi sự CONCAT() chức năng như vậy không có sự nhập nhằng ở đây và MySQL chuyển đổi chuỗi để nổi và thêm chúng với nhau.

Tôi thực sự cho rằng lý do truy vấn ban đầu không hoạt động có nhiều khả năng là do biến $ điểm không thực tế đượ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ẽ truyền một chuỗi rỗng về 0. Để minh hoạ, thông tin sau sẽ trả về 0:

SELECT ABS(''); 

Như tôi đã nói, tôi hy vọng tôi không quá chủ đề. Tôi đồng ý rằng Daan và Tomas có những giải pháp tốt nhất cho vấn đề cụ thể này.

+0

+1 compton điểm rất tốt, bạn có quyền về dàn diễn viên làm việc, có dấu ngoặc kép hay không. Chào mừng bạn đến với SO! –

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 
2

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

0

Bạn nên sử dụng PDO để ngăn chặn nguy cơ SQL injection.

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 phải truy vấn DB để có được những 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, nó không phải là một ý tưởng tốt để tăng giá trị với PHP bởi vì bạn cần phải lựa chọn đầu tiên trên dữ liệu và các giá trị có thể thay đổi nếu những người dùng khác được cập nhật nó.)

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

$req->execute(array(
    'user_id' => $userid 
)); 
Các vấn đề liên quan