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

144

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

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

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

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

Карем
источник
2
У меня была аналогичная проблема, когда я понял, что тип поля по умолчанию - «NULL», изменил его на 0, и все было хорошо.
Azmeer 01

Ответы:

333

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

mysql_query("
    UPDATE member_profile 
    SET points = points + 1
    WHERE user_id = '".$userid."'
");
Томас Маркаускас
источник
59
@Steve, ваш комментарий может показаться умным для кого-то, кто знает, что такое PDO, но для меня, который только ныряет в PHP / MySQL, он не проливает много света на этот вопрос. Делает ли PDO этот код меньше или более элегантным? Если да, отредактируйте ответ или опубликуйте свой собственный, где вы покажете, как лучше работать с PDO. Спасибо.
Камило Мартин
5
@CamiloMartin Мне тоже было любопытно. Я нашел этот полезный net.tutsplus.com/tutorials/php/…
Пи Джей Брюнет
11
@CamiloMartin на странице руководств php.net для mysql_query есть следующее примечание: Это расширение устарело с PHP 5.5.0 и будет удалено в будущем. Вместо этого следует использовать расширение MySQLi или PDO_MySQL . См. Также MySQL: выбор руководства по API и связанные часто задаваемые вопросы для получения дополнительной информации.
aland
10
Объединение пользовательских данных в SQL-запрос представляет собой серьезный риск внедрения SQL-кода.
trognanders
1
@bigp: Я попробовал, UPDATE xyz SET points = MIN(points + 1, YOUR_LIMIT_VALUE_HERE)но ничего не вышло . Что работы было: UPDATE xyz SET points = points + 1 WHERE points < YOUR_LIMIT_VALUE_HERE.
Jealie
23

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

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

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

Даан
источник
10

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

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

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

SELECT ' 05.05 '+'.95';

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

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

SELECT ABS('');

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

user272563
источник
+1 compton очень хорошие моменты, вы правы насчет работы актеров, будь то цитаты или нет. Добро пожаловать в SO!
Pekka
7
"UPDATE member_profile SET points = points + 1 WHERE user_id = '".$userid."'"
Марк Байерс
источник
1
что, если бы я использовал переменную вместо value = 1? я должен сделать это таким образом "точки = точки + $ переменная"? или «points = points + '$ variable'»
Иво Сан,
7

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

update dbo.test set foo=CONCAT(foo, 'bar') where 1=1
бушконст
источник
3

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

Родольфо Соуза
источник
2

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

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

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

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

Амиршк
источник
-2

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

"UPDATE member_profile SET points= ' ". ($points+1) ." '  WHERE user_id = '".$userid."'"
Петр Пеллер
источник
7
Хороший момент, но будьте осторожны в параллельной среде, так как значение DB за это время могло измениться.
Винсент Никкелен
1
Спасибо @VincentNikkelen, вы попали в точку. Параллелизм!
Джимми Иленлоа
1
Если вы используете этот метод, вы должны сначала ВЫБРАТЬ данные, что означает дополнительный доступ к строке. Это не выход, если вам просто нужно обновить значение.
Andres SK