ID:               45289
 Comment by:       me at lucasoman dot com
 Reported By:      mike dot benza at rice dot edu
 Status:           Open
 Bug Type:         MySQLi related
 Operating System: All
 PHP Version:      5.2.6
 New Comment:

I've experienced the same on 5.1.6. The only difference is that the
returned associative array values were all null, as far as I could tell
(I didn't get any garbage, as above). The keys were all correct. Also,
the correct number of result rows were returned.


Previous Comments:
------------------------------------------------------------------------

[2008-06-17 02:33:54] mike dot benza at rice dot edu

Description:
------------
It's not possible (as far as I can tell) to use a prepared statement in
conjunction with mysqli_result::fetch_row or
mysqli_result::fetch_assoc.

The inability to do it is not documented in the manual online.

There is no error given when you try to use fetch_row or fetch_assoc on
a result.  In fact, it returns successfully, with garbage.

This is a similar issue as http://bugs.php.net/bug.php?id=42619&edit=2,
but there is still no documentation of the behavior and no error thrown
when trying to use fetch_row or fetch_assoc on a result from a prepared
statement

(Note: I only have 5.2.4, since that's the highest available on my OS. 
If you really want me to upgrade, I'll build it from source, but I think
you know about this incompatibility, since it should be your primary use
case; mysqli should be able to combine the security of prepared
statements with the useful features of the old mysql extension)
(See also: http://www.robpoyntz.com/blog/?p=189, which doesn't work,
and I haven't had a chance to figure out why)
(See also: http://blog.myhat.de/2007/06/26/pdo-and-extending-mysqli/)



Reproduce code:
---------------
$db = new mysqli(...);
$teamId = some integer;

$stmt = $db->prepare('SELECT * FROM teams where id=? LIMIT 1;');
if($stmt === FALSE) {
  die("Could not prepare statement");
}
if($stmt->bind_param('i', $teamId) === FALSE) {
  die("Could not bind params");
}
if($stmt->execute() === FALSE) {
  die("Could not execute statement");
}
if(($result = $db->store_result()) === FALSE) {
  die("Could not store result (db)." . $db->error);
}

$teamAsArray = $result->fetch_assoc();
print_r($teamAsArray);

Expected result:
----------------
I would expect the above code to have $teamAsArray be an associative
array with the fields in my team table as the keys, and the values be
the corresponding values.  At the very least, I would expect an error to
be thrown since it can't.

I expect:
Array ( [id] => 1 [name] => Nicaragua II [updateTime] => 2008-06-05
00:35:43 [meetings] => Saturdays at 10:00pm in the Mech Lab [country] =>
Nicaragua [currentProjectId] => 3) 

Actual result:
--------------
An array full of garbage...but not senseless garbage, but rather the
fields in the wrong spots, with some garbage mixed in between:

Array ( [id] => [name] => [updateTime] => ���
[meetings] => Nicaragua II [country] => �#+
[currentProjectId] => Saturdays at 10:00pm in the Mech Lab ) 




------------------------------------------------------------------------


-- 
Edit this bug report at http://bugs.php.net/?id=45289&edit=1

Reply via email to