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;
} 