2012-05-01 4 views
2

Я искал способ экспорта в csv на лету и пришел на это.fopen()/fputcsv(): error

$list = array (
        array('aaa', 'bbb', 'ccc', 'dddd'), 
        array('123', '456', '789'), 
        array('"aaa"', '"bbb"') 
        ); 
    $fp = fopen('path_to_file/file.csv', 'w'); 

    foreach ($list as $fields) { 
     fputcsv($fp, $fields); 
    } 

    fclose($fp); 

Его просто базовый код, взятый со страницы php.net. В любом случае я застрял в нем, чтобы попробовать его, прежде чем использовать его для моих собственных нужд. Но я продолжаю получать следующие ошибки.

PHP Warning: fopen(path_to_file): failed to open stream 
fputcsv() expects parameter 1 to be resource, boolean given 
fclose() expects parameter 1 to be resource, boolean given 

Я не уверен, почему Еореп ошибка() появляется, как я хочу, чтобы просто создать новый файл на лету в любом случае, который был тем, что я думал, что это сделано в любом случае?

Можно ли предположить, что это ошибка разрешения файла?

Также, поскольку im использует точный код на странице php.net, предполагая, что другие ошибки отображаются из-за проблемы fopen().

EDIT.

Кажется, мне лучше разместить дополнительную информацию.

Занятия в классе.

class transData{ 
var $connection; 
var $date; 
var $data; 

function __construct($date){ 
    $this->date = $date; 
    return; 
} 

function getData(){ //this method just pulls the results of the query and returns them as an array 
    global $connection; 
    $date=$this->date; 

    //get num row for each date/fromfile combo, one with the most should be the most uptodate. 
    // count(fromfile) for specific date, one with most will be the most up to date, if more than one then take the one with highest appended int 
    $count=array(); 
    $x=0; 
    $mysqli_result=$connection->query("select fromfile,count(fromfile) from transdata where soldtime like '%".$date."%' group by fromfile"); 
    while($row=$mysqli_result->fetch_row()){ 
     $count[$row[0]]=$row[1]; 
    } 
    $mysqli_result->free(); 
    //got the data in array, now rearrange to get one with highest count 
    arsort($count); 
    $fromFile=key($count); 


    $temp=array(); 
    $x=0; 
    $mysqli_result=$connection->query("select * from transdata where soldtime like '%".$date."%' and fromFile='".$fromFile."' order by soldtime desc"); 
    while($row=$mysqli_result->fetch_row()){ 
     $temp[$x]['id']=$row[0]; 
     $temp[$x]['departure']=$row[1]; 
     $temp[$x]['type']=$row[2]; 
     $temp[$x]['typeText']=$row[3]; 
     $temp[$x]['price']=$row[4]; 
     $temp[$x]['soldTime']=$row[5]; 
     $temp[$x]['dateAdded']=$row[6]; 
     $temp[$x]['fromFile']=$row[7]; 
     $x++; 

    } 
    $this->data = $temp; 
    $mysqli_result->free(); 
    return; 
} 




function dayTotal($noDays){ 
    //$list=array(); 
    $html="<table class=\"paxdata\">"; 

    $html.="<tr><th>Day</th><th>Date</th><th>No. Sold</th><th>Total Price(£)</th><th></th></tr>"; 
    //$list=array('Day','Date','No. Sold','Total Price(£)'); 
    //build list of dates to work with 
    $inc=0; 
    $hours=array();$hours[0]=0;$hours[1]=24;$hours[2]=48;$hours[3]=72;$hours[4]=96;$hours[5]=120;$hours[6]=144;$hours[7]=168; 

    while($inc!=$noDays){ 

     $date=date('Y/n/j',time() - 60 * 60 * $hours[$inc]);  //format for calling class transData() 
     $formatDate=date('Y-m-d',time() - 60 * 60 * $hours[$inc]); //format for displaying date in table 
     $day=date('l',time() - 60 * 60 * $hours[$inc]);    //text day name 

     $link=explode('/',$date); 

     //call to this class to get all the data for us 
     $getData = new transData($date); 
     $all = $getData->getData(); 
     $stuff = $getData->data;   

     $x=0;$price=0; 
     foreach($stuff as $v){ 
      $price=$price+$v['price']; 
      $x++; 

     } 
     $totalSold=$totalSold+$x; 
     $totalPrice=$totalPrice+$price; 

     $checkOdd=new numeric(); 
     $odd=$checkOdd->is_odd($inc); 
     if($odd==1){$html.="<tr class=\"odd\">";}else{$html.="<tr class=\"even\">";} 
     $html.="<td width=\"100px\">".$day."</td><td width=\"100px\">".$formatDate."</td><td>".$x."</td><td>".fixedToFloat($price)."</td><td><a href=\"index.php?module=chooseDate&year=$link[0]&month=$link[1]&day=$link[2]\">More info?</a></td></tr>"; 
     //$list=array($day,$formatDate,$x,$price); 
     $inc++; 
    } 
    $html.="<tr><td></td><th>Totals:</th><th>".$totalSold."</th><th>".fixedToFloat($totalPrice)."</th></tr>"; 
    $html.="</table>"; 
    echo $html; 


    $list = array (
        array('aaa', 'bbb', 'ccc', 'dddd'), 
        array('123', '456', '789'), 
        array('"aaa"', '"bbb"') 
        ); 
    $fp = fopen('~/file.csv', 'w'); 
    if ($fp != false){ 
     foreach ($list as $fields) { 
      fputcsv($fp, $fields); 
     } 
    } 
    fclose($fp); 

} 

    } 

Вызывается этим при помощи браузера.

$date=date('Y/n/j'); 

$getData = new transData($date); 
$all = $getData->getData(); 
$getData->dayTotal(7); 

Ответ в /var/log/system.log

PHP Notice: Undefined variable: totalSold in /Users/me/Sites/KF/sales/specificClasses.php on line 218 
    PHP Notice: Undefined variable: totalPrice in /Users/me/Sites/KF/sales/specificClasses.php on line 219 
    PHP Warning: fopen(~/Sites/KF/file.csv): failed to open stream: No such file or directory in /Users/me/Sites/KF/sales/specificClasses.php on line 238 
    PHP Warning: fclose() expects parameter 1 to be resource, boolean given in /Users/me/Sites/KF/sales/specificClasses.php on line 244 
+0

Является 'path_to_file' действительно в вашем сообщении об ошибке? У вас есть такая директория? – Mat

+0

no path_to_file был просто для иллюстрации того, что существует путь к файлу – cosmicsafari

+0

-1 и голосование закрывается для публикации ** усеченного ** сообщения об ошибке, а ** пропущенная часть содержит фактическое объяснение ** –

ответ

4

От PHP.net Документах для FOPEN:

Возвращаемые значения

Возвраты ресурс указателя файла при успешном выполнении или FALSE при ошибке.

Либо ваш код не может найти «path_to_file/file.csv», либо ваш веб-сервер (или CLI) не имеет разрешения на запись там.

+0

Я пробовал несколько разных мест в папках и имел одинаковые ошибки с каждым. Может быть, это связано с попыткой создать csv, используя запрос браузера? – cosmicsafari

+2

, скорее всего, каталог 'path_to_file' не существует. В то время как 'fopen()' может создавать новые файлы, он не создает новые каталоги. – s1lence

+0

хорошая точка, я предположил, что «path_to_file» - существующая папка – Kousalik

1

Я не знаю ваших точных настроек, но чаще всего это вопрос разрешения. fopen возвращает FALSE, если он не может открыть или создать файл, и это ваша «логическая» проблема. попытаться установить права 777 на папку «path_to_file», а затем попытаться запустить сценарий снова

также вы должны проверить FOPEN возвращаемого значения, прежде чем пытаться манипулировать с файлом, что-то вроде

$fp = fopen('path_to_file/file.csv', 'w'); 
if ($fp != false){ 
    foreach ($list as $fields) { 
     fputcsv($fp, $fields); 
    } 

    fclose($fp); 
} 
+0

Не делайте ставки. Программирование не азартные игры. –

+0

: D: D классный смешной комментарий, но ерунда. Если я получаю доступ к его ftp или везде, где он пытается заставить его работать, я буду на 100% уверен, до тех пор, пока все не смогут просто понять. И, кстати, разрешения не являются проблемой программирования, и именно по этой причине НИКТО нас не может быть на 100% уверенным, пока – Kousalik

+0

Забавный комментарий, но печально неграмотный. Вам не нужен FTP-доступ, но только небольшое знание. Чтобы вы знали, есть вещь, называемая «сообщение об ошибке». Это довольно информативно и недвусмысленно в определении причины ошибки. Итак, программист должен отлаживать, а не играть. Идите фигуру. –