php - 尝试获取列数据时,类返回整数而不是对象

标签 php mysql class pdo

刚刚进入 OOP,并从 mysql 查询更改为 PDO。我正在尝试创建一个类来返回表的列名和元数据。这样我就可以输出我使用的所有表的复制/粘贴数据。我已经使用这样一个基于 mysql 扩展的工具很多年了,它会输出诸如完整的 SELECT/INSERT/UPDATE 查询之类的变体。除此之外,我现在想为存储过程添加 DECLARE 列表 - 因此获取类型和长度等元数据至关重要。对于跨两个模式的大约 150 个表,这种自动化至关重要。

由于对 getColumnMeta 的可靠性不确定,我寻找代码并在 Sitepoint answer 中找到了看起来不错的内容。 。我试图将它包装在一个类中并模仿其原始上下文,但当我尝试 echo 或 print_r 响应时,我只是得到一个数字 1。我在尝试解决方案时也遇到过“不是对象”错误消息。

这是调用代码

$db_host="localhost";
$db_username='root';
$db_pass='';
$db_name='mydatabase';
try{
    $db= new PDO('mysql:host='.$db_host.';dbname='.$db_name,$db_username,$db_pass, array(PDO::ATTR_PERSISTENT=>false));
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
}
catch(PDOException $e){echo "Error: ".$e->getMessage()."<br />"; die(); }
include 'ColMetaData.php';   //the file containing the class for getting a column listing for each table
$coldat= new supplyColumnMeta($db);
$tablemet=$coldat->getColumnMeta('groups');   // a manual insertion of a table name for testing
echo $tablemet;

这是包含文件中的类 类 SupplyColumnMeta{ 公共(public)函数 __construct($db){ $this->db=$db;

    }
    /**
        *    Automatically get column metadata
    */
    public function getColumnMeta($table)
    {$this->tableName=$table;
        // Clear any previous column/field info
        $this->_fields = array();
        $this->_fieldMeta = array();
        $this->_primaryKey = NULL;

        // Automatically retrieve column information if column info not specified
        if(count($this->_fields) == 0 || count($this->_fieldMeta) == 0)
        {
            // Fetch all columns and store in $this->fields
            $columns = $this->db->query("SHOW COLUMNS FROM " . $this->tableName, PDO::FETCH_ASSOC);
            foreach($columns as $key => $col)
            {
                // Insert into fields array
                $colname = $col['Field'];
                $this->_fields[$colname] = $col;
                if($col['Key'] == "PRI" && empty($this->_primaryKey)) {
                    $this->_primaryKey = $colname;
                }

                // Set field types
                $colType = $this->parseColumnType($col['Type']);
                $this->_fieldMeta[$colname] = $colType;
            }
        }
        return true;
    }
    protected function parseColumnType($colType)
    {
        $colInfo = array();
        $colParts = explode(" ", $colType);
        if($fparen = strpos($colParts[0], "("))
        {
            $colInfo['type'] = substr($colParts[0], 0, $fparen);
            $colInfo['pdoType'] = '';
            $colInfo['length']  = str_replace(")", "", substr($colParts[0], $fparen+1));
            $colInfo['attributes'] = isset($colParts[1]) ? $colParts[1] : NULL;
        }
        else
        {
            $colInfo['type'] = $colParts[0];
        }   
        // PDO Bind types
        $pdoType = '';
        foreach($this->_pdoBindTypes as $pKey => $pType)
        {
            if(strpos(' '.strtolower($colInfo['type']).' ', $pKey)) {
                $colInfo['pdoType'] = $pType;
                break;
                } else {
                $colInfo['pdoType'] = PDO::PARAM_STR;
            }
        }       
        return $colInfo;
    }
    /**
        *    Will attempt to bind columns with datatypes based on parts of the column type name
        *    Any part of the name below will be picked up and converted unless otherwise sepcified
        *     Example: 'VARCHAR' columns have 'CHAR' in them, so 'char' => PDO::PARAM_STR will convert
        *    all columns of that type to be bound as PDO::PARAM_STR
        *    If there is no specification for a column type, column will be bound as PDO::PARAM_STR
    */
    protected $_pdoBindTypes = array(
    'char' => PDO::PARAM_STR,
    'int' => PDO::PARAM_INT,
    'bool' => PDO::PARAM_BOOL,
    'date' => PDO::PARAM_STR,
    'time' => PDO::PARAM_INT,
    'text' => PDO::PARAM_STR,
    'blob' => PDO::PARAM_LOB,
    'binary' => PDO::PARAM_LOB
    );  
}

最佳答案

问题是这样的:

public function getColumnMeta($table)
{
    $this->tableName=$table;
    // Clear any previous column/field info
    $this->_fields = array();
    $this->_fieldMeta = array();
    $this->_primaryKey = NULL;

    // Automatically retrieve column information if column info not specified
    if(count($this->_fields) == 0 || count($this->_fieldMeta) == 0)
    {
        // Fetch all columns and store in $this->fields
        $columns = $this->db->query("SHOW COLUMNS FROM " . $this->tableName, PDO::FETCH_ASSOC);
        foreach($columns as $key => $col)
        {
            // Insert into fields array
            $colname = $col['Field'];
            $this->_fields[$colname] = $col;
            if($col['Key'] == "PRI" && empty($this->_primaryKey)) {
                $this->_primaryKey = $colname;
            }

            // Set field types
            $colType = $this->parseColumnType($col['Type']);
            $this->_fieldMeta[$colname] = $colType;
        }
    }
    return true;//<<--- not returning an object/array!
}

您的getColumnMeta方法返回一个 bool 值true。当然,该值的字符串表示形式是 1。如果您希望此方法返回所有元数据,请将 return 语句更改为如下所示:

    return array(
        'fields'  => $this->_fields,
        'meta'    => $this->_fieldMeta,
        'primary' => $this->_primaryKey
    );

您的代码还存在一些其他问题,但由于这不是 codereview.stackexchange,因此我不会介绍太多细节。不过,我要说的是:请尝试遵循大多数主要参与者遵守的编码标准:这些标准可以在这里找到:PHP-FIG .

哦,如果您想显示元数据,请不要回显它们,而是var_dump print_r 它们,当你返回一个数组或一个对象时。
或者至少 echo json_encode($instance->getColumnMeta($table)); 来获取返回值的正确字符串表示形式。

关于php - 尝试获取列数据时,类返回整数而不是对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21815459/

相关文章:

Mysql交叉表查询百分比计数?

c++ - 仅使用 DLL *.h 头文件构建(编译链接)应用程序代码并在运行时加载 DLL 实现(显式链接)

javascript - 如何在 dropzone 插件中添加 removefile 选项?

php - 如何转换php中的一些特殊字符?

php - 在php中用_替换空格

php - 嵌套 MySQLI 查询

MySQL - 自动/计划 SQL 更新表

c++ - 类指针错误 : does not have a type

c++ - unique_ptr 的多个实例

php - 从移动版切换到完整网站(桌面版)