Sqlsrv获取主键出错

浏览:961 发布日期:2014/09/12
3.2.2 - 致命 - 未处理
文件:Think/Library/Think/Db/Driver/Sqlsrv.class.php
方法:getFields
问题:当一张表包含外键、主键、唯一键等键值时,原代码无法准确获取到主键
解决方法:已写在代码中
代码:/**
     * 取得数据表的字段信息
     * @access public
     * @return array
     */
    public function getFields($tableName) {
        $result = $this->query("
            SELECT column_name,data_type,column_default,is_nullable
            FROM   information_schema.tables AS t
            JOIN   information_schema.columns AS c
            ON     t.table_catalog = c.table_catalog
            AND    t.table_schema  = c.table_schema
            AND    t.table_name    = c.table_name
            WHERE  t.table_name = '{$tableName}'");
        // 原
        //$pk = $this->query("SELECT * FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE TABLE_NAME='{$tableName}'");
        
        // 林博-2014.8.25,原因:由于上面的sql语句执行结果包含了外键、主键、唯一键等键值,而下面的代码在取主键时,只是取了索引为0的键,但不一定是主键,所以可能会出现主键出错的问题,用下面这种方法就能解决这个问题
        $query = sqlsrv_query($this->_linkID,"EXEC sp_pkeys @table_name='{$tableName}'");
        $pk = sqlsrv_fetch_array($query, SQLSRV_FETCH_ASSOC);
        
        $info = array();
        if($result) {
            foreach ($result as $key => $val) {
                $info[$val['column_name']] = array(
                    'name'    => $val['column_name'],
                    'type'    => $val['data_type'],
                    'notnull' => (bool) ($val['is_nullable'] === ''), // not null is empty, null is yes
                    'default' => $val['column_default'],
                    //'primary' => $val['column_name'] == $pk[0]['COLUMN_NAME'],// 原
                    'primary' => $val['column_name'] == $pk['COLUMN_NAME'],// 林博-2014.8.25
                    'autoinc' => false,
                );
            }
        }
        return $info;
    }
评论(
后面还有条评论,点击查看>>