Reading textfiles from path in a text file [PHP] - php

I have a textfile ($file) that contains the path to other files. My goal is to read the content of those files and print it in a table. When reading the paths from $file, only the last line path works correctly.
<?php
$file = "log2.txt";
if(file_exists($file)) {
$handler = fopen($file,'r');
while(!feof($handler)) {
$lines = fgets($handler);
$wordarray = explode(' ', $lines);
#echo $wordarray[0]." ".$wordarray[1]." ".$wordarray[2];
if (strpos($lines, 'NOK') !== false) {
echo "<tr><td>".$wordarray[0]."</td></tr>";
if(file_exists($wordarray[2])){
$log = fopen($wordarray[2], 'r');
#echo "FILE EXISTS ".$log;
$logtext = fread($log,filesize($wordarray[2]));
echo "<tr><td>".$logtext."</td></tr>";
fclose($log);
} else {
echo "<tr><td>"."FILE ".$wordarray[2]." FAILED TO LOAD"."</td></tr>";
}
}
}
fclose($handler);
} else {
echo "FILE DOES NOT EXISTS";
}
?>
Here is an exemple of how log2.txt would look like:
POE NOK poelog.txt
LINK-ERRORS OK OK
LATENCIES NOK latencieslog.txt
VOLATILE NOK volatilelog.txt
I think that the problem could be about line endings or so, but cannot get the point.

You're right. The $wordarray[2] contains also new line character so before using it pass it through trim() function and store it in a variable ($filename in my case).
Updated inner if:
if (strpos($lines, 'NOK') !== false) {
echo "<tr><td>".$wordarray[0]."</td></tr>";
$filename = trim($wordarray[2]);
if (file_exists($filename)){
echo "FILE EXISTS ".$filename;
$log = fopen($filename, 'r');
$logtext = fread($log, filesize($filename));
echo "<tr><td>".$logtext."</td></tr>";
fclose($log);
}
else{
echo "<tr><td>"."FILE ".$filename." FAILED TO LOAD"."</td></tr>";
}
}

This short function works like a sharm:
function displayFileContent( $fileName )
{
$arrayWithFileNames = file ( $fileName );
echo "<table>";
foreach ( $arrayWithFileNames as $singleFileName )
{
# remove the trailing \n on Linux - windows has 2 character as EOL
$singleFileName = trim(preg_replace('/\s\s+/', ' ', $singleFileName));
$contentOfFile = file_get_contents( $singleFileName );
echo "<tr><td>{$contentOfFile}</td></tr>";
}
echo "</table>";
}
You use it like this:
displayFileContent ("path-to-your-file");
Remark: There is no check if the file does exist....

Related

PHP data processing not outputting

Hi I am trying to get this external text file to print inside my php document. The code looks fine to me however when I echo it does not output anything and I am not sure why this is. Can anybody help me out as I am new to this.
$location = '/Applications/MAMP/htdocs/PHPLabs/branches.txt';
$fp = fopen($location, 'r');
if ($fp) {
$readin = fread($fp);
fclose($fp);
} else {
echo 'Can\'t open input.txt';
}
Not sure what you're trying to 'echo' but have you checked if the file exists in the first place?
Your code could be written as:
$location = '/Applications/MAMP/htdocs/PHPLabs/branches.txt';
if (file_exists($location) && $data = file_get_content($location)){
echo $data;
} else {
echo 'File not found';
}
if (file_exists($location) && $file = fopen($location, 'r')){
$file_content = fread($file, filesize($location));
fclose($file);
} esle {
echo 'File not found';
}
See here for more: http://php.net/manual/en/function.file-get-contents.php, http://php.net/manual/en/function.filesize.php

fgetCsv Returning null values for csv file in php

I have a csv file placed at path
#http://thevowapp.com/brandstore/values.csv
$f = fopen("http://thevowapp.com/brandstore/values.csv", "w+");
if(!f)
{
echo "Error";
}
$line = fgetcsv($f);
echo json_encode($line);
I am trying to parse it, however the fgetCsv keeps on returning null. What could be the error?
Problems:
You try to open a remote file with w+ (write) access. Use r for read.
You check f (undefined constant). Use$f`.
You don't loop fgetcsv, so you won't get more than the header line.
Try:
$f = fopen('http://thevowapp.com/brandstore/values.csv', 'r');
if(!$f) {
echo 'Error';
exit;
}
$out = array();
while ($line = fgetcsv($f)) {
$out[] = $line;
}
echo json_encode($out, JSON_PRETTY_PRINT);
Remove the pretty print option when you're happy.

create multiple directories using loop in php

I am taking data from text file( data is: daa1 daa2 daa3 on separate lines) then trying to make folders with exact name but only daa3 folders is created. Also when i use integer it creates all folders, same is the case with static string i.e "faraz".
$file = __DIR__."/dataFile.txt";
$f = fopen($file, "r");
$line =0;
while ( $line < 5 )
{
$a = fgets($f, 100);
$nl = mb_strtolower($line);
$nl = "checkmeck/".$nl;
$nl = $nl."faraz"; // it works for static value i.e for faraz
//$nl = $nl.$a; // i want this to be the name of folder
if (!file_exists($nl)) {
mkdir($nl, 0777, true);
}
$line++;
}
kindly help
use feof function its much better to get file content also line by line
Check this full code
$file = __DIR__."/dataFile.txt";
$linecount = 0;
$handle = fopen($file, "r");
$mainFolder = "checkmeck";
while(!feof($handle))
{
$line = fgets($handle);
$foldername = $mainFolder."/".trim($line);
//$line is line name daa1,daa2,daa3 etc
if (!file_exists($foldername)) {
mkdir($foldername, 0777, true);
}
$linecount++;
unset($line);
}
fclose($handle);
output folders
1countfaraz
2countfaraz
3countfaraz
Not sure why you're having trouble with your code, but I find it to be more straightforward to use file_get_contents() instead of fopen() and fgets():
$file = __DIR__."/dataFile.txt";
$contents = file_get_contents($file);
$lines = explode("\n", $contents);
foreach ($lines as $line) {
$nl = "checkmeck/". $line;
if (!file_exists($nl)) {
echo 'Creating file '. $nl . PHP_EOL;
mkdir($nl, 0777, true);
echo 'File '. $nl .' has been created'. PHP_EOL;
} else {
echo 'File '. $nl .' already exists'. PHP_EOL;
}
}
The echo statements above are for debugging so that you can see what your code is doing. Once it is working correctly, you can remove them.
So you get the entire file contents, split it (explode()) by the newline character (\n), and then loop through the lines in the file. If what you said is true, and the file looks like:
daa1
daa2
daa3
...then it should create the following folders:
checkmeck/daa1
checkmeck/daa2
checkmeck/daa3

Copy files using PHP and XAMPP

I made some kind of PHP file to organize my Images from an old website. The admin of that old site didn't use subfolders so I got thousands of Images in one dir.
I got a csv File with filenames and categories, now I want to just copy this filenames line by line and let PHP copy them to a destenie directory.
This is on XAMPP on my local machine, maybe this is the problem?
Here is what I have already:
<?php
$source = "";
$destination = "Kompaniefest05/";
$handle = fopen($source."names.txt", "r");
$buffers[] = "";
if ($handle) {
while (($buffer = fgets($handle, 4096)) !== false) {
array_push($buffers, $buffer);
}
if (!feof($handle)) {
echo "Error: unexpected fgets() fail\n";
}
fclose($handle);
};
foreach ($buffers as $buffer){
echo "Copy ".$source.$buffer." to ".$destination.$buffer;
if(copy($source.$buffer, $destination.$buffer)){
echo "</br>True</br>";
}else{
echo "</br>False</br>";
};
};
?>
The code runs through as expected, and I get list with all filenames inside the .txt file, but always with "False", and the destination directory stays empty.
Is this a configuration problem with XAMPP or do I have some mistakes in my code?
// Edit: Sample of the .txt file
_1_20081008_2089220027.jpg
_2_20081008_1467211531.jpg
_3_20081008_1388589383.jpg
_4_20081008_1327719202.jpg
_5_20081008_1691023977.jpg
_6_20081008_1494910005.jpg
_7_20081008_1101725852.jpg
_8_20081008_1123823020.jpg
_9_20081008_1092805517.jpg
_10_20081008_1752481220.jpg
_11_20081008_1420860420.jpg
_12_20081008_1803761675.jpg
_13_20081008_1199173697.jpg
_14_20081008_1877520136.jpg
_15_20081008_1344646088.jpg
_16_20081008_1918096785.jpg
_17_20081008_1895142423.jpg
_18_20081008_1841060330.jpg
_19_20081008_1438833482.jpg
_20_20081008_1871628956.jpg
_21_20081008_1141581267.jpg
_22_20081008_1416565613.jpg
_23_20081008_1868584205.jpg
_24_20081008_1265588276.jpg
_25_20081008_2023422375.jpg
_26_20081008_1410663038.jpg
_27_20081008_1398533505.jpg
_28_20081008_1413417063.jpg
_29_20081008_1827605061.jpg
_30_20081008_1883399407.jpg
_31_20081008_1468535188.jpg
_32_20081008_1742608861.jpg
_33_20081008_1818421650.jpg
_34_20081008_1682119571.jpg
_35_20081008_1066121950.jpg
Try this, i checked it on localhost with some sample files and its working.
You can also use your own code with a small change.
Just change array_push($buffers, $buffer); to array_push( $buffers, trim( $buffer ) );
Because your file name contains a new line at the end, that stopping you from copying the files.
And always turn on error_reporting while coding :)
<?php
$source = "";
$destination = "Kompaniefest05/";
if ( !file_exists( $destination ) ) {
mkdir( $destination, 0755 );
}
$buffers = file( $source."names.txt", FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES );
foreach( $buffers as $buffer ) {
$fcopy = $source.trim( $buffer );
$tcopy = $destination.trim( $buffer );
echo "Copying ".$fcopy." to ".$tcopy." - ";
if ( file_exists( $fcopy ) ) {
if ( copy( $fcopy, $tcopy ) ) {
echo "SUCCESS";
}
else {
echo "FAILED";
}
}
else {
echo "FILE MISSING";
}
echo "<br />";
}
?>

PHP Simultaneous file access / flock() issue

I'm having trouble implementing a script which should parse a json string from a file, either overwrite the object with the same id or add it to the json array and write it back to the file. The script is called in a for loop so that I tried to use flock to prevent overwriting the file before the json string could be parsed, but the results look really strange and I don't know whats going wrong. Here is the script:
$method = $_SERVER['REQUEST_METHOD'];
$file = fopen($userid . '.json', 'c+');
flock($file, LOCK_EX);
$jsonStr = (filesize($userid . '.json') == 0 ) ? '{"success": true}' : fread($file, filesize($userid . '.json'));
$jsonObj = json_decode($jsonStr);
if($method === 'POST') {
$dataStr = file_get_contents('php://input');
$dataObj = json_decode($dataStr);
$replacements = array();
if(isset($jsonObj->images)) {
foreach($jsonObj->images as $idx=>$image) {
if($image->id == $dataObj->id) {
$replacements += array($idx => $dataObj);
}
}
if(count($replacements)==0) {
array_push($replacements, $dataObj);
}
$jsonObj->images = array_replace($jsonObj->images, $replacements);
} else {
//$jsonObj = new stdClass();
$jsonObj->images = new stdClass();
$jsonObj->images = array($dataObj);
}
fwrite($file, json_encode($jsonObj));
file_put_contents('log.json', json_encode($dataObj), FILE_APPEND);
echo '{"success":true, "images":' . $dataStr . '}';
} else if($method === 'GET') {
echo $jsonStr;
}
fclose($file);
As result I get sometime three files one just called ".json" and the other one correctly userid.json and the log.json. The log looks best, since all 26 objects are shown correctly, but without checking for exiting objects previously. The ".json" is just blank and the looks really odd:
{"success":true,"images":[{"id":"f9f4b6ee-8b7b-414e-98f4-47ed5ee3c594","top":1200,"left":4050,"clicks":0,"affinity":[]}]}
{"success":true,"images":[{"id":"034c7661-9466-4651-b860-7e049e1543ac","top":900,"left":600,"clicks":0,"affinity":[]}]}
{"images":[{"id":"eebc35ec-6c0e-416a-9516-061df821083d","top":1800,"left":3300,"clicks":0,"affinity":[]}]}
{"images":[{"id":"e09da5b9-2e65-4a12-94cd-4745b354a256","top":1200,"left":1200,"clicks":0,"affinity":[]}]}
{"images":[{"id":"b023a259-4554-48a5-acd8-cb4215e6a391","top":1350,"left":1500,"clicks":0,"affinity":[]}]}
{"images":[{"id":"6521d8c3-461c-4fcd-b69d-69f14ae37418","top":600,"left":3750,"clicks":0,"affinity":[]}]}
{"images":[{"id":"4c082c1a-d4ae-4c1c-bfc4-ed36980f5db2","top":3150,"left":600,"clicks":0,"affinity":[]}]}
{"images":[{"id":"22dbdea2-4936-4353-825e-9af6e6f2ca93","top":3000,"left":2100,"clicks":0,"affinity":[]}]}
{"images":[{"id":"a7ba32d4-912e-489d-8f9b-e412bc1629c1","top":2850,"left":3750,"clicks":0,"affinity":[]}]}
{"images":[{"id":"b258148d-1779-4f17-ae5e-1160aa0a34b9","top":750,"left":4050,"clicks":0,"affinity":[]}]}
{"images":[{"id":"21c1c9d1-a7a6-48d2-a4ba-174c0fe248a3","top":1650,"left":750,"clicks":0,"affinity":[]}]}
{"images":[{"id":"bfed2f56-7876-4eb2-a217-e0f71f4455ee","top":3300,"left":1500,"clicks":0,"affinity":[]}]}
{"images":[{"id":"7f13b674-5d07-444f-bf6d-463758c96788","top":1650,"left":1950,"clicks":0,"affinity":[]}]}
{"images":[{"id":"fb8711f2-ba10-44d7-9038-02cae6438506","top":1800,"left":450,"clicks":0,"affinity":[]}]}
{"images":[{"id":"ac83e869-e4fb-4eee-8d2e-4d26762101d9","top":750,"left":1800,"clicks":0,"affinity":[]}]}
{"images":[{"id":"069a7595-2271-4430-b324-974115df7b80","top":2550,"left":1800,"clicks":0,"affinity":[]}]}
{"images":[{"id":"ea9ab2fc-e179-4f56-9ce7-8af456911b33","top":1950,"left":750,"clicks":0,"affinity":[]}]}
{"images":[{"id":"9b997ae3-0c66-4f78-937a-2fde2470d7d7","top":300,"left":300,"clicks":0,"affinity":[]}]}
{"images":[{"id":"f860dea4-3b27-4401-999b-72ce45022110","top":1200,"left":1950,"clicks":0,"affinity":[]}]}
{"images":[{"id":"2633c107-8a51-4e9c-bc2c-f87c30f7359d","top":750,"left":2100,"clicks":0,"affinity":[]}]}
{"images":[{"id":"bebcb2bb-c2f0-4e4d-b202-b05090eacf49","top":3600,"left":3600,"clicks":0,"affinity":[]}]}
{"images":[{"id":"460f961e-f1dd-4329-95be-d30770a37b83","top":2400,"left":1200,"clicks":0,"affinity":[]}]}
{"images":[{"id":"ee9b254f-fe6a-4ece-a662-e934625e992a","top":3600,"left":600,"clicks":0,"affinity":[]}]}
{"images":[{"id":"4e047ea9-345e-4cf9-a066-d0b431820c61","top":2100,"left":1350,"clicks":0,"affinity":[]}]}
{"images":[{"id":"8bbb5327-6d39-40e1-919e-d7b70e13fc2b","top":2700,"left":1200,"clicks":0,"affinity":[]}]}
{"images":[{"id":"0c50c0ec-e18b-4917-9787-bad245eed798","top":1200,"left":2550,"clicks":0,"affinity":[]}]}
I also get an exception:
<b>Strict Standards</b>: Creating default object from empty value in <b>C:\xampp\htdocs\gallery\store.php</b> on line <b>38</b><br />
I guess I didn't understand the procedure correctly and I'm happy for any help.
EDIT: The result I want, looks like this:
{"success":true,"images":[{"id":"f9f4b6ee-8b7b-414e-98f4-47ed5ee3c594","top":1200,"left":4050,"clicks":0,"affinity":[]},
{"id":"034c7661-9466-4651-b860-7e049e1543ac","top":900,"left":600,"clicks":0,"affinity":[]},{"id":"eebc35ec-6c0e-416a-9516-061df821083d","top":1800,"left":3300,"clicks":0,"affinity":[]},
{"id":"e09da5b9-2e65-4a12-94cd-4745b354a256","top":1200,"left":1200,"clicks":0,"affinity":[]},
{"id":"b023a259-4554-48a5-acd8-cb4215e6a391","top":1350,"left":1500,"clicks":0,"affinity":[]},
{"id":"6521d8c3-461c-4fcd-b69d-69f14ae37418","top":600,"left":3750,"clicks":0,"affinity":[]},
{"id":"4c082c1a-d4ae-4c1c-bfc4-ed36980f5db2","top":3150,"left":600,"clicks":0,"affinity":[]},
{"id":"22dbdea2-4936-4353-825e-9af6e6f2ca93","top":3000,"left":2100,"clicks":0,"affinity":[]},
{"id":"a7ba32d4-912e-489d-8f9b-e412bc1629c1","top":2850,"left":3750,"clicks":0,"affinity":[]},
{"id":"b258148d-1779-4f17-ae5e-1160aa0a34b9","top":750,"left":4050,"clicks":0,"affinity":[]},
{"id":"21c1c9d1-a7a6-48d2-a4ba-174c0fe248a3","top":1650,"left":750,"clicks":0,"affinity":[]},
{"id":"bfed2f56-7876-4eb2-a217-e0f71f4455ee","top":3300,"left":1500,"clicks":0,"affinity":[]},
{"id":"7f13b674-5d07-444f-bf6d-463758c96788","top":1650,"left":1950,"clicks":0,"affinity":[]},
{"id":"fb8711f2-ba10-44d7-9038-02cae6438506","top":1800,"left":450,"clicks":0,"affinity":[]},
{"id":"ac83e869-e4fb-4eee-8d2e-4d26762101d9","top":750,"left":1800,"clicks":0,"affinity":[]},
{"id":"069a7595-2271-4430-b324-974115df7b80","top":2550,"left":1800,"clicks":0,"affinity":[]},
{"id":"ea9ab2fc-e179-4f56-9ce7-8af456911b33","top":1950,"left":750,"clicks":0,"affinity":[]},
{"id":"9b997ae3-0c66-4f78-937a-2fde2470d7d7","top":300,"left":300,"clicks":0,"affinity":[]},
{"id":"f860dea4-3b27-4401-999b-72ce45022110","top":1200,"left":1950,"clicks":0,"affinity":[]},
{"id":"2633c107-8a51-4e9c-bc2c-f87c30f7359d","top":750,"left":2100,"clicks":0,"affinity":[]},
{"id":"bebcb2bb-c2f0-4e4d-b202-b05090eacf49","top":3600,"left":3600,"clicks":0,"affinity":[]},
{"id":"460f961e-f1dd-4329-95be-d30770a37b83","top":2400,"left":1200,"clicks":0,"affinity":[]},
{"id":"ee9b254f-fe6a-4ece-a662-e934625e992a","top":3600,"left":600,"clicks":0,"affinity":[]},
{"id":"4e047ea9-345e-4cf9-a066-d0b431820c61","top":2100,"left":1350,"clicks":0,"affinity":[]},
{"id":"8bbb5327-6d39-40e1-919e-d7b70e13fc2b","top":2700,"left":1200,"clicks":0,"affinity":[]},
{"id":"0c50c0ec-e18b-4917-9787-bad245eed798","top":1200,"left":2550,"clicks":0,"affinity":[]}]}
Cheers,
Daniel
I finally have it working and for anyone else having issues with simultaneous file access, here's my solution:
Check if the file exists, if not, create it and set up the data structure (to prevent the strict standard error)
$filename = $userid . '.json';
if(!file_exists($filename)) {
$file = fopen($filename, 'w');
if(flock($file, LOCK_EX)) {
fwrite($file, '{"success": true, "images": []}');
flock($file, LOCK_UN);
fclose($file);
}
}
Open the file using c+ as second parameter (w+ would set the filesize to 0). Check if you can get the exclusive lock. Read the file and rewind in order to overwrite it later.
else {
$file = fopen($userid . '.json', 'c+');
if(flock($file, LOCK_EX)) {
$jsonStr = fread($file, filesize($userid . '.json'));
$jsonObj = json_decode($jsonStr);
rewind($file);
Manipulate the object how you need it and write it back as encoded json string using fwrite
if($method === 'POST') {
$dataStr = file_get_contents('php://input');
if(isset($dataStr) &&$dataStr != '') {
$dataObj = json_decode($dataStr);
$replace = -1;
foreach($jsonObj->images as $idx=>$image) {
if($image->id == $dataObj->id) {
$replace = $idx;
}
}
if($replace != -1) {
$img = $jsonObj->images;
$img[$replace] = $dataObj;
$jsonObj->images = $img;
} else {
array_push($jsonObj->images, $dataObj);
}
fwrite($file, json_encode($jsonObj));
}
echo '{"success":true, "images":' . $dataStr . '}';
} else if($method === 'GET') {
echo $jsonStr;
}
Release the lock and close the file.
flock($file, LOCK_UN);
fclose($file);
}
}

Categories