Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: UPDATE неправильно отрабатывает
 
 автор: morozmoroz   (20.09.2012 в 18:28)   письмо автору
 
 

Есть запрос


$s1 ="SELECT nakop,date FROM tab WHERE date>$enddate  ORDER BY s_id,date ";
 $s = mysql_query($s1) or die ('Нет связи с сервером. ' .mysql_error());while($val = mysql_fetch_array($sbt));
while($val = mysql_fetch_array($s))
  {
    .........
     $n=$n=+$val['nakop'];
     $s = mysql_query(" UPDATE tab SET  nakop='$n' WHERE date>$enddate  ");
    ........
 }



Мне надо в цикле заменить в запросе поле nakop на накопительные данные ,сформированные в переменной $n для всех строк,у которых дата больше выбранной даты $enddate (из первого запроса)

спасибо.

  Ответить  
 
 автор: confirm   (20.09.2012 в 20:58)   письмо автору
 
   для: morozmoroz   (20.09.2012 в 18:28)
 

А это что такое while($val = mysql_fetch_array($sbt)); ?
А не один ли единственный запрос вам нужен, если я правильно понимаю чего надо?

  Ответить  
 
 автор: morozmoroz   (20.09.2012 в 21:01)   письмо автору
 
   для: confirm   (20.09.2012 в 20:58)
 

Я корректировала запрос-из большого делала меньший для форума.
while($val = mysql_fetch_array($sbt)); ?
Это лишнее,случайно оставила.

  Ответить  
 
 автор: confirm   (20.09.2012 в 21:10)   письмо автору
 
   для: morozmoroz   (20.09.2012 в 21:01)
 

$n=$n=+$val['nakop']; - это не понятно в цикле (видимо тоже лишняя $n затесалась, и операторы перепутаны), но даже правильная запись:
$n += $val['nakop'];
лишена смысла - изначально $n у вас равна hull.

Если я правильно понимаю, то вам надо в таблице tab увеличить значение поля на значение взятое из другой таблицы, у которых дата больше некоторой?

  Ответить  
 
 автор: morozmoroz   (20.09.2012 в 21:20)   письмо автору
 
   для: confirm   (20.09.2012 в 21:10)
 

нет.Все происходит в одной таблице.Сначала я согласно выбранной дате из календаря высчитываю значение определенного поля.

$n=$n+$val['nakop'];

А потом я изменяю значение поля nakop во всех датах,больших за выбранную дату .Это будет в цикле.

Если сделать все что я писала за определенный день,то все получается.А мне надо сделать в таблице для дат>вібранной даты

  Ответить  
 
 автор: confirm   (20.09.2012 в 21:42)   письмо автору
 
   для: morozmoroz   (20.09.2012 в 21:20)
 

Вы сперва вот эту строку отдельно выполните:
$n=$n+$val['nakop'];
Сначала вы получите предупреждение, что переменной $n не существует и ваше первое обновление ни с чем не будет просуммировано. А вот при каждом следующем проходе к нему будет добавляться новые значения полученные ранее из запроса. Например, запрос вернул вам значения 2, 3, 4, 5. Тогда в обновление уйдут значения 2, 5, 9, 14. Это вам и надо?

  Ответить  
 
 автор: morozmoroz   (20.09.2012 в 21:49)   письмо автору
 
   для: confirm   (20.09.2012 в 21:42)
 

поймите,я упрощала запрос.И эта переменная у меня объявлена с присвоением нуля ранее .

  Ответить  
 
 автор: morozmoroz   (20.09.2012 в 21:50)   письмо автору
 
   для: morozmoroz   (20.09.2012 в 21:49)
 

ведь там стоит многоточие-это и значит что опущены действия.Я выбрала самое необходимое и упростила.

  Ответить  
 
 автор: confirm   (20.09.2012 в 22:00)   письмо автору
 
   для: morozmoroz   (20.09.2012 в 21:50)
 

Да я не об этом спрашиваю, что там за многоточиями, я пытаюсь выяснить "по каким правилам" происходит обновление поля.
Например, есть некое поле, которое я буду "накапливать", но на фиксированную величину, например 5. Тогда я пишу: SET val=val+5.
Или, как я понимаю, что вы и хотите сделать, это к существующему значению этого поля, добавить его же значение: SET val=val+val.
Вы ведь его получаете, затем суммируете, НО... Вы отдельно просто запустите цикл массива, например 1,2,3,4 и посмотрите что будет происходить со значением N в цикле, если вы его будете суммировать. А получиться следующее: 1, 3, 6, 10.
Тогда получается, если вы получили эти значения из базы, и пусть все соответствуют условию, что больше даты, тогда ваши поля обновляться именно на эти значения: 1, 3, 6, 10.
Понимаете о чем я спрашиваю?

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

  Ответить  
 
 автор: Sfinks   (20.09.2012 в 22:03)   письмо автору
 
   для: morozmoroz   (20.09.2012 в 18:28)
 

вообще, запрос в цикле - это очень плохо!
И я сомневаюсь, что без цикла нельзя обойтись.
Вы бы описали полностью задачу, а не спрашивали, как исправить кусок кода, к которому вместо многоточий еще неизвестно что прилеплено и неизвестно какие ошибки дает или может давать.
А пока вообще не понятно в чем вопрос. У вас что написано в вопросе, то и в коде написано.
Проблема в чем?
Ну разве что $enddate в кавычки нужно взять, а у '$n' убрать кавычки.

  Ответить  
 
 автор: morozmoroz   (20.09.2012 в 22:21)   письмо автору
 
   для: Sfinks   (20.09.2012 в 22:03)
 


$n=0;
$s1 ="SELECT ar,nakop,date FROM tab WHERE date>$enddate ORDER BY s_id,date ";
 $s = mysql_query($s1) or die ('Нет связи с сервером. ' .mysql_error());
        while($val = mysql_fetch_array($s));
 {
 .........
 $n=$n+$val['ar''];
 $s = mysql_query(" UPDATE tab SET nakop='$n' WHERE date>$enddate ");
 ........
 }

Попытаюсь объяснить.Есть ежедневные данные (ar) и накопительные данные с начала месяца(nakop). в таблице Выбрали дату (enddate) и по ней откорректировали накопительніе данные-nakop(так бывает..) и теперь надо откорректировать все остальные nakop для всех дат больших за выбранную дату,а для этого надо прибавлять ежедневно к этому nakop значение поля ar и записівать в поле nakop.

  Ответить  
 
 автор: confirm   (20.09.2012 в 22:26)   письмо автору
 
   для: morozmoroz   (20.09.2012 в 22:21)
 

Я вам пытаюсь объяснить, что у вас непонятно, что твориться в запросе, а вы бросаетесь с объяснениями от поста до поста.
UPDATE tab SET nakop='$n' WHERE date>$enddate - без конкретно для какой записи, сначала всем записям удовлетворяющим date>$enddate текущее значение $n, затем опять всем записям удовлетворяющим date>$enddate следующее значение $n, и так в течении цикла вашего. Причем с нарастающим суммированием не понятно по какому закону.

Это вы понимаете?

  Ответить  
 
 автор: morozmoroz   (20.09.2012 в 22:34)   письмо автору
 
   для: confirm   (20.09.2012 в 22:26)
 

Я,НАВЕРНОЕ,не понимаю.Да,так и получилось,что у меня в таблице поменялись все nakop на последнее значение за все дни.НО на экран я выводила-все правильно формируется в переменной $n.

  Ответить  
 
 автор: confirm   (20.09.2012 в 22:40)   письмо автору
 
   для: morozmoroz   (20.09.2012 в 22:34)
 

Вы можете без $n += чего-то... объяснить по какому принципу должно происходить обновление поля? Возможно ведь, что вам нужен будет всего лишь один единственный запрос на обновление, без всякой выборки предшествующей и тем более запросов в цикле.
Для этого вас и просят - объясните, напишите.

Если же для каждой из записи, новое значение, это нечто уникальное, которое не описывается единой для всех полей формулой, тогда да - выбрали, посчитали, в цикле обновляем. Но обновлять то надо с учетом ID, а не времени. Так как вы предварительный запрос (выборку) уже сделали по этому условию, а обновлять уже надо по конкретному id.

PS. На экран вы выводили, надо полагать $n, вот и казалось, что правильно, а что в это время в базе происходило, осталось за кадром, хотя и так понятно, что не то, что хотелось бы.

  Ответить  
 
 автор: morozmoroz   (20.09.2012 в 22:41)   письмо автору
 
   для: morozmoroz   (20.09.2012 в 22:34)
 

Попробую сделать тогда вместо всего того,что писала так

$s = mysql_query(" UPDATE tab SET nakop=nakop+ar WHERE date>$enddate "); 

  Ответить  
 
 автор: confirm   (20.09.2012 в 22:44)   письмо автору
 
   для: morozmoroz   (20.09.2012 в 22:41)
 

Если nakop+ar, это и есть формула обновления значений и для всех полей одна и та же, то именно так и надо делать - одним запросом.

  Ответить  
 
 автор: morozmoroz   (20.09.2012 в 22:51)   письмо автору
 
   для: morozmoroz   (20.09.2012 в 22:41)
 

я писала,но Вы не поняли.

ar nakop date
10 100 17/09/2012
20 120 18/09/2012
30 150 19/09/2012

а теперь,допустим,17/09 изменили значение nakop на 250

значит,надо поменять ВСЕ nakop

ar nakop date
10 250 17/09/2012
20 270 18/09/2012
30 300 19/09/2012

т.е. надо к откорректированному nakop прибавлять ar и записать в таблицу в поле nakop и так каждый день

  Ответить  
 
 автор: confirm   (20.09.2012 в 22:55)   письмо автору
 
   для: morozmoroz   (20.09.2012 в 22:51)
 

То есть, в данном примере, увеличили значение на 150. Ну и делайте запрос добавляя 150 к значению этих полей. Вот только причем тут ar, я не понял.

  Ответить  
 
 автор: morozmoroz   (20.09.2012 в 22:56)   письмо автору
 
   для: morozmoroz   (20.09.2012 в 22:51)
 

но только nakop берется за предыдущий день,a ar берется за текущий день суммируются и записывается это значение в поле nakop текущего дня.

  Ответить  
 
 автор: morozmoroz   (20.09.2012 в 22:59)   письмо автору
 
   для: morozmoroz   (20.09.2012 в 22:56)
 

nakop-накопительные данные,ar- приход ежедневный.Вот и суммируем ,накапливаем эти данные.Иначе никак.

  Ответить  
 
 автор: confirm   (20.09.2012 в 23:06)   письмо автору
 
   для: morozmoroz   (20.09.2012 в 22:56)
 

По примеру выше я не заметил, чтобы ar суммировалось к полю nakop (по результату значений не видно). Но в общем, если вы знаете, что к чему прибавить, то и проблем нет. Единственно, что вы можете не знать, так это на какую величину увеличить. Но вы ведь знаете, что эта величина для всех полей одна и та же, значит два варианта:

а) новая величина (после которой требуется коррекция) это добавление значения N к существующему. Пусть это как и в примере будет 150. Тогда нужно сразу добавлять ее всем полям этой даты:

UPDATE tab SET nakop=nakop+150 WHERE date>$enddate

б) новая величина, это значение N, которым заменили запись М, и опять как в примере, пусть будет для поля первого и равна 250. В этом случае, прежде чем ее заменить на новое значение, нужно получить старое (100), затем получить величину корректировки (250-100=150), и уже затем для всех записей как и ранее.

Как у вас все это происходит, я не знаю, но вам то все известно, значит и карты в руки.

  Ответить  
 
 автор: morozmoroz   (20.09.2012 в 23:09)   письмо автору
 
   для: confirm   (20.09.2012 в 23:06)
 

Спасибо.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования