我正在尝试根据MySQL中定义的类型强制转换mysqli_result->fetch_object()
的属性。
例如,如果MySQL中的id
列为bigint(20)
,我希望mysqli_result->fetch_object()->id
为整数,而不是字符串。
根据docs,此方法返回字符串属性的对象。是否可以获取数据类型?
答案 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元数据,从而提供了一种更动态(虽然可以说性能更低)的映射方式。