Значення приросту в запиті на оновлення mysql


139

Я створив цей код, щоб виділити +1 бал, але він не працює належним чином.

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

змінна $ балів - це пункти користувача зараз. Я хочу, щоб він додав плюс один до нього .. тому, наприклад, якщо він мав 5 балів, він повинен бути 5 + 1 = 6 .. але це не так, він просто змінюється до 1

Що я зробив неправильно? спасибі


2
У мене була подібна проблема, тоді я зрозумів, що типовим типом поля є "NULL", змінив його на 0 і все було добре.
Азмер

Відповіді:


323

Ви також можете це зробити:

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

59
@Вкажіть ваш коментар може здатися розумним для того, хто знає, що таке PDO, але для мене, хто просто занурюється в PHP / MySQL, він насправді не просвічує багато світла в цьому питанні. Чи робить PDO цей код меншим чи більш елегантним? Якщо це так, будь ласка, відредагуйте відповідь або опублікуйте один із них, де ви покажете, як краще із PDO. Дякую.
Каміло Мартін

5
@CamiloMartin Мені теж було цікаво. Я вважаю це корисним net.tutsplus.com/tutorials/php/…
PJ Brunet

11
@CamiloMartin Сторінка керівництва php.net для mysql_query має наступне зауваження: Це розширення застаріло на PHP 5.5.0, і воно буде видалено в майбутньому. Натомість слід використовувати розширення MySQLi або PDO_MySQL . Дивіться також MySQL: вибір керівництва по API та пов'язані поширені запитання для отримання додаткової інформації.
аланд

9
Об'єднання даних користувачів, продемонстрованих у SQL-запиті, є головним ризиком введення SQL.
трогнандри

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.
Джалі

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 перетворює рядки в плаваючі та додає їх разом.

Насправді я думаю, що причина, по якій початковий запит не працювала, є найімовірнішою тому, що змінна $ очок насправді не була встановлена ​​на поточні точки користувача. Він був або встановлений в нуль, або був встановлений без налаштування: MySQL видасть порожню рядок до нуля. Для ілюстрації наступне поверне 0:

SELECT ABS('');

Як я вже сказав, я сподіваюся, що я не надто поза темою. Я згоден, що Даан і Томаш мають найкращі рішення для цієї конкретної проблеми.


+1 компінуйте дуже хороші бали, ви праві щодо роботи в ролях, будьте цитати чи ні. Ласкаво просимо до SO!
Pekka

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

1
що робити, якщо я використовував змінну замість значення = 1? я повинен це зробити так: "пункти = очки + $ змінна"? або "бали = бали +" $ змінна ""
Іво Сан

7

Також для "збільшення" рядка під час оновлення використовуйте CONCAT

update dbo.test set foo=CONCAT(foo, 'bar') where 1=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
Добре, але будьте обережні у паралельному середовищі, оскільки значення БД могло змінитися тим часом.
Вінсент Ніккелен

1
Спасибі @VincentNikkelen, ти вдарив цвях по голові. Паралельність!
Джиммі Іленлоа

1
Якщо ви використовуєте цей метод, слід спочатку ВИБІРИТИ дані, що означає додатковий доступ до рядка. Це не шлях, якщо вам просто потрібно оновити значення.
Андрес СК
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.