Проблема с циклом и БД

DJ_Deni

Новичок
Проблема с циклом и БД

PHP:
for ($i = 1; $i <= $maxid; $i++)
   {
$ath = mysql_query("select * from bd WHERE id='$i';");
$author = mysql_fetch_array($ath);


if($author[last]<date(d)) {
$frag = false;
echo "Абонент <font color=green>ID=", $author[id], "</font> просрочен и подлежит обновлению!<br>";
$newmoney = $author[money]-$author[abon];
$cid = $author[id];
$newlast = date(d);
$fid = $author[idVN];
echo "У абонента на счету: ", $author[money], "<br>";
echo "Абонплата составляет: ", $author[abon], "<br>";
echo "Новое состояние счета (без учета трафика): ", $newmoney, "<br>";


#ОБРАЩАЕМСЯ ЗА ИНФОЙ ПО ТРАФИКУ
$ath2 = mysql_query("select * from traff WHERE filterid='$fid' order by ts desc limit 1;");
$author2 = mysql_fetch_array($ath2);


if($author2[recv]>$author2[sent]) {
$morg = $author2[recv]/1000000;
echo "Выработано трафика: ", $morg, "Mb<br>";
echo "Стоимость за трафик: ", $morg*$author[mbcost], "<br>";
$newmoneyfinal = $newmoney-$morg*$author[mbcost];
echo "<b>Новое, абсолютное состояние счета: ", $newmoneyfinal, "</b><br><hr><BR>";

}


#/ОБРАЩАЕМСЯ ЗА ИНФОЙ ПО ТРАФИКУ



mysql_query("UPDATE bd SET money='$newmoneyfinal', last='$newlast' WHERE id='$cid'");
}
Все нормально, пока if($author2[recv]>$author2[sent]) верно лишь один раз за весь цикл. Если условие верно хотябы дважды, скрипт превращается в бесконечный. Т.е загрузка страницы длится бесконечно.

Больное место: echo "У абонента на счету: ", $author[money], "<br>";

Если убрать $author[money] все работает, но скрипт теряет смысл :)

Как я понял, словами - проблема возникает при обращении к элеметам массива два раза подряд.

В чем проблема и как исправить?
 

ZN

Новичок
а почему не выбрать всё одним запросом?
что-то типа
SELECT * FROM bd
LEFT JOIN traff ON bd.idVN=traff.filterid
ORDER BY ...
 

DJ_Deni

Новичок
Не силен в SQL. Знаю лишь основы.

Гдето в программе была проблема и я её решал, при этом обязательно надо было использовать такой вариант запроса.

Лучше подскажи что конкретно тут неправильно.
 

ZN

Новичок
{ встречается три раза, а } - два
не совсем понятно где какой блок заканчивается
 

Dreammaker

***=Ф=***
Многа букав ниасилил :)

А если серъёзно.. код делает много лишнего. Первый цикловый запрос, можно сделать и одним, без цикла. Возможно, если подумать то и второй можно отправить туда же.. или сделать отдельным одним запросом.

А так, если не думать :) , вынести в цикл только второй запрос.

Далее автоматом можно сгенерить запрос для апдейта.

Сие упростит немного роботу и спасёт систему от тормозов при значительном количестве клиентов.

Кроме того, синтаксис немного непривычный. и при включенных ворнингах, скорее всего, сильно матерится..

Ладно, по самой теме вопроса.. Как данная строка может влиять на зацикливание покрыто тайной.
попробуй записать его "по-человечески" :))



echo "У абонента на счету: ".$author['money']."<br>";

Хотя, по идее, никак влиять не должно..

update: пока писал уже кто-то подумал, как объединиь в два запроса. Кстати, что такое date(d)?
 

Hugo Borz

Новичок
А где у тебя переменная $maxid получает какое не будь значение? Скорее всего именно там и нужно искать проблему …
 

DJ_Deni

Новичок
Dreammaker
date(d) - день в месяце. Сегодня, например, вернет 15 :)


Hugo Borz
выше - получает. я кусок кода привел.

Сейчас попробую то, что посоветовал Dreammaker
 

Dreammaker

***=Ф=***
>date(d) - день в месяце. Сегодня, например, вернет 15

у меня вернуло
Notice: Use of undefined constant d - assumed 'd' in...

вот почему я спрашивал.. :)
 
Сверху