2013-03-11 1 views
1

Вот что у меня есть. Этот код захватывает данные от всех пользователей и вычитает 1 из user_days, а затем обновляет строку user_days каждого пользователя.MYSQL нуждается в помощи потянув данные от каждого «пользователя», используя php

$result = mysqli_query($con,"SELECT * FROM users"); 

while($row = mysqli_fetch_array($result)) 
    { 
    $minusone = $row['user_days']-1; 
    mysqli_query($con,"UPDATE users SET user_days=$minusone"); 
    echo "<br />"; 
    echo $row['user_days']; 
    } 

Проблема у меня такая: Вместо вычитанием 1 из каждого пользователя и обновления каждого поля пользователей, это обновление поля для каждого пользователя со значением от первого пользователя.

пример: перед обновлением пользователя 1 имеет 30 дней пользователя 2 имеет 60 дней

после обновления пользователя 1 имеет 29 дней пользователя 2 имеет 29 дней (вместо 59 дней)

Есть помощь приветствуется, и я надеюсь, что этот вопрос легко понять.

Чтобы уточнить, я хочу обновить каждое поле. Я просто не хочу, чтобы обновления дублировались от первого результата.

Спасибо за все ответы, это оказало мне большую помощь.

+3

Ваш SQL-запрос обновляет все записи. вы должны указать в нем какое-то условие, например: 'update users set user_days = $ minusone, где id ='. '$ row [id]' или что-то еще. Более того, вам не нужно делать это в цикле. Попробуйте что-то вроде 'update users set user_days = user_days-1;' standalone. – varnie

+0

Спасибо, это сработало. –

ответ

0

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

+2

Или даже проще, используйте 'UPDATE пользователей SET user_days = user_days-1' перед тем, как сделать свой выбор –

+0

Выглядит как самый простой и эффективный вариант, спасибо! –

0

Вы должны указать, какая запись в UPDATE

mysqli_query($con,"UPDATE users SET user_days=$minusone WHERE id=XXXXX"); 
0

Проблема заключается с UPDATE заявления. Без предложения WHERE он будет применять предложение SET к каждой строке в базе данных. Если у вас есть уникальный столбец ID с именем id в таблице пользователей, вы можете изменить свой код так:

while($row = mysqli_fetch_array($result)) 
{ 
    $minusone = $row['user_days']-1; 
    $user_id = $row['id']; 
    mysqli_query($con,"UPDATE users SET user_days=$minusone WHERE id=$user_id"); 
    echo "<br />"; 
    echo $row['user_days']; 
} 
3

Почему вы не просто запустить UPDATE users SET user_days = user_days-1 WHERE id=XXXXX? А потом выберите все?

+0

Это хороший, мой голос. – Voitcus

+0

Если это делается для всех пользователей, зачем выполнять n раз для каждого отдельного пользователя, а не просто запускать его один раз для всех пользователей? –

0

Используйте следующий запрос:

mysqli_query($con,"UPDATE users SET user_days=$minusone WHERE user_ID = '".$row['user_ID']."'"); 
+0

Ошибка анализа паролей PHP: ошибка синтаксиса, неожиданный T_ENCAPSED_AND_WHITESPACE, ожидающий T_STRING или T_VARIABLE или T_NUM_STRING –

0

Вы обновление всех пользователей с одинаковым значением $minusone. Вам нужен пункт WHERE в своем заявлении обновления, например:

$result = mysqli_query($con,"SELECT * FROM users"); 

while($row = mysqli_fetch_array($result)) 
    { 
    $minusone = $row['user_days']-1; 
    $id_user = $row['id_user']; 
    mysqli_query($con,"UPDATE users SET user_days=$minusone WHERE id_user = $id_user"); 
    echo "<br />"; 
    echo $row['user_days']; 
    } 

Другой способ делать то, что вы хотите, будет:

... 
$result = mysqli_query($con,"UPDATE users SET user_days = user_days - 1"); 
... 

Это если вы хотите вычитает 1 для всех user_days.

0

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

mysqli_query($con, "UPDATE users SET user_days=user_days-1"); 

Затем вы можете выбрать и отобразить информацию по мере необходимости.

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

Лучшим подходом было бы иметь поле subscriptionExpires в вашей базе данных, в котором будет храниться значение datetime. Используя ваш подход, если работа, выполняющая это сбой, каждый пользователь получит дополнительный день. Что, если веб-паук или пользователь найдет ваш скрипт, ваши учетные записи пользователей истекут раньше. Если вы используете фактическую дату окончания срока действия учетной записи, нет никаких предположений относительно правильности текущего значения.

Смежные вопросы