2010-02-23 15 views
5

Tôi có một bảng trong mysql:mysql_query giữ nguyên kiểu dữ liệu được tạo trong bảng khi trả lại?

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

tôi truy vấn bảng:

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

tôi thu thập kết quả:

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

Và tôi trả lại dữ liệu:

echo json_encode($rv); 

Vấn đề là id trả về dưới dạng chuỗi và không phải int, ngay cả trước json_encode. Nếu tôi buộc $ row ['id'] = (int) $ row ['id']; - nó hoạt động tốt.

Làm thế nào tôi có thể buộc mysql trả về kiểu dữ liệu chính xác trong hàng $?

10x.

Trả lời

2

PDO->bindColumn thể này

$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 sẽ được tự động chuyển đổi sang int

+0

Lời cảm ơn đầu tiên, nhưng tại sao tôi cần phải "nói" loại dữ liệu khi trường này được khai báo trong SQL TABLE dưới dạng INT ... – aviv

+0

, vì giao diện db không hỗ trợ điều này. Tất cả những gì bạn nhận được từ db là một chuỗi các chuỗi.Bạn có thể chuyển đổi một số chuỗi này thành một chuỗi khác ở cấp ứng dụng, nhưng điều này sẽ không xảy ra "tự động" mà không có lớp ORM đầy đủ. – user187291

3

Thật không may, với PHP < = 5.2, MySQL chức năng/lớp (tức là mysql_*, mysqli_*, và PDO) đều dựa trên libmysql - một thư viện C cung cấp hỗ trợ cho giao tiếp với máy chủ MySQL.

Chức năng sử dụng thư viện đó luôn trả về chuỗi, ngay cả đối với cột nguyên và cột nổi - và không có gì bạn có thể làm: giải pháp duy nhất là có một số "lớp bản đồ" (như ORM) biết ", ở phía PHP, loại mỗi cột sẽ là, và sẽ thực hiện chuyển đổi mỗi khi một số dữ liệu được tìm nạp từ cơ sở dữ liệu.

Lưu ý: cách bạn chèn dữ liệu không thay đổi bất kỳ điều gì về thực tế là bạn sẽ nhận được chuỗi khi tìm nạp dữ liệu từ DB.


Với PHP> = 5.3, các chức năng liên lạc với máy chủ MySQL có thể sử dụng mysqlnd (MySQL Native Driver) thay vì libmysql - điều này phải được cấu hình tại thời gian biên dịch.

Và có thể giao tiếp với các kiểu dữ liệu "gốc", trong một số trường hợp nhất định, là một trong những điều tốt đẹp mà mysqlnd cung cấp; về điều đó, cần có một vài thông tin thú vị là bài viết này: PHP: New network traffic, CPU and memory savings with mysqlnd.


Để làm cho mọi thứ ngắn:

  • Với PHP 5.2, bạn sẽ chỉ nhận được chuỗi từ cơ sở dữ liệu; và bạn sẽ phải thực hiện một số loại chuyển đổi cho mình
  • Với PHP 5.3, bạn có thể nhận được kiểu dữ liệu gốc - ít nhất trong một số trường hợp.
+0

Rất khai sáng. Cảm ơn bạn ! – aviv

Các vấn đề liên quan