2010-03-12 37 views
18

Tôi đã thử tìm nạp kết quả truy vấn MySQL bằng cách sử dụng các giá trị số mysql_fetch_row()mysql_result() và số đang được trả về dưới dạng chuỗi.Nhận kết quả truy vấn MySQL dưới dạng kiểu dữ liệu gốc của chúng?

Có cách nào để tìm nạp dữ liệu dưới dạng kiểu dữ liệu được lưu trữ trong bảng không?

Ứng dụng sẽ truy vấn nhiều truy vấn khác nhau vì vậy tôi sẽ không thể truyền các giá trị dưới dạng kiểu dữ liệu dự định trên cơ sở 1 của 1.

Trả lời

14

Tôi không nghĩ rằng nhận được dữ liệu trong kiểu dữ liệu mẹ đẻ của họ (tức là bất cứ điều gì khác mà chuỗi) thể được thực hiện trong PHP 5.2 ...

Trong PHP 5.3, nó trở thành có thể, nếu tôi nhớ không lầm, khi bạn đang sử dụng mới (mới như trong PHP> = 5.3) mysqlnd (Trình điều khiển gốc của MySQL) trình điều khiển.

Sau khi đào bới hơn thông qua bookmark của tôi, tôi tìm thấy bài viết này về mysqlnd: PDO_MYSQLND: The new features of PDO_MYSQL in PHP 5.3

Nó nói này (báo giá):

Ưu điểm của việc sử dụng mysqlnd cho PDO

mysqlnd trả về quê hương loại dữ liệu khi sử dụng báo cáo được chuẩn bị phía máy chủ, ví dụ: cột INT được trả lại dưới dạng số nguyên variabl e không phải là một chuỗi . Điều đó có nghĩa là ít dữ liệu hơn chuyển đổi nội bộ.

Nhưng đây là PHP 5.3 chỉ (được cung cấp phiên bản của PHP 5.3 được biên soạn với mysqlnd (và không phải là libmysql cũ)), và dường như chỉ là trường hợp cho chuẩn bị phát biểu :-(

nào không thực hiện khá giúp đỡ, trong tình huống của bạn, tôi đoán ...


Và đây là một khác, vẫn về các tính năng mới của mysqlnd, mà nói về vấn đề này không chỉ chuẩn bị phát biểu:. PHP: New network traffic, CPU and memory savings with mysqlnd

Không chắc chắn điều này đã được sáp nhập vào trình điều khiển mysqlnd chính thức, mặc dù - cách tốt nhất là để thử; nhưng nó vẫn sẽ PHP> = 5,3 chỉ, dù sao ...


Một giải pháp khác là nên có, trên PHP-side, một số loại một ánh xạ hệ thống (như một ORM) để chuyển đổi kết quả đến từ DB để kiểu dữ liệu PHP ...

và vâng, điều này là xấu nếu bạn muốn sử dụng khai thác như ===!==, đó là loại nhạy cảm ...

+0

Cảm ơn Pascal MARTIN! Tôi đã googling trong vài giờ và đã không tìm thấy bất cứ điều gì tôi có thể sử dụng. Tôi tương đối mới với PHP, nhưng có vẻ như tôi sẽ cần phải đi với PDO nếu tôi muốn hỗ trợ bản địa. Rất tiếc, máy chủ của tôi đang chạy 5.2.something ... Cũng khó khăn, là tôi đang cố gắng tạo đầu vào tệp báo cáo xml chứa thông tin truy vấn khác nhau. Kịch bản PHP đọc tệp xml được yêu cầu và gửi các truy vấn đến cơ sở dữ liệu, vì vậy tôi thực sự sẽ không bao giờ biết dữ liệu nào được truy vấn và cách nó được trả về. thời gian để sáng tạo Tôi đoán :) –

+1

PDO hay không PDO không được thay đổi bất cứ điều gì, trong trường hợp này: điều quan trọng là trình điều khiển được sử dụng bên dưới * (tức là libmysql vs mysqlnd) * - và tôi thậm chí không chắc chắn mysqlnd trong PHP 5.3.2 trả về kiểu gốc cho các truy vấn chuẩn ;;; trong trường hợp của bạn, anyway, với PHP 5.2, giải pháp duy nhất bạn sẽ có sẽ là một số lớp bản đồ, mà loại chuyển đổi khi cần thiết ... –

+0

Lưu ý rằng bạn cần phải [tắt giả lập câu lệnh đã chuẩn bị] (http://stackoverflow.com/a/15592818/441684) nếu sử dụng PDO. –

3

tôi đã thực hiện điều này cách thủ công. Nó thực sự không quá tệ, chỉ là một vài dòng.

Như đã đề xuất, hãy gọi mysqli_fetch_fields() trên tài nguyên phát sinh từ truy vấn của bạn.Sau đó, từ việc ánh xạ các kiểu số của trường PHP sang kiểu dữ liệu MySQL (xem công việc khó khăn ở đây http://www.php.net/manual/en/mysqli-result.fetch-field-direct.php), bạn có thể chuyển đổi các giá trị của mình từ nhiều loại cơ sở dữ liệu được trả về thành chuỗi thích hợp trong PHP.

Bao nhiêu chậm lại, tôi không chắc chắn tho.

+0

đây chính xác là những gì tôi cần. Cảm ơn! – jbrahy

1

Tôi đã viết một hàm để circuvent này (đối với PDO):

/** 
* Converts columns from strings to types according to 
* PDOStatement::columnMeta 
* 
* @param PDOStatement $st 
* @param array $assoc returned by PDOStatement::fetch with PDO::FETCH_ASSOC 
* @return copy of $assoc with matching type fields 
*/ 
function convertTypes(PDOStatement $statement, $assoc) 
{ 
    for ($i = 0; $columnMeta = $statement->getColumnMeta($i); $i++) 
    { 
     $type = $columnMeta['native_type']; 

     switch($type) 
     { 
      case 'DECIMAL': 
      case 'TINY': 
      case 'SHORT': 
      case 'LONG': 
      case 'LONGLONG': 
      case 'INT24': 
       $assoc[$columnMeta['name']] = (int) $assoc[$columnMeta['name']]; 
       break; 
      case 'DATETIME': 
      case 'DATE': 
      case 'TIMESTAMP': 
       $assoc[$columnMeta['name']] = strtotime($assoc[$columnMeta['name']]); 
       break; 
      // default: keep as string 
     } 
    } 

    return $assoc; 
} 

Tất nhiên danh sách loại chưa hoàn chỉnh và chuyển đổi được quá đơn giản hóa, nhưng có thể hữu ích cho sự khởi đầu.

3

thử này nếu sử dụng mysqli thay vì PDO

$mysqli->options(MYSQLI_OPT_INT_AND_FLOAT_NATIVE, 1); 
+0

Điều này đã làm công việc của tôi cho tôi. Cảm ơn bạn! – Victor

-1

Ngoài Pascal MARTIN câu trả lời, nếu bạn sử dụng MySQLi cũng nên làm việc. Hãy thử điều này:

<?php 
$mysqli = new mysqli("example.com", "user", "password", "database"); 
if ($mysqli->connect_errno) { 
    echo "Failed to connect to MySQL: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error; 
} 

if (!$mysqli->query("DROP TABLE IF EXISTS test") || 
    !$mysqli->query("CREATE TABLE test(id INT, label CHAR(1))") || 
    !$mysqli->query("INSERT INTO test(id, label) VALUES (1, 'a')")) { 
    echo "Table creation failed: (" . $mysqli->errno . ") " . $mysqli->error; 
} 

$stmt = $mysqli->prepare("SELECT id, label FROM test WHERE id = 1"); 
$stmt->execute(); 
$res = $stmt->get_result(); 
$row = $res->fetch_assoc(); 

printf("id = %s (%s)\n", $row['id'], gettype($row['id'])); 
printf("label = %s (%s)\n", $row['label'], gettype($row['label'])); 
?> 

Ví dụ trên sẽ ra:

id = 1 (integer) 
label = a (string) 

Bạn có thể nhận được thông tin thêm ở đây: https://dev.mysql.com/doc/apis-php/en/apis-php-mysqli.quickstart.prepared-statements.html

Hope this helps

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