Homer_J
Homer_J

Reputation: 3323

PHP Array issue - not looping through foreach

Thanks everyone, question answered! If anyone is interested, the updated function is as follows, all other code remains the same:

function fetch_questions($page) {
global $link;
$proc = mysqli_prepare($link, "SELECT * FROM tquestions_cwh WHERE page = ?");
mysqli_stmt_bind_param($proc, "i", $page);
mysqli_stmt_execute($proc);


$rowq = array();
stmt_bind_assoc($proc, $rowq);

// loop through all result rows
//  while ($proc->fetch()) {
    //  print_r($rowq);
//      $rows[]=$rowq;
//  }

while ($proc->fetch())
{
    foreach($rowq as $key=>$value )
    {
        $row_tmb[ $key ] = $value;
    } 
    $rows[] = $row_tmb; 
}

mysqli_stmt_close($proc);
mysqli_clean_connection($link);
return($rows);

}

Ok,

Here is the code:

function fetch_questions($page) {
    global $link;
    $proc = mysqli_prepare($link, "SELECT * FROM tquestions_cwh WHERE page = ?");
    mysqli_stmt_bind_param($proc, "i", $page);
    mysqli_stmt_execute($proc);


    $rows = array();
    stmt_bind_assoc($proc, $rowq);

    // loop through all result rows
    while ($proc->fetch()) {
        //  print_r($rowq);
        $rows[]=$rowq;
    }

    mysqli_stmt_close($proc);
    mysqli_clean_connection($link);
    return($rows);
}

I then add this to a php variable, like so:

$qs = fetch_questions($page);

I then loop through is, like so:

foreach($qs as $value){
                echo "<tr>".$value['qnum']." is the questions number and the question text is ".$value['qtext'].". The page and q values are ".$value['page']." and ".$value['questions']." respectively.</tr>";

The output, however is this:

8 is the questions number and the question text is I know how what I do fits into my team's objectives. The page and q values are 1 and q8 respectively.8 is the questions number and the question text is I know how what I do fits into my team's objectives. The page and q values are 1 and q8 respectively.8 is the questions number and the question text is I know how what I do fits into my team's objectives. The page and q values are 1 and q8 respectively.8 is the questions number and the question text is I know how what I do fits into my team's objectives. The page and q values are 1 and q8 respectively.8 is the questions number and the question text is I know how what I do fits into my team's objectives. The page and q values are 1 and q8 respectively.8 is the questions number and the question text is I know how what I do fits into my team's objectives. The page and q values are 1 and q8 respectively.8 is the questions number and the question text is I know how what I do fits into my team's objectives. The page and q values are 1 and q8 respectively.8 is the questions number and the question text is I know how what I do fits into my team's objectives. The page and q values are 1 and q8 respectively.

Which is not what I want, for information purposes, the array using the print function looks like this:

Array
    (
        [0] => Array
            (
                [questions] => q8
                [qnum] => 8
                [qtext] => I know how what I do fits into my team's objectives
                [page] => 1
            )

        [1] => Array
            (
                [questions] => q8
                [qnum] => 8
                [qtext] => I know how what I do fits into my team's objectives
                [page] => 1
            )

        [2] => Array
            (
                [questions] => q8
                [qnum] => 8
                [qtext] => I know how what I do fits into my team's objectives
                [page] => 1
            )

        [3] => Array
            (
                [questions] => q8
                [qnum] => 8
                [qtext] => I know how what I do fits into my team's objectives
                [page] => 1
            )

        [4] => Array
            (
                [questions] => q8
                [qnum] => 8
                [qtext] => I know how what I do fits into my team's objectives
                [page] => 1
            )

        [5] => Array
            (
                [questions] => q8
                [qnum] => 8
                [qtext] => I know how what I do fits into my team's objectives
                [page] => 1
            )

        [6] => Array
            (
                [questions] => q8
                [qnum] => 8
                [qtext] => I know how what I do fits into my team's objectives
                [page] => 1
            )

        [7] => Array
            (
                [questions] => q8
                [qnum] => 8
                [qtext] => I know how what I do fits into my team's objectives
                [page] => 1
            )

    )

Clearly it's not looping through and displaying each row as it should...any advice?

Homer.

Upvotes: 2

Views: 1114

Answers (4)

Young
Young

Reputation: 8356

I read the manual and find this may help you:

/*
while ($proc->fetch()) {         
    //  print_r($rowq);         
    $rows[]=$rowq;         
}
*/
while ($proc->fetch())
{
    foreach($rowq as $key=>$value )
    {
        $row_tmb[ $key ] = $value;
    } 
    $row[] = $row_tmb; 
}

quote: The problem is that the $rowq returned is reference and not data. So, when you write $row[] = $rowq, the $row will be filled up with the last element of the dataset.

Upvotes: 1

Matteo Riva
Matteo Riva

Reputation: 25060

Not sure if there is more, but the markup is wrong: you're missing opening and closing <td>. The output you posted seems complete, it just appears all in one line. Try:

foreach($qs as $value) {
    echo "<tr><td>".$value['qnum']." is the questions number and the question text is ".$value['qtext'].". The page and q values are ".$value['page']." and ".$value['questions']." respectively.</td></tr>";
}

Upvotes: 0

macbirdie
macbirdie

Reputation: 16193

mysqli_stmt_fetch manual says:

Note: Note that all columns must be bound by the application before calling mysqli_stmt_fetch().

Maybe for a SELECT * query you should use mysqli_stmt_store_result and mysqli_stmt_result_metadata functions to get all columns.

Upvotes: 0

Rupert Madden-Abbott
Rupert Madden-Abbott

Reputation: 13278

Sorry I'm not that familiar with the procedural style of mysqli so I'm not sure if this is your problem or not. However, it seems to me that you've set $proc to be the result of mysqli_prepare but according to the manual, this function returns true or false. You've then used $proc as the first parameter for mysqli_stmt_bind_param() but, again according to the manual, this parameter should be the return of mysqli_stmt_init() which I assume is $link. In fact, wherever you have used $proc as a parameter, you should instead use $link.

Upvotes: 0

Related Questions