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


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

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

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

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

9 108

9 ответов:

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

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), и вы не можете добавить номер в строку. ;)

надеюсь, что я не собираюсь оффтопировать свой первый пост, но я хотел бы немного расширить кастинг integer to string, поскольку некоторые респонденты, похоже, ошибаются.

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

SELECT ' 05.05 '+'.95';

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

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

SELECT ABS('');

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

кроме того, чтобы" увеличить " строку, при обновлении используйте CONCAT

update dbo.test set foo=CONCAT(foo, 'bar') where 1=1
"UPDATE member_profile SET points = points + 1 WHERE user_id = '".$userid."'"

кому нужно обновить строку и числа SET @a = 0; UPDATE obj_disposition SET CODE = CONCAT('CD_', @a:=@a+1);

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

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

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

вы должны использовать 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
));

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

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