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

Sha*_*vil 4 php mysql mysqli casting

我试图mysqli_result->fetch_object()基于MySQL中定义的类型来转换属性.

例如,如果我的idbigint(20)在MySQL中,我想mysqli_result->fetch_object()->id成为一个整数,而不是一个字符串.

根据文档,此方法返回字符串属性的对象.是否有可能获得数据类型?

glo*_*uin 7

您可以这样做以获得结果集上的详细元数据信息:$ 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();
?>
Run Code Online (Sandbox Code Playgroud)

这些是以下内容的枚举值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
};
Run Code Online (Sandbox Code Playgroud)

这是我写的关于这个主题的非常详细的答案:https: //stackoverflow.com/a/19761805/623952 - 它向您展示了如何将其与查询结果合并.该问题的OP是西班牙语(我认为?)所以行集被调用$proceso(而不是正常的"$ row")并且他们的查询包括a 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);
?> 
Run Code Online (Sandbox Code Playgroud)