thinkPHP5使用sqlsrv时发现的一个BUG以及解决方案

浏览:1067 发布日期:2017/11/02 分类:ThinkPHP5专区
公司要求使用sql server,而且数据库都已经建立好了,我没有接触过 sql server,今天在使用的时候发现正常的 save() 一直提示字段不存在。同样的代码我切换为 mysql 是正常的。
于是开始怀疑是表名的问题,我 sql server 中表名是 stock ,架构是 product ,连起来应该是 product.stock,所以在model中我这样写 protected $table = 'product.stock';

一直报错找不到字段,一路追踪找到了这个位置 \thinkphp\library\think\db\connector\Sqlsrv.php 第50行,

public function getFields($tableName)
{
list($tableName) = explode(' ', $tableName); //tp5
$sql = "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'";
...

这样一来经过 list 那条语句时 $tableName 的值并没有变化,这段$sql执行起来也不能返回出表信息
于是我按照 list 的语句,重新写了我的 model 里的语句:protected $table = 'stock product';
这样一来能获取整张表的信息了,但是在 insert 时又会出错,很明显 'insert into stock product .....' 怎么看都是错的
既然这里不能改,就只能改 list 语句了

// list($tableName) = explode(' ', $tableName); //tp5
list($schema, $tableName) = explode('.', $tableName); // chunboli
这样修改之后就可以正常使用了。

事后我查阅了tp论坛,发现关于sql server的讨论很少,即便有人使用也没有人报出这个错误。
我不知道是他们没遇到,还是没有使用 sql server的"架构"命名方式。
官方文档也没有提到 遇到 这种情况怎么办,我只能这样临时手动改了。

如果tp5有相应解决办法,请指出。如果没有考虑过这种情况请改进。
最佳答案
评论( 相关
后面还有条评论,点击查看>>