Значение приращения в запросе на обновление mysql - PullRequest
122 голосов
/ 14 февраля 2010

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

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

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

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

Ответы [ 9 ]

280 голосов
/ 14 февраля 2010

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

mysql_query("
    UPDATE member_profile 
    SET points = points + 1
    WHERE user_id = '".$userid."'
");
20 голосов
/ 14 февраля 2010

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

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

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

10 голосов
/ 14 февраля 2010

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

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

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

SELECT ' 05.05 '+'.95';

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

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

SELECT ABS('');

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

7 голосов
/ 02 апреля 2012

Также, чтобы «увеличить» строку, при обновлении используйте CONCAT

update dbo.test set foo=CONCAT(foo, 'bar') where 1=1
6 голосов
/ 14 февраля 2010
"UPDATE member_profile SET points = points + 1 WHERE user_id = '".$userid."'"
2 голосов
/ 08 ноября 2016

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

1 голос
/ 12 июня 2017

Вы должны использовать 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
));
1 голос
/ 14 февраля 2010

Снимите ' вокруг point:

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

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

0 голосов
/ 14 февраля 2010

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

"UPDATE member_profile SET points= ' ". ($points+1) ." '  WHERE user_id = '".$userid."'"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...