通过各自的值访问PHP MySQLI预定义常量?

时间:2011-06-30 15:26:27

标签: php reference mysqli constants

我正在编写一个带有mysqli_result的函数,并将所有返回的列添加到结果对象的关联数组中。截至目前,通过mysqli :: multi_query返回的所有内容都是字符串格式,而值应该是什么值类型的描述保存在mysqli :: fetch_fields返回的对象数组中。我觉得到目前为止这很令人困惑,所以让我编写代码

if ($mysqli->multi_query($inputQuery)) {
    if ($result = $mysqli->store_result()) {
        //$fields is an array of custom objects
        $fields = $result->fetch_fields();

        //$fieldType is an integer that is the value of a mysqli predefined constant
        $fieldType = $fields[0]->type;

        if ($curRow = $result->fetch_row()) {
            //No matter what the value type in the database of this item is, and no
            //matter what $fieldType corresponds to, $curVal is going to be a string
            $curVal = $curRow[0];
        }
    }
}

根据我的理解,$fieldType所取的整数是预定义的mysqli常量的值,可在此处找到:http://www.php.net/manual/en/mysqli.constants.php

我知道这里发布了一个类似的问题:PHP mysqli_fetch_field data type但我更感兴趣的是将值映射回各自的键。

我想要做的是根据$curVal到mysqli预定义常量的映射,将$fieldType的字符串值转换为正确的值类型。我想我可以对每个预定义常量进行强力检查,或者我可以创建一个带有值的关联数组 - >键而不是键 - >价值,然后参考,但我觉得应该有一个更容易的方法来解决这个问题。

那么,我的问题是,在PHP中通过其值找到预定义常量的最简单方法是什么?我是否以与访问PHP中的全局常量相同的方式访问这些mysqli预定义常量,还是必须执行$mysqli->PREDEFINED_CONSTANT之类的操作?

致以最诚挚的问候,

2 个答案:

答案 0 :(得分:4)

常量不是对象的一部分,因此使用$ mysqli :: CONSTSANT或$ mysqli-> CONSTANT将无法正常工作。

以下是示例的开头。您必须查看MySQLi constants的其余部分并完成switch语句。未包含的内容将保留字符串。

$result = $mysqli->query('SELECT * FROM `accounts`');
$fields = $result->fetch_fields();

// Loop through each row.
while ( $row = $result->fetch_row() )
{
  // Loop through each field.
  foreach ( $row as $key => &$value )
  {
    // Using the $key, find the type of the current field.
    switch ( $fields[$key]->type )
    {
      // Convert INT to an integer.
      case MYSQLI_TYPE_TINY:
      case MYSQLI_TYPE_SHORT:
      case MYSQLI_TYPE_LONG:
      case MYSQLI_TYPE_LONGLONG:
      case MYSQLI_TYPE_INT24:
        $value = intval($value);

        break;
      // Convert FLOAT to a float.
      case MYSQLI_TYPE_FLOAT:
      case MYSQLI_TYPE_DOUBLE:
        $value = floatval($value);

        break;
      // Convert TIMESTAMP to a DateTime object.
      case MYSQLI_TYPE_TIMESTAMP:
      case MYSQLI_TYPE_DATE:
      case MYSQLI_TYPE_DATETIME:
        $value = new DateTime($value);

        break;
    }
  }

  var_dump($row);
}

答案 1 :(得分:1)

get_defined_constants(),其中列出了所有define()'d常量,然后您可以从中获取它们的值。

尽管如此,这引出了为什么一切都以字符串形式回归的问题。您是否试图通过将所有内容以通用形式存储在一个包含valuetype对的表中来破坏SQL数据库的用途?