http://docs.php.net/mysqli-result.fetch-assoc says:
Returns an associative array of strings representing the selected row in the result set
update: "Back to :: prepare and :: execute. I just don't believe it ... ;-)" - And you're right!
If you use mysqlnd as a transport client and set the MYSQLI_OPT_INT_AND_FLOAT_NATIVE option on the mysqli object, you are actually getting native types.
echo 'phpversion: ', phpversion(), "\n"; $m = new mysqli('localhost', 'localonly', 'localonly', 'test'); $m->options(MYSQLI_OPT_INT_AND_FLOAT_NATIVE, true); $m->query('CREATE TABLE soTest (x int)'); $m->query('INSERT INTO soTest (x) VALUES (1),(2)'); $r = $m->query('SELECT x from soTest'); var_dump($r->fetch_assoc());
prints
phpversion: 5.3.3
array (1) {
["x"] =>
int (1)
} Did not find it in the manual, so you can check when this parameter was added to ext / mysqli / mysqli.c
edit: he first appeared here: http://svn.php.net/viewvc/php/php-src/trunk/ext/mysqli/mysqli.c?r1=263494&r2=266352
To get started with PDO (if you decide to use it):
<?php $pdo = new PDO('mysql:host=localhost;dbname=test', 'localonly', 'localonly'); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // the pdo_mysql driver uses emulated prepared statements by default $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); // afaik only the mysqlnd client supports native types, with libmysql you'll get only strings/null echo 'client: ', $pdo->getAttribute(PDO::ATTR_CLIENT_VERSION), "\n"; // set up test environment $pdo->exec('CREATE TEMPORARY TABLE soTest (x int, y varchar(16))'); $pdo->exec("INSERT INTO soTest (x,y) VALUES (1,'a'),(2,null)"); // statement with positional parameter $stmt = $pdo->prepare('SELECT x,y FROM soTest WHERE x>?'); $stmt->setFetchMode(PDO::FETCH_ASSOC); $stmt->execute( array(0) ); foreach( $stmt as $row ) { foreach( $row as $col ) { echo gettype($col), '(', $col, ') '; } echo "\n"; }
prints
client: mysqlnd 5.0.7-dev - 091210 - $Revision: 300533 $ integer(1) string(a) integer(2) NULL()