source

MySQL 업데이트 쿼리의 값 증가

itover 2022. 12. 1. 21:31
반응형

MySQL 업데이트 쿼리의 값 증가

+1 포인트 부여용 코드를 만들었습니다만, 제대로 동작하지 않습니다.

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

$pointsvariable은 현재 사용자의 포인트입니다.거기에 하나를 더했으면 좋겠어요.따라서 예를 들어 5개의 점이 있다면 5+1 = 6이어야 하지만 그렇지 않고 1로 바뀝니다.

제가 무엇을 잘못했지요?

데이터베이스에 이미 존재하는 값을 단순히 증가시킵니다.

$sql = "UPDATE member_profile SET points = points + 1 WHERE user_id = ?";
$db->prepare($sql)->execute([$userid]);

이 코드는 최신 PHP 버전에서 PDO와 mysqli 모두에서 작동합니다.

이를 통해 실제 포인트 수를 조회할 필요 없이 스크립트 실행 중 시간과 리소스를 절약할 수 있습니다.

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

첫 번째 투고에서 주제에서 벗어나지 않기를 바라지만, 일부 응답자가 잘못 알고 있는 것처럼 보이므로 문자열에 정수 캐스팅에 대해 조금 더 자세히 설명하겠습니다.

이 쿼리의 식은 산술 연산자(+ 기호 +)를 사용하기 때문에 MySQL은 식에 포함된 문자열을 숫자로 변환합니다.

다음을 통해 결과 6을 확인할 수 있습니다.

SELECT ' 05.05 '+'.95';

MySQL에서 문자열을 연결하려면 CONCAT() 함수가 필요하므로 여기에서 모호함이 없으며 MySQL은 문자열을 플로트로 변환하여 함께 추가합니다.

$points 변수가 사용자의 현재 포인트로 설정되지 않았기 때문에 초기 쿼리가 작동하지 않았던 것이 가장 큰 원인이라고 생각합니다.0으로 설정되었거나 설정 해제되었습니다.MySQL은 빈 문자열을 0으로 캐스팅합니다.예를 들어, 다음은 0을 반환합니다.

SELECT ABS('');

말씀드렸듯이, 제가 주제에서 너무 벗어난 게 아니길 바랍니다.나는 Daan과 Tomas가 이 특정한 문제에 대한 최선의 해결책을 가지고 있다는 것에 동의한다.

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

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

승인된 답변은 양호하지만 null 값으로 작동하지 않는 경우 다음을 수행하십시오.

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

상세 정보IFNULL

문자열 및 번호를 업데이트해야 하는 사용자

SET @a = 0;
UPDATE obj_disposition SET CODE = CONCAT('CD_', @a:=@a+1);

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

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

$pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
$bdd = new PDO('mysql:host=xxxx;dbname=xxxx;charset=utf8mb4', 'user', 'password', $pdo_options);

포인트 수를 얻기 위해 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
));

를제 remove remove remove를 remove remove 를 remove 。'point:

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

원래 쿼리의 문자열에 정수 값을 "캐스팅"하고 있습니다.

왜 PHP가 그 일을 하게 두지 않는 거죠?

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

언급URL : https://stackoverflow.com/questions/2259155/increment-value-in-mysql-update-query

반응형