PHP:如何根据MySQL类型转换mysqli_result-> fetch_object()的属性?

时间:2013-11-18 22:56:53

标签: php mysql casting mysqli

我正在尝试根据MySQL中定义的类型强制转换mysqli_result->fetch_object()的属性。

例如,如果MySQL中的id列为bigint(20),我希望mysqli_result->fetch_object()->id为整数,而不是字符串。

根据docs,此方法返回字符串属性的对象。是否可以获取数据类型?

3 个答案:

答案 0 :(得分:6)

您可以执行此操作以获取结果集上的详细元数据信息:$mysqli->fetch_field_direct()

页面上的示例:

<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");

/* check connection */
if (mysqli_connect_errno()) {
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
}

$query = "SELECT Name, SurfaceArea from Country ORDER BY Name LIMIT 5";

if ($result = $mysqli->query($query)) {

    /* Get field information for column 'SurfaceArea' */
    $finfo = $result->fetch_field_direct(1);

    printf("Name:     %s\n", $finfo->name);
    printf("Table:    %s\n", $finfo->table);
    printf("max. Len: %d\n", $finfo->max_length);
    printf("Flags:    %d\n", $finfo->flags);
    printf("Type:     %d\n", $finfo->type);

    $result->close();
}

/* close connection */
$mysqli->close();
?>

这些是type

的枚举值
enum_field_types {
   MYSQL_TYPE_DECIMAL,
   MYSQL_TYPE_TINY,
   MYSQL_TYPE_SHORT,
   MYSQL_TYPE_LONG,
   MYSQL_TYPE_FLOAT,
   MYSQL_TYPE_DOUBLE,
   MYSQL_TYPE_NULL,
   MYSQL_TYPE_TIMESTAMP,
   MYSQL_TYPE_LONGLONG,
   MYSQL_TYPE_INT24,
   MYSQL_TYPE_DATE, 
   MYSQL_TYPE_TIME,
   MYSQL_TYPE_DATETIME, 
   MYSQL_TYPE_YEAR,
   MYSQL_TYPE_NEWDATE, 
   MYSQL_TYPE_VARCHAR,
   MYSQL_TYPE_BIT,
   MYSQL_TYPE_NEWDECIMAL=246,
   MYSQL_TYPE_ENUM=247,
   MYSQL_TYPE_SET=248,
   MYSQL_TYPE_TINY_BLOB=249,
   MYSQL_TYPE_MEDIUM_BLOB=250,
   MYSQL_TYPE_LONG_BLOB=251,
   MYSQL_TYPE_BLOB=252,
   MYSQL_TYPE_VAR_STRING=253,
   MYSQL_TYPE_STRING=254,
   MYSQL_TYPE_GEOMETRY=255
};

这是我写的关于此主题的非常详细的答案:https://stackoverflow.com/a/19761805/623952 - 它向您展示了如何将其与查询结果合并。该问题的OP是西班牙语(我认为?)所以行集称为$proceso(而不是正常的“$ row”),并且他们的查询包含limit 1,因此请考虑这一点。

这是一个片段......但你应该去看看整个答案,因为我收录了很多额外的细节和信息。

<?php
$mysqli = mysqli_connect("localhost", "root", "", "test");

// this came from http://php.net/manual/en/mysqli-result.fetch-field-direct.php 
$mysql_data_type_hash = array(
    1=>'tinyint',
    2=>'smallint',
    3=>'int',
    4=>'float',
    5=>'double',
    7=>'timestamp',
    8=>'bigint',
    9=>'mediumint',
    10=>'date',
    11=>'time',
    12=>'datetime',
    13=>'year',
    16=>'bit',
    //252 is currently mapped to all text and blob types (MySQL 5.0.51a)
    253=>'varchar',
    254=>'char',
    246=>'decimal'
);

// run the query... 
$result = $mysqli->query("select * from user limit 1"); 

// get one row of data from the query results 
$proceso = mysqli_fetch_assoc($result);

print "<table>
        <tr>
           <th>\$key</th>
           <th>\$value</th>
           <th>\$datatype</th>
           <th>\$dt_str</th>
        </tr>  ";

// to count columns for fetch_field_direct()
$count = 0; 

// foreach column in that row...
foreach ($proceso as $key => $value) 
{
  $datatype = $result->fetch_field_direct($count)->type;  
  $dt_str   = $mysql_data_type_hash[$datatype];
  $value    = (empty($value)) ? 'null' : $value;  

  print "<tr>
           <td>$key</td>
           <td>$value</td>
           <td class='right'>$datatype</td>
           <td>$dt_str</td>
         </tr>  ";  
  $count++; 
} 

print "</table>"; 

mysqli_close($mysqli);
?> 

答案 1 :(得分:0)

是的,这是可能的,虽然它确实绕道而行。

MySQL INFORMATION_SCHEMA包含有关表,列,数据类型,键,索引等的所有信息。

答案 2 :(得分:0)

通常,这种赋值是使用对象关系映射器(ORM)完成的。这些通常允许您提供有关列的元数据,这些元数据可用于设置返回(“映射”)值的类型。你可以实现一些东西。您可以使用class_name方法的fetch_object参数并在指定类的setter中实现此类转换来自己实现类似的东西。

或者,一些ORM使用来自INFORMATION_SCHEMA的MySQL元数据,从而提供了一种更动态(虽然可以说性能更低)的映射方式。