MySQL 업데이트 쿼리의 값 증가


139

+1 포인트를 제공하기 위해이 코드를 만들었지 만 제대로 작동하지 않습니다.

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

$ points 변수는 현재 사용자의 포인트입니다. 1에 플러스를 더하고 싶습니다. 예를 들어 그가 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
@CamiloMartin mysql_query에 대한 php.net 매뉴얼 페이지는 다음과 같습니다.이 확장은 PHP 5.5.0부터 더 이상 사용되지 않으며 향후 제거 될 예정입니다. 대신, MySQLi 또는 PDO_MySQL 확장을 사용해야합니다. 자세한 정보는 MySQL : API 안내서 및 관련 FAQ 선택 을 참조하십시오.
aland

9
SQL 쿼리에 설명 된대로 사용자 데이터를 연결하는 것은 주요 SQL 주입 위험입니다.
트론 맨더

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 변수가 실제로 사용자의 현재 포인트로 설정되지 않았기 때문일 가능성이 높습니다. 0으로 설정되었거나 설정되지 않았습니다. MySQL은 빈 문자열을 0으로 캐스팅합니다. 설명을 위해 다음은 0을 반환합니다.

SELECT ABS('');

내가 말했듯이, 나는 너무 화제가되지 않기를 바랍니다. Daan과 Tomas가이 특정 문제에 대한 최상의 솔루션을 가지고 있음에 동의합니다.


+1 compton very good points, 당신은 캐스트 작업에 대해 맞습니다. SO에 오신 것을 환영합니다!
Pekka

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

1
value = 1 대신 variable을 사용하면 어떻게 되나요? "points = points + $ variable"방식으로해야합니까? 또는 "포인트 = 포인트 + '$ variable'"
Ivo San

7

또한 업데이트 할 때 문자열을 "증가"하려면 CONCAT

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

3

문자열과 숫자를 업데이트해야하는 사람 SET @a = 0; UPDATE obj_disposition SET CODE = CONCAT('CD_', @a:=@a+1);


2

SQL 삽입 위험을 방지하려면 PDO를 사용해야합니다.

다음과 같이 DB에 연결할 수 있습니다.

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
좋은 지적이지만 동시에 DB 값이 변경되었을 수 있으므로 동시 환경에서는주의해야합니다.
Vincent Nikkelen

1
@VincentNikkelen 덕분에, 당신은 머리에 못을 쳤다. 동시성!
Jimmy Ilenloa

1
이 방법을 사용하는 경우 먼저 데이터를 선택해야합니다. 이는 행에 대한 추가 액세스를 의미합니다. 값을 업데이트해야하는 경우에는이 방법이 아닙니다.
Andres SK
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.