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.