【问题标题】:Make mysql_fetch_assoc automatically detect return data types?让mysql_fetch_assoc 自动检测返回数据类型?
【发布时间】:2010-10-30 11:56:33
【问题描述】:

在 PHP 中使用 mysql_fetch_assoc 时,如何让它返回正确的数据类型?现在它似乎将所有内容都转换为字符串,我更喜欢将 Ints 保留为 Ints,并以某种方式将 Date/Time 指定为 Object 或与字符串不同。

这样做的原因是我使用 PHP 作为 Flex 应用程序的后端,而 Flex 有一些功能,例如自动检测返回类型,如果所有内容都以字符串形式出现,这些功能就不能很好地工作。

【问题讨论】:

  • 好问题,当您真正需要保留数据类型时,有时松散类型的语言可能会很痛苦。
  • 我的解决方案对您有用吗?另外,如果您喜欢我的回答,可以将其标记为已接受吗? SO 系统为您接受了它,但即使它显示为已接受,我也只能以这种方式获得一半的赏金。谢谢
  • 好的,谢谢你,很抱歉这不是你想要的。祝你好运。

标签: php mysql database types


【解决方案1】:

您可以在 mdb2 周围构建一个特定于 mysql 的层,使用 SHOW COLUMNS 命令自动检测字段类型,但这有点违背使用 mdb2 的目的。

请记住,mysql 支持的整数远远超出 PHP 的范围,(UNSIGNED BIGINT 是 64 位;PHP 最多支持 64 位 signed 整数,而在 32 位平台上则更少) 所以在某些情况下自动转换可能是不可取的。在这些情况下,您真的希望将大整数保留为字符串形式,并使用 bcmath

操作它们

【讨论】:

    【解决方案2】:

    我认为这里的一个好策略是以编程方式确定表中每一列的数据类型,并相应地转换返回的结果。这将允许您以更一致和更简单的方式与数据库交互,同时仍为您提供所需的控制,让您的变量存储正确的数据类型。

    一种可能的解决方案:您可以使用 mysql_fetch_field() 来获取一个包含有关表列的元数据的对象,然后将您的字符串转换回所需的类型。

    //run query and get field information about the row in the table
    $meta = mysql_fetch_field($result, $i);
    
    //get the field type of the current column
    $fieldType = $meta->type
    

    可以在此处找到完整示例:http://us2.php.net/manual/en/function.mysql-fetch-field.php

    由于 PHP 是松散类型的,你应该可以相对轻松地使用它。

    如果您使用 OO(面向对象)技术,您可以在 setter() 方法中创建一个具有此功能的类,这样您就不必有重复的代码。

    【讨论】:

      【解决方案3】:

      我想分享一个我为同样的问题编写的函数。传递查询结果$rs 并得到一个转换后的数据的 assoc 数组作为返回:

      function cast_query_results($rs) {
          $fields = mysqli_fetch_fields($rs);
          $data = array();
          $types = array();
          foreach($fields as $field) {
              switch($field->type) {
                  case 3:
                      $types[$field->name] = 'int';
                      break;
                  case 4:
                      $types[$field->name] = 'float';
                      break;
                  default:
                      $types[$field->name] = 'string';
                      break;
              }
          }
          while($row=mysqli_fetch_assoc($rs)) array_push($data,$row);
          for($i=0;$i<count($data);$i++) {
              foreach($types as $name => $type) {
                  settype($data[$i][$name], $type);
              }
          }
          return $data;
      }
      

      示例用法:

      $dbconn = mysqli_connect('localhost','user','passwd','tablename');
      $rs = mysqli_query($dbconn, "SELECT * FROM Matches");
      $matches = cast_query_results($rs);
      // $matches is now a assoc array of rows properly casted to ints/floats/strings
      

      【讨论】:

        【解决方案4】:

        只是为 mastermind202 处理更多数据类型的答案做出了小改进。感谢策划者完成繁重的工作!

        function cast_query_results($rs) {
            $fields = mysqli_fetch_fields($rs);
            $data = array();
            $types = array();
            foreach($fields as $field) {
                switch($field->type) {
                    case MYSQLI_TYPE_NULL:
                        $types[$field->name] = 'null';
                        break;
                    case MYSQLI_TYPE_BIT:
                        $types[$field->name] = 'boolean';
                        break;
                    case MYSQLI_TYPE_TINY:
                    case MYSQLI_TYPE_SHORT:
                    case MYSQLI_TYPE_LONG:
                    case MYSQLI_TYPE_INT24:
                    case MYSQLI_TYPE_LONGLONG:
                        $types[$field->name] = 'int';
                        break;
                    case MYSQLI_TYPE_FLOAT:
                    case MYSQLI_TYPE_DOUBLE:
                        $types[$field->name] = 'float';
                        break;
                    default:
                        $types[$field->name] = 'string';
                        break;
                }
            }
            while($row=mysqli_fetch_assoc($rs)) array_push($data,$row);
            for($i=0;$i<count($data);$i++) {
                foreach($types as $name => $type) {
                    settype($data[$i][$name], $type);
                }
            }
            return $data;
        }   
        

        示例用法:

        $db = mysqli_connect(...);
        $rs = mysqli_query($db, "SELECT ...");
        $results = cast_query_results($rs);
        

        返回具有正确类型字段的关联行数组

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-07-02
          • 1970-01-01
          • 1970-01-01
          • 2019-12-29
          • 2021-05-14
          • 2014-01-22
          相关资源
          最近更新 更多