0

I am NOT! a php developer and still this task ended on my desk. Creating some report for distributor. I have made my query and getting my data out. But I am having troubles of converting the array into a CSV formatted string I can serve the clients.

The result I get:

array(1) { [0]=> object(stdClass)#351 (9) { ["id"]=> string(36) "cc23b3b9-7e38-11e6-b6fa-0a1bcd0d7087" ["master_user_id"]=> string(36) "84d55a15-5256-2ee6-1d31-8f3ccbc6f223" ["company_name"]=> string(7) "Tellest" ["price_per_register"]=> string(1) "0" ["num_of_registers"]=> string(1) "1" ["price"]=> string(5) "18625" ["kickback_percent"]=> string(4) "0.25" ["kickback"]=> string(4) "4656" ["distributor_report_id"]=> string(3) "260" } } 

I have tried lots of stuff like: Headers first (which worked)

 fputcsv($handle, array('id', 'master_user_id', 'company_name', 'price_per_register', 'price', 'kickback_percent', 'kickback', 'distributor_report_id'),','); 

and then

while($row = $results->fetch()) { fputcsv( $handle, // The file pointer array($row['id'], $row['master_user_id'], $row['company_name'], $row['price_per_register'], $row['price'], $row['kickback_percent'], $row['kickback'], $row['distributor_report_id']), // The fields ',' // The delimiter ); } 

Hope anyone can give me some nice pointer what I am doing wrong. I have seen this in the logs: NOTICE: PHP message: PHP Fatal error: Call to a member function fetch() on array in /usr/share/nginx/html/src/app/Rest/Controllers/DistributorReportController.php on line 54

1
  • $raw is an array and items are objects, so loop array using foreach and address items using -> operator Commented Sep 19, 2016 at 13:27

4 Answers 4

3

First it looks like you already have array so you don't need to fetch(), second you try access object property ($row->id) as array element ($row['id']). Here's example that should work:

foreach($results as $row){ fputcsv( $handle, // The file pointer array($row->id, $row->master_user_id, $row->company_name, $row->price_per_register, $row->price, $row->kickback_percent, $row->kickback, $row->distributor_report_id), // The fields ',' // The delimiter ); } 
Sign up to request clarification or add additional context in comments.

Comments

2

You are getting an array of objects, so you cannot use fetch method on an array.

$rows = $results->fetch(); // or whatever else you do to get the presented array :) foreach ($rows as $row) { fputcsv($handle, $row->id, $row->master_user_id, $row->company_name, $row->price_per_register, $row->price, $row->kickback_percent, $row->kickback, $row->distributor_report_id), ','); } 

Comments

1

First you need to extract the objects from the array, then iterate through the objects to populate the csv:

$array = //a collection of what you show at the top off post - I'm assuming more than 1 member $count = count($array); for($i = 0; $i < $count; $i++) { $object = $array[$i];// iterate through the array of objects foreach($object as $obj) { // in here populate the csv with this object's members, use object notation with -> $fields = array($obj->id, $obj->master_user_id, $obj->company_name, $obj->price_per_register, $obj->price, $obj->kickback_percent, $obj->kickback, $obj->distributor_report_id); fputcsv($handle, $fields, ',');// comma is the default separator }//end foreach }//end for loop 

csv file is now populated, so use fclose()

Comments

0

Hi Thx all for the awesome feedback. You all lead me in the right direction. My result:

$handle = fopen('php://output', 'w+'); fputcsv($handle, array('id', 'master_user_id', 'company_name', 'price_per_register', 'num_of_registers' , 'price', 'kickback_percent', 'kickback', 'distributor_report_id'),','); $count = count($results); for($i = 0; $i < $count; $i++) { $object = $results[$i];// iterate through the array of objects echo implode(",",$object); echo "\n"; } fclose($handle); 

I have upvoted all of you :)

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.