user6841895
user6841895

Reputation:

Explanation of mysqli_fetch_array and foreach

<?php

$connect = mysqli_connect("localhost", "root", "", "hempbag_db") or die("Connection failed");

$query= "Select * from tbl_sales";
$ress = mysqli_query($connect, $query);
$result = mysqli_fetch_array($ress);

foreach($result as $a)
{
 echo $a['ID'];   // This doesnt print although i used fetch array
}

foreach($ress as $a)
{
 echo $a['ID'];   // This works why???? This variable has only query run
}

?>

Why does the upper foreach does not run and lower one does? Can anyone explain please?

Upvotes: 0

Views: 559

Answers (2)

Blue
Blue

Reputation: 22911

When you run a query, it returns a result:

$ress = mysqli_query($connect, $query);
var_dump($ress); // You will see it's a result.

At this point $ress just contains the result of what you just queried. Think of it like this:

  • You goto the warehouse, and you make and order for 1000 boxes of crackers. She heads to the back, and gets your boxes ready, and comes back and hands you a piece of paper with the order number. (This is $ress). Now, you can't loop through that, you can't do anything with that.
  • You now take that piece of paper, and you hand it to your assistant, and you say you want to get all the crackers on your trucks (This is now mysqli_fetch_array()). Your assistant goes, fetches it, and returns you the crackers.

Simply put, mysqli_query just returns an object like Result#1. From Result#1, mysql can tell you how many rows were returned mysql_num_rows(Result#1), or get actual data if it was a select query: mysqli_fetch_array(Result#1).

Now onto the reasoning: Performance. Let's say you didn't want 1000 crackers, you just wanted to know if they had 1000 crackers. If she came back with all the boxes of crackers and you had to count them yourself, it would be much more difficult. Instead, with that piece of paper, she can determine how many boxes you were able to order. Less data being transferred, and much more efficient.

Just a small note, in later versions of php, they made it so the result is iterable, meaning that if you try and loop through it, it will automagically call mysqli_fetch_array on that result, and return you the results.

Additionally, mysql_fetch_array will return one row from the database, and is not able to be looped through via foreach. Perhaps you were thinking of mysqli_fetch_all? This returns all rows and can be looped through (Although is a bit less performant than using a while loop with mysqli_fetch_array)

Upvotes: 3

Indra Kumar S
Indra Kumar S

Reputation: 2934

$ress = mysqli_query($connect, $query);

This line returns a result set which is Traversable. So your second foreach works fine.

whereas the following line (mysqli_fetch_array) gets one row at a time and makes it an array.

$result = mysqli_fetch_array($ress); // Suppose you have 3 rows, Now cursor is at row 1
echo $result["ID"]; // this will print FIRST row's ID


$result = mysqli_fetch_array($ress); // Now cursor is at row 2
echo $result["ID"]; // this will print SECOND row's ID. 


$result = mysqli_fetch_array($ress); // Now cursor is at row 3
echo $result["ID"]; // this will print THIRD row's ID.

To echo all IDs

while($result = mysqli_fetch_array($ress)) {
   echo $result["ID"];
}

Upvotes: 1

Related Questions