[php] MySQL 업데이트 쿼리의 값 증가

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

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

$ points 변수는 현재 사용자의 포인트입니다. 1에 플러스를 더하고 싶습니다. 예를 들어 그가 5 포인트를 가졌다면 5 + 1 = 6이어야합니다. 그러나 그렇지 않습니다. 1

내가 뭘 잘못 했니? 감사합니다



답변

당신은 또한 이것을 할 수 있습니다 :

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


답변

실제 포인트를 쿼리하지 않고도이 작업을 수행 할 수 있으므로 스크립트 실행 중에 시간과 리소스를 절약 할 수 있습니다.

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

그렇지 않으면, 당신이 잘못한 것은 오래된 양의 포인트를 문자열 ( points='5'+1) 로 전달했으며 문자열 에 숫자를 추가 할 수 없다는 것입니다. 😉


답변

첫 번째 게시물에서 주제를 벗어나지 않기를 바랍니다. 그러나 일부 응답자는 잘못된 것으로 보이기 때문에 정수를 문자열로 캐스팅하는 것에 대해 조금 확장하고 싶습니다.

이 쿼리의 표현식은 산술 연산자 (더하기 기호 +)를 사용하므로 MySQL은 표현식의 모든 문자열을 숫자로 변환합니다.

다음은 결과 6을 보여줍니다.

SELECT ' 05.05 '+'.95';

MySQL의 문자열 연결에는 CONCAT () 함수가 필요하므로 여기에 모호성이 없으며 MySQL은 문자열을 부동 소수점으로 변환하고 함께 추가합니다.

실제로 초기 쿼리가 작동하지 않은 이유는 $ points 변수가 실제로 사용자의 현재 포인트로 설정되지 않았기 때문일 가능성이 높습니다. 0으로 설정되었거나 설정되지 않았습니다. MySQL은 빈 문자열을 0으로 캐스팅합니다. 설명을 위해 다음은 0을 반환합니다.

SELECT ABS('');

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


답변

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


답변

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

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


답변

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


답변

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