Значение приращения в запросе обновления mysql

Я сделал этот код для выделения +1 точки, но он не работает должным образом.

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

переменная $points - это точки пользователя прямо сейчас. Я хочу, чтобы она была плюс к ней. Например, если у него было 5 баллов, это должно быть 5 + 1 = 6.. , но он не делает, он просто меняется на 1

Что я сделал не так? спасибо

Ответ 1

Вы также можете просто сделать это:

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

Ответ 2

Вы можете сделать это, не запрашивая фактическое количество баллов, поэтому он сохранит вам время и ресурсы во время выполнения script.

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

Иначе вы ошибаетесь в том, что вы передали старое количество очков в виде строки (points='5'+1), и вы не можете добавить число в строку.;)

Ответ 3

Надеюсь, что я не стану оффтопиком в своем первом сообщении, но мне хотелось бы немного рассказать о том, как отличать целое число, поскольку некоторые респонденты, похоже, ошибаются.

Поскольку выражение в этом запросе использует арифметический оператор (символ плюс +), MySQL будет преобразовывать любые строки в выражение в числа.

Чтобы продемонстрировать, следующее приведет к результату 6:

SELECT ' 05.05 '+'.95';

Конкатенация строк в MySQL требует функции CONCAT(), поэтому здесь нет никакой двусмысленности, и MySQL преобразует строки в float и добавляет их вместе.

Я действительно думаю, что причина, по которой исходный запрос не работал, скорее всего потому, что переменная $points не была фактически установлена ​​на текущие точки пользователя. Он был либо установлен на ноль, либо был отменен: MySQL будет пустить пустую строку в ноль. Для иллюстрации следующее возвращается 0:

SELECT ABS('');

Как я уже сказал, я надеюсь, что я не слишком не по теме. Я согласен с тем, что у Daan и Tomas есть лучшие решения для этой конкретной проблемы.

Ответ 4

Кроме того, для строки "increment" при обновлении используйте CONCAT

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

Ответ 5

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

Ответ 6

Кому нужно обновить строку и цифры SET @a = 0; UPDATE obj_disposition SET CODE = CONCAT('CD_', @a:[email protected]+1);

Ответ 7

Удалите ' вокруг point:

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

Вы "бросаете" целочисленное значение в строку в исходном запросе...

Ответ 8

Почему бы вам не позволить PHP выполнять эту работу?

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

Ответ 9

Вы должны использовать PDO для предотвращения риска SQL-инъекции.

Вы можете подключиться к БД следующим образом:

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

Не нужно запрашивать БД для получения количества точек. Вы можете инкрементировать непосредственно в запросе обновления (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
));