安装驱动让PHP可访问MSSQL

  • PHP访问MSSQL的两个方案
    • FreeTDS+DBLIB
    • UnixODBC+SQLSRV
  • Laravel 访问MSSQL
    • 问题1:同时安装了两套方案的情况下,Laravel用什么连接SQL 2005?
    • 问题2: 只装了微软方案的情况下连接SQL08 R2之前版本会怎么样?
  • 如何让Laravel 同时支持两套方案,以连接不同版本的SQLSRV.
    • 修改DatabaseManager.php
    • 修改SqlServerConnetor.php
    • 修改ConnectionFactory.php
    • database.php里driver指定为dblib或sqlsrv
    • 用php artisan tinker 试一下
  • Laravel 5.8及以后如何連接SQL2005及以前版本
    • 修改 SqlServerConnector.php 中getDsn:
    • 在config\database.php 中加個指定dblib的參數

PHP访问MSSQL的两个方案

开源的:FreeTDS+DBLIB 和 闭源的:MS ODBC+SQLSRV.
两种方案都是前一个为Linux系统下驱动,后一个为PHP扩展.

FreeTDS+DBLIB

yum install freetds php72w-pdo_dblib

为什么有MS自家的驱动我们还要用开源的呢?因为M$居然不支持SQL 2008 R2之前的SQL SRV…

vim /etc/freetds.conf

加入要访问的SQL SRV的讯息

[sql01]host = 192.168.0.1port = 1433 #如果用的不是默认实例,自己去SQL SRV配置里去查端口.tds version = 8.0  #不同的SQL SRV 要用不同的版本连,2005用8.0client charset = UTF-8 #这个很重要,对于SQLSRV的collation中文的情况下

此处tds版本选择存在疑问,参考下列文档:
https://www.freetds.org/userguide/ChoosingTdsProtocol.html#ftn.idm68026320

UnixODBC+SQLSRV

为什么有能吃的开源方案还要用MS的残缺方案?因为他自家的东西应该兼容性更好,用起来更安心.

  1. 新增MS的源,然后安装相应的包
$ curl https://packages.microsoft.com/config/rhel/7/prod.repo > /etc/yum.repos.d/mssql-release.repo
$ yum update
$ yum remove unixODBC #不移没事,移了安心,怕有冲突
$ ACCEPT_EULA=Y yum install msodbcsql mssql-tools
$ yum install unixODBC-devel
  1. 安装MS的PHP Driver for SQLSRV
    2.1. 从这里下载https://github.com/Microsoft/msphpsql/releases/tag/v5.3.0
    2.2. 解包安装,然后修改php.ini 以启用扩展
     tar xvzf sqlsrv-5.3.0.tgzcd sqlsrv-5.3.0/phpize./configure --with-php-config=/usr/bin/php-configmakesudo make installecho extension=pdo_sqlsrv.so >> `php --ini | grep "Scan for additional .ini files" | sed -e "s|.*:\s*||"`/30-pdo_sqlsrv.iniecho extension=sqlsrv.so >> `php --ini | grep "Scan for additional .ini files" | sed -e "s|.*:\s*||"`/20-sqlsrv.ini

2.3. 或者可以用 remi 源 用 yum install php-sqlsrv php-pdo_sqlsrv ,或者还可以用 pecl install sqlsrv pecl install pdo_sqlsrv
2.4. 重启Apache或Nginx

Laravel 访问MSSQL

在config/database.php 里配置要访问的SQLSRV,或者先配置.env然后再配置database.php.

'xxxx' => ['driver' => 'sqlsrv',   //这里不能错'host' => env('DB_HOST1', 'localhost'),'port' => env('DB_PORT1', '1433'),'database' => env('DB_DATABASE1', 'forge'),'username' => env('DB_USERNAME1', 'forge'),'password' => env('DB_PASSWORD1', ''),'charset' => 'utf8','prefix' => '',],

问题1:同时安装了两套方案的情况下,Laravel用什么连接SQL 2005?

答案是:FREETDS+DBLIB

问题2: 只装了微软方案的情况下连接SQL08 R2之前版本会怎么样?

SQLSTATE[08001]: [unixODBC][Microsoft][ODBC Driver 17 for SQL Server]TCP Provider: Error code 0x2746"

让Laravel里可自由选择用MS方案或是DBLIB方案

  • PHP访问MSSQL的两个方案
    • FreeTDS+DBLIB
    • UnixODBC+SQLSRV
  • Laravel 访问MSSQL
    • 问题1:同时安装了两套方案的情况下,Laravel用什么连接SQL 2005?
    • 问题2: 只装了微软方案的情况下连接SQL08 R2之前版本会怎么样?
  • 如何让Laravel 同时支持两套方案,以连接不同版本的SQLSRV.
    • 修改DatabaseManager.php
    • 修改SqlServerConnetor.php
    • 修改ConnectionFactory.php
    • database.php里driver指定为dblib或sqlsrv
    • 用php artisan tinker 试一下
  • Laravel 5.8及以后如何連接SQL2005及以前版本
    • 修改 SqlServerConnector.php 中getDsn:
    • 在config\database.php 中加個指定dblib的參數

如何让Laravel 同时支持两套方案,以连接不同版本的SQLSRV.

此行为纯属强迫症,可能没有多少实际意义!

修改DatabaseManager.php

namespace Illuminate\Database;
....
public function supportedDrivers() //Laravel 支持的Drivers{return ['mysql', 'pgsql', 'sqlite', 'sqlsv','dblib'];}public function availableDrivers()//Laravel 可用Drivers{return array_intersect($this->supportedDrivers(),PDO::getAvailableDrivers()//     str_replace('dblib', 'sqlsrv', PDO::getAvailableDrivers()) 不要要dblib替换掉);}

修改SqlServerConnetor.php

namespace Illuminate\Database\Connectors;
.....protected function getDsn(array $config){if($config['driver']=="dblib"){//用dblib支持sql08及以前版本,ms的pdo-sqlsrv支持08R2以后版本return $this->getDblibDsn($config);/*if (in_array('dblib', $this->getAvailableDrivers())) {return $this->getDblibDsn($config);} else*/if ($this->prefersOdbc($config)) {return $this->getOdbcDsn($config);}};return $this->getSqlSrvDsn($config);}

修改ConnectionFactory.php

namespace Illuminate\Database\Connectors;
....有两处,只写一处
switch ($config['driver']) {case 'mysql':return new MySqlConnector;case 'pgsql':return new PostgresConnector;case 'sqlite':return new SQLiteConnector;case 'sqlsrv':return new SqlServerConnector;case 'dblib'://用dblib支持sql2005及以前版本,ms的pdo-sqlsrv支持08以后版本return new SqlServerConnector;}

database.php里driver指定为dblib或sqlsrv

'oooo' => ['driver' => 'dblib','host' => env('DB_HOST1', 'localhost'),'port' => env('DB_PORT1', '1433'),'database' => env('DB_DATABASE1', 'forge'),'username' => env('DB_USERNAME1', 'forge'),'password' => env('DB_PASSWORD1', ''),'charset' => 'utf8','prefix' => '',],

用php artisan tinker 试一下

[root@web02 ldap]# php artisan tinker
Psy Shell v0.9.9 (PHP 7.2.11 — cli) by Justin Hileman
>>> DB::connection('dblib')->select("select count(*) FROM table;")
=> [{#2998+"computed": 2338,},]
>>>

Laravel 5.8及以后如何連接SQL2005及以前版本

修改 SqlServerConnector.php 中getDsn:

if ( ($config['dblib'] ?? null)  === true){ //sql2005及以前必須使用dblib...return $this->getDblibDsn($config);}

在config\database.php 中加個指定dblib的參數

 'hrdb' => ['driver' => 'sqlsrv','url' => env('DATABASE_URL'),'host' => env('DB_HOST', 'localhost'),'port' => env('DB_PORT', '1433'),'database' => env('DB_DATABASE', 'forge'),'username' => env('DB_USERNAME', 'forge'),'password' => env('DB_PASSWORD', ''),'charset' => 'utf8','prefix' => '','prefix_indexes' => true,'dblib' => true,],

Linux下Laravel访问MSSQL的方式小结相关推荐

  1. linux下无法访问硬盘

    当出现在linux下无法访问硬盘并报如下错误时可以采取如下操作 Error mounting /dev/sda6 at /media/qiaokaiming/20F47472F4744BD2: Com ...

  2. Linux如何访问mmio空间,一文读懂Linux下如何访问I/O端口和I/O内存

    虽然访问I/O端口非常简单,但是检测哪些I/O端口已经分配给I/O设备可能就不这么简单了,对基于ISA总线的系统来说更是如此.通常,I/O设备驱动程序为了探测硬件设备,需要盲目地向某一I/O端口写入数 ...

  3. Linux下重要日志及查看方式

    原文地址::https://www.cnblogs.com/skyhu365/p/10615706.html 相关文章 1.linux清除cache的方法----https://www.cnblogs ...

  4. 【转载】【重要】Ubuntu Linux 下 Ffmpeg 及 Mencoder 安装使用小结

    近段时间在学习 Ffmpeg.Mencoder 音视频转换,大概在 Ubuntu 10.04.Ubuntu 10.10.Ubuntu Natty 测试版上安装和使用过.重点是针对低分辨率的普通手机视频 ...

  5. Linux下Nginx访问web目录提示403Forbidden

    在Linux下http服务器nginx时,访问web目录提示403 Forbidden,首先需要了解nginx出现403错误是什么意思: 403 Forbidden表示你在请求一个资源文件但是ngin ...

  6. Linux下连接Mysql服务器的方式

    一:mysql连接简介 1.linux下mysql的连接方式有三种: 本地mysql命令连接 客户端命令连接 脚本语言封装方法连接 2.linux下mysql的连接方法有两种: TCP/IP协议连接 ...

  7. 在linux下让php支持mssql,WIN和LINUX下PHP连接mssql的方法

    WIN下比较简单: 1.安装sql服务器并添加PHP的MSsql扩展. 2.使用以下代码连接并测试 $myServer = "localhost"; //主机 $myUser = ...

  8. Linux 下Tomcat内存溢出解决方式

    Java内存溢出详解 一.常见的Java内存溢出有以下三种: java.lang.OutOfMemoryError: Java heap space ----JVM Heap(堆)溢出 JVM在启动的 ...

  9. linux下文件访问时间、修改时间、更改时间

    基本概念: linux对每个文件维护3个时间段(访问时间.修改时间.更改时间),它们的意义于图4-19中. 在linux下没有创建时间的概念,也就是不能知道文件的建立时间,但如果文件建立后就没有修改过 ...

最新文章

  1. 测试openstack neutron的网络连通性
  2. 软件配置文件如何读写
  3. DataFountain训练赛 | 用户逾期行为预测
  4. 知乎上高赞的40个有趣回复,很精辟!
  5. Spring Boot(二)应用实例
  6. Spring架构设计-增强MultiActionController
  7. Oracle11.2.0.4 RAC安装文档
  8. (转)女生应该找一个玩ACM的男生
  9. 企业资源计划软件 业务知识点汇编整理
  10. 韩国ETRI提出实时Anchor-Free实例分割算法CenterMask,代码将开源
  11. Nginx 配置参数
  12. android 可拖拽View的简单实现
  13. 度数计算机在线使用,度数换算(度数换算计算器)
  14. 从零到一学Mycat:入门及配置文件详解
  15. svg 地图_一秒带你制作出全国各省市区县地图
  16. Ubuntu-的前世今生
  17. SSM全注解开发的网上商城系统
  18. 张飞实战电子第一部——门控开关设计笔记
  19. Vs2017 窗口移动vs直接卡死
  20. Java图片Base64互转

热门文章

  1. 正经人话版Apache许可证
  2. 有java基础学习大数据该如何规划
  3. 获取电脑唯一标识,硬盘序列号,主板序列号,CPU序列号
  4. 品钛CEO李惠科:数据质量决定了机器学习的上限
  5. mysql 删除数据库的所有表_科学网—mysql删除数据库中的所有表 - 高雪峰的博文...
  6. 程序员面试金典(C++)——确定字符互异
  7. win7设置电脑自动同步internet时间
  8. 目前 AI 研究界里 “文本风格迁移” 有什么重大成果 ?
  9. 上百套springboot,python,ssm和小程序毕业设计作品
  10. 【正则表达式】二代身份证