2009-06-01 22 views
7

Khi sử dụng mysql_fetch_assoc trong PHP, làm thế nào tôi có thể làm cho nó trả về các kiểu dữ liệu chính xác? Ngay bây giờ nó xuất hiện để chuyển đổi tất cả mọi thứ để dây, tôi muốn nếu nó rời Ints như Ints, và bằng cách nào đó được chỉ định ngày/thời gian như là một trong hai đối tượng hoặc bằng cách nào đó khác hơn so với dây.Làm cho mysql_fetch_assoc tự động phát hiện các kiểu dữ liệu trả về?

Lý do cho điều này là tôi đang sử dụng PHP làm phụ trợ cho ứng dụng Flex và Flex có một số tính năng như tự động phát hiện các loại trả lại, không hoạt động tốt nếu mọi thứ xuất hiện dưới dạng chuỗi.

+0

câu hỏi hay, đôi khi ngôn ngữ lỏng lẻo có thể là một nỗi đau khi bạn thực sự cần phải bảo quản các kiểu dữ liệu của bạn . –

+0

Giải pháp của tôi có hiệu quả với bạn không?Ngoài ra, nếu bạn thích câu trả lời của tôi, bạn có thể đánh dấu nó như được chấp nhận không? Hệ thống SO chấp nhận nó cho bạn nhưng tôi chỉ nhận được một nửa số tiền thưởng theo cách này mặc dù nó hiển thị như được chấp nhận. Cảm ơn bạn –

+0

ok, cảm ơn bạn và xin lỗi nó không chính xác những gì bạn đang tìm kiếm. Chúc may mắn với vấn đề của bạn. –

Trả lời

14

Tôi nghĩ rằng một chiến lược tốt ở đây là xác định một cách có lập trình kiểu dữ liệu của mỗi cột trong một bảng và đưa kết quả trả về cho phù hợp. Điều này sẽ cho phép bạn tương tác với cơ sở dữ liệu của bạn một cách nhất quán và đơn giản hơn trong khi vẫn cung cấp cho bạn sự kiểm soát mà bạn cần phải có các biến lưu trữ đúng kiểu dữ liệu.

Một giải pháp khả thi: Bạn có thể sử dụng mysql _ lấy _ trường() để có được một đối tượng chứa siêu dữ liệu về các cột trong bảng và sau đó đúc chuỗi của bạn trở lại với loại mong muốn.

//run query and get field information about the row in the table 
$meta = mysql_fetch_field($result, $i); 

//get the field type of the current column 
$fieldType = $meta->type 

Một ví dụ đầy đủ có thể được tìm thấy ở đây: http://us2.php.net/manual/en/function.mysql-fetch-field.php

Kể từ PHP được loại lỏng lẻo, bạn nên có một thời gian tương đối dễ dàng với điều này.

Nếu bạn đang sử dụng các kỹ thuật OO (hướng đối tượng), bạn có thể tạo lớp với chức năng này trong phương thức setter() để bạn không phải có mã trùng lặp.

0

Bạn có thể xây dựng một lớp mysql cụ thể xung quanh mdb2 tự động phát hiện các loại trường bằng cách sử dụng lệnh SHOW COLUMNS, nhưng điều đó sẽ đánh bại mục đích sử dụng mdb2. Hãy nhớ rằng, mysql cũng hỗ trợ các số nguyên bên ngoài phạm vi của PHP, (KHÔNG ĐƯỢC CHUYỂN ĐỔI LỚN là 64 bit; PHP hỗ trợ, tốt nhất, 64 bit đã ký ints và ít hơn trên nền tảng bit 32) để tự động truyền có thể không mong muốn trong một số ngữ cảnh. Trong những trường hợp đó, bạn thực sự muốn giữ các ints lớn trong dạng chuỗi của chúng và thao tác chúng với bcmath

0

Tôi muốn chia sẻ một chức năng tôi đã viết cho cùng một vấn đề này. Vượt qua kết quả truy vấn $rs và có được một mảng assoc của dữ liệu đúc như sự trở lại:

function cast_query_results($rs) { 
    $fields = mysqli_fetch_fields($rs); 
    $data = array(); 
    $types = array(); 
    foreach($fields as $field) { 
     switch($field->type) { 
      case 3: 
       $types[$field->name] = 'int'; 
       break; 
      case 4: 
       $types[$field->name] = 'float'; 
       break; 
      default: 
       $types[$field->name] = 'string'; 
       break; 
     } 
    } 
    while($row=mysqli_fetch_assoc($rs)) array_push($data,$row); 
    for($i=0;$i<count($data);$i++) { 
     foreach($types as $name => $type) { 
      settype($data[$i][$name], $type); 
     } 
    } 
    return $data; 
} 

Ví dụ sử dụng:

$dbconn = mysqli_connect('localhost','user','passwd','tablename'); 
$rs = mysqli_query($dbconn, "SELECT * FROM Matches"); 
$matches = cast_query_results($rs); 
// $matches is now a assoc array of rows properly casted to ints/floats/strings 
1

Chỉ cần góp một cải tiến nhỏ để trả lời mastermind202 để xử lý nhiều loại dữ liệu . Cảm ơn sư phụ đã làm việc nặng nhọc!

function cast_query_results($rs) { 
    $fields = mysqli_fetch_fields($rs); 
    $data = array(); 
    $types = array(); 
    foreach($fields as $field) { 
     switch($field->type) { 
      case MYSQLI_TYPE_NULL: 
       $types[$field->name] = 'null'; 
       break; 
      case MYSQLI_TYPE_BIT: 
       $types[$field->name] = 'boolean'; 
       break; 
      case MYSQLI_TYPE_TINY: 
      case MYSQLI_TYPE_SHORT: 
      case MYSQLI_TYPE_LONG: 
      case MYSQLI_TYPE_INT24: 
      case MYSQLI_TYPE_LONGLONG: 
       $types[$field->name] = 'int'; 
       break; 
      case MYSQLI_TYPE_FLOAT: 
      case MYSQLI_TYPE_DOUBLE: 
       $types[$field->name] = 'float'; 
       break; 
      default: 
       $types[$field->name] = 'string'; 
       break; 
     } 
    } 
    while($row=mysqli_fetch_assoc($rs)) array_push($data,$row); 
    for($i=0;$i<count($data);$i++) { 
     foreach($types as $name => $type) { 
      settype($data[$i][$name], $type); 
     } 
    } 
    return $data; 
} 

Ví dụ sử dụng:

$db = mysqli_connect(...); 
$rs = mysqli_query($db, "SELECT ..."); 
$results = cast_query_results($rs); 

Trả về một mảng kết hợp của hàng với các lĩnh vực gõ đúng

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