views:

32

answers:

2

Hi I have a table in mysql:

CREATE TABLE user (id INT, name VARCHAR(250));

I query the table:

$result = mysql_query("SELECT id,name FROM user");

I gather the results:

while($row = mysql_fetch_assoc($result) $rv[] = $row;

And I return the data:

echo json_encode($rv);

The problem is that the id returns as string and not int, even before the json_encode. If i force $row['id'] = (int)$row['id']; - it works fine.

How can i force mysql to return the correct data type in the $row?

10x.

+1  A: 

PDO->bindColumn can this

$stmt = $dbh->prepare($sql);

$stmt->bindColumn('int_col', $intVar, PDO::PARAM_INT);
$stmt->bindColumn('string_col', $strVar, PDO::PARAM_STR);

$stmt->execute();

$stmt->fetch(PDO::FETCH_BOUND);

$intVar will be automatically converted to int

stereofrog
First thanks, but why do i need to "tell" it the data type when this field is declared in the SQL TABLE as INT ...
aviv
well, because db interface doesn't support this. All you get from db is an array of strings. You can convert some of these strings to something else at the application level, but this won't happen "automagically" without a full-blown ORM layer.
stereofrog
+1  A: 

Unfortunatly, with PHP <= 5.2, the MySQL functions/classes (i.e. mysql_*, mysqli_*, and PDO) are based on libmysql -- a C library which provides support for communication with the MySQL server.

Functions using that library always return strings, even for integer and float columns -- and there is nothing you can do about that : the only solution is to have some "mapping layer" (like an ORM) that "knows", on the PHP side, which type each column should be, and will do the conversion each time some data is fetched from the database.

Note : the way you're inserting data doesn't change anything about the fact that you'll get strings when fetching data from the DB.


With PHP >= 5.3, functions that communicate with a MySQL server can use mysqlnd (MySQL Native Driver) instead of libmysql -- this has to be configured at compile-time, though.

And being able to communicate with "native" data-types, under certain circumstances, is one of the nice things that mysqlnd provides ; about that, there should be a couple of interesting informations is this article : PHP: New network traffic, CPU and memory savings with mysqlnd.


To makes things short :

  • With PHP 5.2, you'll only get strings from the database ; and you'll have to do some type-conversion yourself
  • With PHP 5.3, you might get native datatypes -- at least in some cases.
Pascal MARTIN