php - 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 766
但chmod 777
无济于事。正如我所说,甚至没有警告告诉我由于权限不足而无法在那里打开文件。您可能还会看到var_dump()
放在最后foreach() loop
。该过程到达那里并且数组不是空的,因为有两个未分配给任何人的测试条目。同样作为回顾,使用以下方法未发现其他警告或错误:
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
任何想法或建议将不胜感激!
解决方案
我忘记发布我找到的解决方案作为答案。这里的问题在于,每次我用新文件覆盖旧文件时,由于我不知道的原因,文件的所有者和权限都发生了变化,从而阻止了 apache 用户www-data
创建文件。
prject 文件夹是通过 ssh 发送的,因此每当我必须更新某些内容时,我都会使用chown
并chmod
分别恢复受影响的文件夹/文件的用户和www-data
权限755
。
推荐阅读
- java - Generic date parsing in java
- angular - Angular - ExpressionChangedAfterItHasBeenCheckedError
- angularjs - 动态读取离子切换值并发布到数据库
- xamarin.forms - 在 xamarin 表单中保存和恢复应用程序状态
- javascript - 如何在 gridstack.js 中调整屏幕底部的小部件的大小?
- google-apps-script - 无法解决找不到方法 deleteRow((class)) 错误
- javascript - 使用 v-for 定义单页 Vue 组件的 props
- xcode - 此资源仅适用于注册开发者计划的开发者 登录错误
- android - 将位图转换为 Firebase ML 套件的 N*N*N*N 字节数组
- python - 如何将我的自定义菜单添加到门户用户菜单列表?