[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: При запросе не все записи
Гость_@Fetch
Всем привет, Есть записывать много результирующих строк в текстовый файл, файл пишется с до писанием строки вниз
fopen($cdrfile,'a+');
и проходит по циклу из базы
while($row=mysql_fetch_array($result))
но вот например когда строк 1614, то в файл почему то пишется только 1223 строки. Вопрос, как выводить неограниченное число записей?



Спустя 24 минуты, 51 секунда (13.07.2010 - 21:46) Basili4 написал(а):
в мускуле есть возможность выгружать сразу в файл
Select * from tt INTO OUTFILE 'путь//имя файла'

Спустя 3 часа, 5 минут, 9 секунд (14.07.2010 - 00:51) SlavaFr написал(а):
если возможности для INTO OUTFILE нет, то попробуй

set_time_limit(0);

а если сервер этого не позволяет, то прийдется скрипт несколько раз вызывать и посредством limit x,y работать с ограниченым количеством строчек

Спустя 6 часов, 56 минут, 29 секунд (14.07.2010 - 07:48) linker написал(а):
Basili4, хачил я такие мускулы, у которых разрашено иметь доступ к файловой системе. Руки отрывать, извиняюсь, тем кто разрешает использование таких функций базы.
Гость_@Fetch, а нельзя ли подробнее код привести? По двум строчкам всеравно, что гадать на кофейной гуще.

Спустя 34 минуты, 27 секунд (14.07.2010 - 08:22) Basili4 написал(а):
linker
а программируя на пыхе ты наверное не имеешь доступ к файловой системе ???? или без рук ходиш все можно и мускулу можно выгружать и загружать файлы. Тут надо просто думать как это делать. Файлы на сервер вообще опасно позволять загружать и что вообще запретить или руки отрывать тем кто это делает А не дай бог допустить передачу любых параметров в нутрь скрипта это тоже опасно тоже по твой логики руки рвать надо. ИМХО есть возможность, есть благо от использования этой возможности, есть риск, есть средства чтобы этот риск свести к минимуму. Тут надо оценить ситуацию и найти способ как сделать чтоб все было и тебя не хакнули.

Спустя 11 минут, 13 секунд (14.07.2010 - 08:34) linker написал(а):
Basili4, это не благо, это зло, как работать в *nix'е под рутом, или логиниться к мускулу либо рутом, либо с правами рута, как глобальные переменные и прочее. Если ты скриптом принимаешь данные извне, то у тебя есть хотя бы возможность отфильтровать их, а тут дырень, через которую ведро со свистом пролетает. Сомнительное благо.

Спустя 12 минут, 12 секунд (14.07.2010 - 08:46) Basili4 написал(а):
linker
дырень в чем в том что запрос в место того что бы выбирать массив а затем этот массив выгружать на диск сразу пишет на диск. если ты все ровно выгружаешь результат запроса на диск если есть уязвимость то она в любом случае будет

Спустя 6 минут, 15 секунд (14.07.2010 - 08:52) linker написал(а):
Select * from tt INTO OUTFILE 'путь//имя файла'
вместо звездочки любой PHP-код, подумайте чем это пахнет.

Спустя 21 минута, 34 секунды (14.07.2010 - 09:14) Basili4 написал(а):
linker

Как туда попадет любой пхп код ??? открой свой индекс.php и замени свой код на
Цитата (linker @ 14.07.2010 - 09:52)
любой PHP-код, подумайте чем это пахнет.


и теперь подумай чего ты боишся ????? тут вопрос стоиит не в том что нельзя использовать средства mysql для выгрузки инфы а о проверки параметров скрипта. если в параметр будет передаваться только параметр для whereи который будт должным образом принят ни чего не будет а если повалять передавать в скрипт названия полей то это уже дыра внезависимости от того будет ли выгрузка в файл или нет

Спустя 39 минут, 8 секунд (14.07.2010 - 09:53) Guest написал(а):
Спасибо за ответы, но про вариант выгрузки данных сразу с запроса, я вкурсе, и он не подходит, т.к. там с теми данными ещё много расчётов происходит "это биллинг", и ещё несколько под запросов в другие таблицы и т.п., поэтому другого варианта как писать из цикла я не нахожу.

Спустя 1 минута, 37 секунд (14.07.2010 - 09:54) Basili4 написал(а):
тогда только set_time_limit(0); или в эту сторону

Спустя 11 минут, 58 секунд (14.07.2010 - 10:06) @Fetch написал(а):
Попробовал
set_time_limit(0);
не помог. Из реальных 788 строк, вывелось только 582. Чтобы было более понятно, всем кто хочет подсказать, приведу кусок кода:
if(!$_POST[ss]=='alls'){
$result = mysql_query("SELECT * FROM ".$billing_cdr." WHERE disposition LIKE '$disposition$_GET[disposition]%' AND calldate LIKE '$date%' ".$cq." AND src LIKE '$_POST[src]$_GET[src]%' AND dst LIKE '$_POST[dst]$_GET[dst]%' ORDER By calldate DESC LIMIT ".$go.$_GET[go].", ".$default) or die (mysql_error());
}else{
$result = mysql_query("SELECT * FROM ".$billing_cdr." WHERE disposition LIKE '$disposition$_GET[disposition]%' AND calldate LIKE '$date%' ".$cq." AND src LIKE '$_POST[src]$_GET[src]%' AND dst LIKE '$_POST[dst]$_GET[dst]%' LIMIT ".$rows_count) or die (mysql_error());
}
$cdrfile = $_SERVER['DOCUMENT_ROOT'].'/'.$rtag_root_url.'/export/cdr.csv';

if(file_exists($cdrfile)){
unlink($cdrfile);
}

if(!$_POST[ss]=='alls'){
print "<table align=\"center\" width=\"100%\"><tr><td align=\"center\">Количество звонков: ".$rows_count."</td></tr></table>";
print "<table align=\"center\" width=\"100%\">
<tr>
<td align=
\"center\" style=\"border: 1px dotted #CCCCCC\"><b>№</b></td>
<td align=
\"center\" style=\"border: 1px dotted #CCCCCC\"><b>Дата (".$date.")</b></td>
<td align=
\"center\" style=\"border: 1px dotted #CCCCCC\"><b>Источник</b></td>
<td align=
\"center\" style=\"border: 1px dotted #CCCCCC\"><b>Номер</b></td>
<td align=
\"center\" style=\"border: 1px dotted #CCCCCC\"><b>Длительность</b></td>
<td align=
\"center\" style=\"border: 1px dotted #CCCCCC\"></td>
<td align=
\"center\" style=\"border: 1px dotted #CCCCCC\"><b>Направление</b></td>
<td align=
\"center\" style=\"border: 1px dotted #CCCCCC\"><b>Цена</b></td>
<td align=
\"center\" style=\"border: 1px dotted #CCCCCC\"><b>Стоимость</b></td></tr>";
}
mysql_link();
$color = 0;
$count = 1;
while($row = mysql_fetch_array($result)){

$sip = mysql_query("SELECT * FROM ".$sip_users." WHERE callerid=".$row['src']);
if(mysql_num_rows($sip)!=0){
$rsip = mysql_fetch_array($sip);
$account = $rsip['accountcode'];
$cid = $rsip['callerid'];
}
$cid = mysql_query("SELECT * FROM ".$billing_users_cid." WHERE cid=".$row['src']);
if(mysql_num_rows($cid)!=0){
$rcid = mysql_fetch_array($cid);
$account = $rcid['accountcode'];
$cid = $rcid['cid'];
}

if($account!=''){
$clients = mysql_query("SELECT * FROM ".$billing_users." WHERE accountcode=".$account);
$rclients = mysql_fetch_array($clients);
$pid = $rclients['pid'];
$client = $rclients['name'];
}
if($pid.$_GET[pid]!=''){
$qplan = mysql_query("SELECT * FROM ".$billing_plan." WHERE pid=".$pid);
$rplan = mysql_fetch_array($qplan);
$min_d = $rplan['min_d'];
$block = $rplan['block'];
$cur = $rplan['cur'];
}

if($color==1){
$g = " bgcolor=\"#F4F4F4\"";
$color = 0;
}else{
$g = "";
$color = 1;
}
$sum_sec = $sum_sec+$row[billsec];
$minut = floor($row[billsec]/60);
$second = $row[billsec]-$minut*60;
if($minut<10){ $minut = '0'.$minut; }
if($second<10){ $second = '0'.$second; }
if(!$_POST[ss]=='alls'){
print "<tr".$g."><td align=\"center\">";
print $count;
$count = $count+1;
}
if($row[billsec]==0){
if(!$_POST[ss]=='alls'){
print "</td><td align=\"center\">".$row['calldate']."</td>
<td align=
\"center\">".$row['src']."</td>
<td align=
\"center\">".$row['dst']."</td>
<td align=
\"center\">".$minut.":".$second."</td>";
}
}
else{
if(!$_POST[ss]=='alls'){

print "</td><td align=\"center\">".$row['calldate']."</td>
<td align=
\"center\">".$row['src']."</td>
<td align=
\"center\">".$row['dst']."</td>
<td align=
\"center\">".$minut.":".$second."</td>";

$rec_file = $record_dir."/".$row['uniqueid'].".".$record_file_type;
if(file_exists($rec_file)){
print "<td><a href=\"javascript:openwindow('modules/play.php?uniqueid=".$row['uniqueid']."', 320, 170);\"><img src=\"style/b_preplay.png\" title=\"Прослушать\" border=\"0\"></a></td>";
}else{
print "<td width=\"16\"></td>";
}
}

$max_prefix = mysql_query("SELECT MAX(prefix) FROM ".$billing_rates);
$rprefix = mysql_fetch_array($max_prefix);
$max_len_prefix = strlen($rprefix['MAX(prefix)']);

$search_dst_prefix = substr_replace($row['dst'], '', $max_len_prefix);
$start_dst_prefix = $search_dst_prefix;
$finded_prefix = false;

for($i=0;$i<=($max_len_prefix-1);$i++){
$finish_dst_prefix = $start_dst_prefix;
$finish_dst_prefix = substr_replace($finish_dst_prefix, '', $max_len_prefix-$i);
if ($pid.$_GET[pid]!=''){
$p = mysql_query("SELECT * FROM ".$billing_rates." WHERE pid=".$pid);
while($rp = mysql_fetch_array($p)){
if(($rp['prefix']==$finish_dst_prefix)&&($finded_prefix==false)){
$k1 = $min_d/60;
$k2 = $block/60;
$k4 = $row[billsec]-$min_d;

if($k4<=0){
$cost = number_format($k1*$rp[cost],2,',','');
}
elseif($k4>0){
$k3 = ($row[billsec]-$min_d)/$block;
if($k3<1){ $k3 = 1; }
if($k3>1){ $k3 = ceil($k3); }
$cost = number_format($k1*$rp[cost]+$k2*$rp[cost]*$k3,2,',','');

}
$sum_cost = $sum_cost+$cost;
if($_POST[account].$_GET[account]!=''){
$pcur = " ".$cur;
}else{
$pcur = '';
}

$h = fopen($cdrfile,'a+');
$data = $row['src'].";".$row['dst'].";".$minut.":".$second.";".$rp['description'].";".$rp[cost].";".$cost."\r\n";
fputs($h,$data);
fclose($h);

if(!$_POST[ss]=='alls'){
print "<td align=\"center\">".$rp['description']."</td><td align=\"center\">".$rp[cost]."</td><td align=\"center\">".$cost."</td></tr>";

}
$finded_prefix=true;
}

}

}


}

}

}


$sum_hour = floor($sum_sec/3600);
$sum_second = $sum_sec-$sum_hour*3600;
$sum_minut = floor($sum_second/60);
$all_minut = floor($sum_sec/60);
$all_second = $sum_second-$sum_minut*60;
if($sum_hour<10){ $sum_hour = '0'.$sum_hour; }
if($sum_minut<10){ $sum_minut = '0'.$sum_minut; }
if($all_second<10){ $all_second = '0'.$all_second; }

if($_POST[ss]=='alls'){
if(!$date==''){ $date = $date; }else{ $date = '0000-00-00'; }
print "<table align=\"center\" width=\"100%\"><tr><td align=\"center\" style=\"border: 1px dotted #CCCCCC\"><b>Дата</b></td><td align=\"center\" style=\"border: 1px dotted #CCCCCC\"><b>Количество звонков</b></td><td align=\"center\" style=\"border: 1px dotted #CCCCCC\"><b>Общая продолжительность</b></td><td align=\"center\" style=\"border: 1px dotted #CCCCCC\"><b>Сумма</b></td><td></td></tr>
<tr><td align=
\"center\">".$date."</td><td align=\"center\">".$rows_count."</td><td align=\"center\">".$all_minut." мин. / ".$sum_hour." час. ".$sum_minut." мин. ".$all_second." сек.</td><td align=\"center\">".number_format($sum_cost,2,',','').$pcur."</td><td><a href=\"modules/export.php?date=".$date."\"><img src=\"style/export_csv.png\" title=\"Экспорт биллинговой статистики в CSV файл\" border=\"0\"></a></td></tr>";
}
print "</table>";


if(!$_POST[ss]=='alls'){
print "<hr size=\"1\"><table width=\"300\" align=\"right\"><tr><td align=\"center\" style=\"border: 1px dotted #CCCCCC\"><b>Общая продолжительность</b></td><td align=\"center\" style=\"border: 1px dotted #CCCCCC\"><b>Сумма</b></td><td></td></tr>
<tr><td align=
\"center\">".$sum_hour.":".$sum_minut.":".$all_second."</td><td align=\"center\">".number_format($sum_cost,2,',','').$pcur."</td><td><a href=\"modules/export.php?date=".$date."\"><img src=\"style/export_csv.png\" title=\"Экспорт биллинговой статистики в CSV файл\" border=\"0\"></a></td></tr></table>";
if($default == $list_count){

print "<center><a title=\"Предыдущая\" href=\"?module=billing&show=cdr&sql=select&src=".$_POST['src'].$_GET['src']."&dst=".$_POST['dst'].$_GET['dst']."&date=".$date."&account=".$_POST[account].$_GET[account]."&disposition=".$disposition.$_GET['disposition']."&go=".$last."\"><b>«</b></a>&nbsp<a title=\"Следующая\" href=\"?module=billing&show=cdr&sql=select&src=".$_POST['src'].$_GET['src']."&dst=".$_POST['dst'].$_GET['dst']."&date=".$date."&account=".$_POST[account].$_GET[account]."&disposition=".$disposition.$_GET['disposition']."&go=".$next."\"><b>»</b></a></center>";
}
}


mysql_free_result($result);


т.е. файл пишется по одной строке в цикле while, этим кодом

				$h = fopen($cdrfile,'a+');
$data = $row['src'].";".$row['dst'].";".$minut.":".$second.";".$rp['description'].";".$rp[cost].";".$cost."\r\n";
fputs($h,$data);
fclose($h);


да тут даже дело ни в записи файла, если просто выводить записи на страницу, то будет тоже самое.

Спустя 36 минут, 35 секунд (14.07.2010 - 10:43) sergeiss написал(а):
Цитата (@Fetch @ 14.07.2010 - 11:06)
да тут даже дело ни в записи файла, если просто выводить записи на страницу, то будет тоже самое.

А почему ты тогда про файл спрашиваешь? Надо смотреть логику работы, всякие ИФы что дают.
Но в приведенной "портянке" текста сидеть и разбираться кто будет, как ты думаешь?

Спустя 5 часов, 22 минуты, 16 секунд (14.07.2010 - 16:05) @Fetch написал(а):
Меня интересует, что может ограничивать число вывода строк в цикле, что то не успевает или что, интересует опыт людей, я не поверю, что такой вопрос возник только у меня, наверняка люди пишут подобные скрипты.

Спустя 9 минут, 4 секунды (14.07.2010 - 16:14) sergeiss написал(а):
Я же тебе сказал уже: разбирайся с логикой!!! У тебя как-то "брутально" сделано, и не понятно многое.

Ну например. Что означает, по-твоему, такое условие if(!$_POST[ss]=='alls')???

// А вот эту конструкцию, если уж очень хочется именно в таком виде получить информацию, 
$minut = floor($row[billsec]/60); if($minut<10){ $minut = '0'.$minut;

// лучше написать так (хотя суть этого преобразования я так и не понял smile.gif):
$minut=sprintf( "%02d", floor($row[billsec]/60) );


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

Спустя 2 часа, 43 минуты, 26 секунд (14.07.2010 - 18:58) @Fetch написал(а):
Для начало if(!$_POST[ss]=='alls') означает, что если переменная ss не равна значению alls, то выполняем условие. Данные присылаются с формы. С логикой? это было бы понятно если бы что то не работало, но всё работает, до определённого числа записей, да даже и с логикой, если бы мне было ясно, что именно мешает я бы не стал спрашивать у других.

Спустя 3 минуты, 37 секунд (14.07.2010 - 19:01) sergeiss написал(а):
Цитата (@Fetch @ 14.07.2010 - 19:58)
если переменная ss не равна значению alls

Только у тебя не переменная ss, а элемент глобального массива $_POST с индексом ss. Ты это же имел ввиду или какую-то отдельную переменную?

Это условие пишется по-другому: if( $_POST[ss] !='alls' ). Почему я тебе и говорю про логику - у тебя условия не верные, типа только что показанного. Соответственно, логика выполнения скрипта может сильно отличаться от того, что ты предполагаешь.

Спустя 9 минут, 43 секунды (14.07.2010 - 19:11) @Fetch написал(а):
Ну я же говорю всё правильно работает и выполняется. Грубо говоря, если сделаю 200 таких селектов он отработает нормально, а вот на каком то пороге...

P.S. замечена закономерность, выводится всегда 73% от реального количества записей.

Спустя 24 минуты, 46 секунд (14.07.2010 - 19:36) @Fetch написал(а):
Вопрос снимается, у меня просто там пишутся не все строки, а только те которые подошли под критерии.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.