thinkphp5 连接 SqlServer 运行存储过程,返回为空解决方案

项目做在win下,服务器是类似空间服务器,所以不可以装扩展,只能yum

老板又非要用双数据库(sqlsever 心酸里程) ,结果就是服务器sqlsrv 不可用,装的是dblib  ......云云云

贴代码记录一下,返回结果成功 ,代码copy修改,其中有些不懂的地方 或者还有更好的方法,随时欢迎赐教

修改配置文件 database.php

'db2'   => [
        //本地
        'type'            => 'sqlsrv',
        // 服务器地址
        'hostname'        => '127.0.0.1',
        // 数据库名
        'database'        => '****',
        // 用户名
        'username'        => 'sa',
        // 密码
        'password'        => 'root',
        // 端口
        'hostport'        => '1433',
    ],

\thinkphp\library\think\db\connector\Sqlsrv.php

$dsn = 'sqlsrv:Database=' . $config['database'] . ';Server=' . $config['hostname'];

改为:

$dsn = 'dblib:version=8.0;charset=utf8;dbname=' . $config['database'] . ';host=' . $config['hostname'];

\thinkphp\library\think\db\Query.php

添加方法:

public function execute_sp($sql, $bind = [])
    {
        return $this->connection->execute_sp($sql, $bind);
    }

\thinkphp\library\think\db\Connection.php

添加方法:

/**
     * 执行sqlserver sp语句
     */
    public function execute_sp($sql, $bind = [])
    {
        $this->initConnect(true);
        if (!$this->linkID) {
            return false;
        }

        //sqlserver 相关配置,没找在RDS里设置的地方。
        $str = "SET QUOTED_IDENTIFIER ON; SET ANSI_WARNINGS ON; SET ANSI_PADDING ON; SET ANSI_NULLS ON; SET CONCAT_NULL_YIELDS_NULL ON; SET NOCOUNT ON;";
        $sql = $str . $sql;

        // 记录SQL语句
        $this->queryStr = $sql;
        if ($bind) {
            $this->bind = $bind;
        }

        //释放前次的查询结果
        if (!empty($this->PDOStatement) && $this->PDOStatement->queryString != $sql) {
            $this->free();
        }

        Db::$executeTimes++;
        try {

            $this->PDOStatement = $this->linkID->prepare($sql);
            $this->bindParam($bind);

            // 执行语句
            $this->PDOStatement->execute();
            $this->PDOStatement->nextRowset();

            // 返回结果集
            return $this->getResult(false, true);
        } catch (\PDOException $e) {
            if ($this->isBreak($e)) {
                return $this->close()->execute($sql, $bind);
            }
            throw new PDOException($e, $this->config, $this->getLastsql());
        } catch (\Exception $e) {
            if ($this->isBreak($e)) {
                return $this->close()->execute($sql, $bind);
            }
            throw $e;
        }
    }

自己找个地方随便测试一下

public function test()
    {
        $sql = "sp语句";
        $res = db2()->execute_sp($sql);
        print_r($res);
    }

 

你可能感兴趣的:(ThinkPHP3.2,php)