V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
570956418
V2EX  ›  PHP

laravel 框架原生 select 报错

  •  
  •   570956418 · 2021-06-04 15:04:53 +08:00 · 2109 次点击
    这是一个创建于 1293 天前的主题,其中的信息可能已经有所发展或是发生改变。

    前言

    使用的 docker 环境,PHP7.4,PHP 的 sqlsrv,pdo_sqlsrv,odbc,pdo_odbc 扩展已将安装。
    

    遇到的问题

    我使用 DB::connection('')->select()就会报错
    
    报错信息:SQLSTATE[IMSSP]: Field 13 returned no data. (SQL: select top 1 * from tbl_mpay_order with(nolock) where id = 1000 )
    
    我使用 DB::connection('')->update(),执行修改语句,就不会报错,也能正确修改。
    
    我使用原生 pdo 连接进行查询,就不会报错。代码如下
    
    	try{
                $env = env('APP_ENV');
                $dbHost = env('SRV_DB_HOST');
                $dbUser = env('SRV_DB_USERNAME');
                $dbPwd = env('SRV_DB_PASSWORD');
                $dbName = "gameplane";
                if(!empty($dbHost) && !empty($dbUser) && !empty($dbPwd)){
                    $dbName = "sqlsrv:Server={$dbHost};Database={$dbName}";
                    $db = new \PDO($dbName, $dbUser, $dbPwd);
                }
                $sql = " select * from t_alipay_packet with(nolock) where  packetType = 1 ";
                $stmt = $db->query($sql);
                $res = $stmt->fetch(\PDO::FETCH_ASSOC);
                echo '<pre>';
                print_r($res);
                return;
            }catch (\Exception $e){
                echo '<pre>';
                print_r($e->getMessage());
                return;
            }
    
    9 条回复    2022-06-29 09:58:01 +08:00
    PeterYang1996
        1
    PeterYang1996  
       2021-06-04 15:24:04 +08:00
    没看懂,你报错的语句和 pdo 查询的语句都不一样
    570956418
        2
    570956418  
    OP
       2021-06-04 15:47:46 +08:00
    最下面的一大段代码,是我能正常执行的,我是想说 pdo_sqlsrv 扩展是装好了。
    报错信息里面的 sql 你可以忽略,SQL 是没问题的,最主要的是 select 总是报 SQLSTATE[IMSSP]: Field 13 returned no data,这个错误。不知道怎么回事
    batyu
        3
    batyu  
       2021-06-04 15:58:30 +08:00
    看起来像是把 laravel 中的 select 管道当作查询函数使用了...

    查询部分字段:DB::connection('')->table("table_name")->select("字段 1", "字段 2", "字段 3")->find(1000)
    查询所有字段:DB::connection('')->table("table_name")->find(1000)
    570956418
        4
    570956418  
    OP
       2021-06-04 16:08:47 +08:00
    @batyu 使用你说的方法还是报同样的错误。
    SQLSTATE[IMSSP]: Field 13 returned no data. (SQL: select top 1 * from [tbl_mpay_order] where [id] = 1000)
    batyu
        5
    batyu  
       2021-06-04 16:26:14 +08:00
    多少年不用 sqlserver 了,查了一下,看到说 IMSSP 是驱动引起的错误:

    [For errors that originate from the Microsoft Drivers for PHP for SQL Server, a SQLSTATE of IMSSP]( https://docs.microsoft.com/en-us/sql/connect/php/sqlsrv-errors?view=sql-server-ver15)
    570956418
        6
    570956418  
    OP
       2021-06-05 15:55:38 +08:00
    @batyu 嗯,我看看,谢谢解答。
    junler
        7
    junler  
       2022-06-27 15:39:17 +08:00
    你好,请问这个问题解决了吗?
    youyelan9527
        8
    youyelan9527  
       2022-06-27 16:44:59 +08:00
    解决了吗
    junler
        9
    junler  
       2022-06-29 09:58:01 +08:00
    @junler 问题解决了,原本 php7.4 的容器中默认装的 pdo_sqlsrv-5.10.1 版,版本换成 5.10.0 就可以了。odbc 的驱动有 13 、17 、18 三个版本的,17 这个版本 php7.4 可以用。
    https://pecl.php.net/package/pdo_sqlsrv
    https://docs.microsoft.com/zh-cn/sql/connect/odbc/linux-mac/install-microsoft-odbc-driver-sql-server-macos?view=sql-server-ver16
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5370 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 08:19 · PVG 16:19 · LAX 00:19 · JFK 03:19
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.