首页 > 解决方案 > fopen() 函数被跳过 - 没有文件被创建 | PHP

问题描述

我已经为此工作了几个星期,但我又一次面临文件问题。这段代码首先获取数据库中存在的所有条目,然后在获取一系列 id 后,启动带有附加WHERE子句的相同查询,以搜索属于客户的特定条目。

最后,比较两个结果数组以搜索数据库中存在但尚未分配给任何客户的任何条目以将它们打印到 csv 文件中,以便启动代码的用户可以处理阻止这些条目链接到客户的问题.

过去我在文件和权限方面遇到了一些问题,但这次没有出现错误,也没有消息提醒我我无权在所需位置或任何地方打开文件。

我试着var_dump()在工作表上插入一些,看看这个过程是否真的达到了fopen()它的目的。它只是跳过它,不创建文件,也不写入数据。

我查看了服务器日志,但一无所获,并且启用了错误和警告。

这将从数据库中获取所有条目。

$stmtOutgoing = $connAccounting->prepare("SELECT a.`zone`, b.`source_customer_billing_zone_id`, b.`source_external_subscriber_id`, count(*) AS llamadas, SUM((CEIL(b.`duration`))) AS duracion, SUM((b.`source_customer_cost`)/100) AS total, SUM((b.`source_customer_cost`)/100)/SUM((CEIL(b.`duration`))) AS precio  
                                            FROM `billing`.billing_zones a INNER JOIN cdr b 
                                            ON a.`id` = b.`source_customer_billing_zone_id` 
                                            WHERE source_provider_id = :reseller_id 
                                            GROUP BY b.`source_external_subscriber_id`, a.`zone` 
                                            ORDER BY total desc");
$stmtOutgoing->execute(array('reseller_id' => $reseller));




foreach ($stmtOutgoing as $row) {
    
    array_push($totalEntries, $row);
    echo "CDR Entry Added ";
}

获得 id 后,将有一个loop将它们全部插入到此查询中:

foreach ($invoices as $invoice) {
    if ($invoice['date'] >= $minDateSearchTstmp && !empty($invoice["customFields"]) && $invoice["customFields"][0]["field"] == "ID_EXTERNAL" && $invoice["customFields"][0]["value"] != "") {

        $z = 0;
        while ( isset($invoice['customFields'][$z]['field']) && $invoice['customFields'][$z]['field'] == 'ID_EXTERNAL' ) {

            $source_external_subscriber_id = $invoice["customFields"][0]["value"]; 

            renewConnection($connAccounting, $stmtOutgoing, $stmtIncoming);
            require '../connections/accountingConnection.php';



            /*Outgoing*/
            $stmtOutgoing = $connAccounting->prepare("SELECT a.`zone`, b.`source_customer_billing_zone_id`, b.`source_external_subscriber_id`, count(*) AS llamadas, SUM((CEIL(b.`duration`))) AS duracion, SUM((b.`source_customer_cost`)/100) AS total, SUM((b.`source_customer_cost`)/100)/SUM((CEIL(b.`duration`))) AS precio  
                                            FROM `billing`.billing_zones a INNER JOIN cdr b 
                                            ON a.`id` = b.`source_customer_billing_zone_id` 
                                            WHERE source_external_subscriber_id = :source_external_subscriber_id AND source_provider_id = :reseller_id 
                                            GROUP BY b.`source_external_subscriber_id`, a.`zone` 
                                            ORDER BY total desc");
                $stmtOutgoing->execute(array('source_external_subscriber_id' => $source_external_subscriber_id, 'reseller_id' => $reseller));

            
            foreach ($stmtOutgoing as $row) {
                
                array_push($holdedEntries, $row);
                echo "Holded Entry Added ";
            }

        }
    }
}

最后,这段代码应该生成文件并用获得的信息填充它:

foreach ($totalEntries as $tEntry) {
    if (!in_array($tEntry, $holdedEntries)) {
        array_push($unassignedEntries, $tEntry);
    }
}


$fp = fopen('./unassigned_cdr_entries/entradasSinAsignar'.$fileDate.'.csv', 'w');
$delimiter = ',';
$enclosure = '"';
$escape_char = "\\";

foreach ($unassignedEntries as $unassignedEntry) {
    var_dump($unassignedEntry);
    fputcsv($fp, $unassignedEntry, $delimiter, $enclosure, $escape_char);
}


fclose($fp);

文件的原始权限如下:

-rw-r--r-- 1 root root   152 Sep  4 13:26 'Resultados diferencias Cdr-Holded'
-rw-r--r-- 1 root root  6358 Sep  4 14:24  fetch_repeated_and_similar_ids.php
-rw-r--r-- 1 root root  3564 Sep  4 13:26  fetch_repeated_ids.php
-rw-r--r-- 1 root root  3733 Sep  4 13:26  fetch_similar_ids.php
-rw-r--r-- 1 root root  6057 Sep  4 13:26  holded-cdr_data_difference.php
drwxr-xr-x 2 root root  4096 Sep  1 16:57  repeated_ids
-rw-r--r-- 1 root root 14661 Sep  4 13:26 'unassignedCdrEntriesTest(Old).php'
drwxr-xr-x 2 root root  4096 Sep  7 10:04  unassigned_cdr_entries
-rw-r--r-- 1 root root  7616 Sep  7 16:23  unassigned_cdr_entries.php
-rw-r--r-- 1 root root 19613 Sep  4 13:26  unassigned_cdr_entries_for_two_months.php

我尝试过chmod 766chmod 777无济于事。正如我所说,甚至没有警告告诉我由于权限不足而无法在那里打开文件。您可能还会看到var_dump()放在最后foreach() loop。该过程到达那里并且数组不是空的,因为有两个未分配给任何人的测试条目。同样作为回顾,使用以下方法未发现其他警告或错误:

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

任何想法或建议将不胜感激!

标签: phpcsvfputcsv

解决方案


我忘记发布我找到的解决方案作为答案。这里的问题在于,每次我用新文件覆盖旧文件时,由于我不知道的原因,文件的所有者和权限都发生了变化,从而阻止了 apache 用户www-data创建文件。

prject 文件夹是通过 ssh 发送的,因此每当我必须更新某些内容时,我都会使用chownchmod分别恢复受影响的文件夹/文件的用户和www-data权限755


推荐阅读