Search code examples
phpmysqlpdofetch

PDO prepared statement fetch() returning double results


I have a script that is outputting to a CSV file. However, even though there is currently one row in the database, the output I'm getting is echoing out each column from each row in the table twice.

For example: 1,1,John,John,Smith,Smith,2014,2014 Should be 1,John,Smith,2014

This worked fine before I went with PDO and prepared statements, so I'm thinking maybe I'm not understanding how fetch() works correctly. Below is my code. Any idea what I could be doing wrong?

// get rows
$query_get_rows = "SELECT * FROM Contacts ORDER BY date_added DESC";
$result_get_rows = $conn->prepare($query_get_rows);
$result_get_rows->execute();         
$num_get_rows = $result_get_rows->rowCount();

while ($rows_get_rows = $result_get_rows->fetch()) 
{
  $csv .= '"'.join('","', str_replace('"', '""', $rows_get_rows))."\"\n";
}
echo $csv;
exit;

Solution

  • You should say to PDO, that you want only an associative array or a numbered array:

    while ($rows_get_rows = $result_get_rows->fetch(PDO::FETCH_ASSOC)) 
    

    to get an associative array or

    while ($rows_get_rows = $result_get_rows->fetch(PDO::FETCH_NUM)) 
    

    to get an array indexed by the column number

    from PDOStatement::fetch

    fetch_style

    Controls how the next row will be returned to the caller. This value must be one of the PDO::FETCH_* constants, defaulting to value of PDO::ATTR_DEFAULT_FETCH_MODE (which defaults to PDO::FETCH_BOTH).

    PDO::FETCH_ASSOC: returns an array indexed by column name as returned in your result set

    PDO::FETCH_BOTH (default): returns an array indexed by both column name and 0-indexed column number as returned in your result set