【问题标题】:Query works on sql server, does not work php codeigniter查询在 sql server 上工作,不工作 php codeigniter
【发布时间】:2019-06-11 15:03:06
【问题描述】:

希望这个问题不是重复的。

我有一个可以在 sql server 上运行的查询。当我尝试在 Codeigniter 中使用它时,我收到内部服务器错误 (500)。

这里是用php代码查询,

   public function tnaBucketTable($filter = null){
    $sql = "
        SELECT TOP 500 start ,SC.status ,S.shift_id ,SC.call_id,SC.type,SC.win_end,S.job_id
        ,pin = CASE 
                WHEN pin IS NULL THEN pin_agency 
                ELSE pin 
            END
            ,CONVERT(VARCHAR, start, 3)+' '+CONVERT(CHAR(5), start, 108) AS start_time
            ,CONVERT(CHAR(5), [end], 108) AS finish_time
            ,guard_name = CASE guard_info
                WHEN 'Agency' THEN  (SELECT shortname FROM [SecurityPlatform].[dbo].[SP-Guard-Agency] WHERE pin = S.pin_agency)
                ELSE (SELECT shortname FROM [SecurityPlatform].[dbo].[SP-Guard] WHERE pin = S.pin)
            END
            ,guard_number = CASE guard_info
                WHEN 'Agency' THEN  (SELECT phone1 FROM [SecurityPlatform].[dbo].[SP-Guard-Agency] WHERE pin = S.pin_agency)
                ELSE (SELECT phone_number FROM [SecurityPlatform].[dbo].[SP-Guard] WHERE pin = S.pin)
            END
            ,agency_number = CASE S.guard_info
                WHEN 'Agency' THEN (
                    SELECT contact_no_1 FROM [SecurityPlatform].[dbo].[SP-Agency] WHERE agency_id = (
                        SELECT agency_id FROM [SecurityPlatform].[dbo].[SP-Guard-Agency] WHERE pin = S.pin_agency
                    )
                )
                ELSE NULL
            END
            ,C.client_name
            ,ST.site_name
            ,ST.phone_number AS site_phone
            ,ST.site_sin
            FROM [SecurityPlatform].[dbo].[SP-Shift] S
            JOIN [SecurityPlatform].[dbo].[SP-Job] J ON J.job_id = S.job_id
            JOIN [SecurityPlatform].[dbo].[SP-Site] ST ON ST.site_sin = J.[sin]
            JOIN [SecurityPlatform].[dbo].[SP-Client] C ON C.client_id = ST.client_id
            JOIN [SecurityPlatform].[dbo].[SP-ScheduleCall] SC ON SC.shift_id = S.shift_id 
            JOIN [SecurityPlatform].[dbo].[SP-TrackingCall] TC ON TC.call_id = SC.call_id
            WHERE S.[status] = 'Confirmed'
            AND SC.[status] != 'Unconfirmed'
            AND pin > 0 ORDER BY S.shift_id DESC, SC.win_end DESC";

    $query = $this->db->query($sql);
    return $query->result();
}

以及来自 Sql Server 的结果:

浏览器结果:

有人知道我错过了什么吗?

如果您需要更多信息,请询问。

提前致谢。

编辑:请求的 var_dump($sql)

string(1763) " SELECT TOP 500 start ,SC.status ,S.shift_id ,SC.call_id,SC.type,SC.win_end,S.job_id ,pin = CASE WHEN pin IS NULL THEN pin_agency ELSE pin END ,CONVERT(VARCHAR, start, 3)+' '+CONVERT(CHAR(5), start, 108) AS start_time ,CONVERT(CHAR(5), [end], 108) AS finish_time ,guard_name = CASE guard_info WHEN 'Agency' THEN (SELECT shortname FROM [SecurityPlatform].[dbo].[SP-Guard-Agency] WHERE pin = S.pin_agency) ELSE (SELECT shortname FROM [SecurityPlatform].[dbo].[SP-Guard] WHERE pin = S.pin) END ,guard_number = CASE guard_info WHEN 'Agency' THEN (SELECT phone1 FROM [SecurityPlatform].[dbo].[SP-Guard-Agency] WHERE pin = S.pin_agency) ELSE (SELECT phone_number FROM [SecurityPlatform].[dbo].[SP-Guard] WHERE pin = S.pin) END ,agency_number = CASE S.guard_info WHEN 'Agency' THEN ( SELECT contact_no_1 FROM [SecurityPlatform].[dbo].[SP-Agency] WHERE agency_id = ( SELECT agency_id FROM [SecurityPlatform].[dbo].[SP-Guard-Agency] WHERE pin = S.pin_agency ) ) ELSE NULL END ,C.client_name ,ST.site_name ,ST.phone_number AS site_phone ,ST.site_sin FROM [SecurityPlatform].[dbo].[SP-Shift] S JOIN [SecurityPlatform].[dbo].[SP-Job] J ON J.job_id = S.job_id JOIN [SecurityPlatform].[dbo].[SP-Site] ST ON ST.site_sin = J.[sin] JOIN [SecurityPlatform].[dbo].[SP-Client] C ON C.client_id = ST.client_id JOIN [SecurityPlatform].[dbo].[SP-ScheduleCall] SC ON SC.shift_id = S.shift_id JOIN [SecurityPlatform].[dbo].[SP-TrackingCall] TC ON TC.call_id = SC.call_id WHERE S.[status] = 'Confirmed' AND SC.[status] != 'Unconfirmed' AND pin > 0 ORDER BY S.shift_id DESC, SC.win_end DESC"

【问题讨论】:

  • 你能显示你得到的异常吗?
  • @Jerodev 也不例外。从来没有错误。
  • 问题更可能出在您的 php 代码上,而不是查询本身
  • @MücahidErenler 如果没有例外?你能显示你的代码吗
  • 所以我确实检查了您的请求的 error.log,这就是我得到的,超过了 30 秒的最大执行时间。但它在 sql server 中执行 0.1 秒

标签: php sql codeigniter


【解决方案1】:

这个

$query = "SELECT TOP 500 start,SC.status,S.shift_id,SC.call_id,SC.type,SC.win_end,S.job_id,pin = CASE 
            WHEN pin IS NULL THEN pin_agency 
            ELSE pin 
        END
        ,CONVERT(VARCHAR, start, 3)+' '+CONVERT(CHAR(5), start, 108) AS start_time
        ,CONVERT(CHAR(5), [end], 108) AS finish_time
        ,guard_name = CASE guard_info
            WHEN 'Agency' THEN  (SELECT shortname FROM [SecurityPlatform].[dbo].[SP-Guard-Agency] WHERE pin = S.pin_agency)
            ELSE (SELECT shortname FROM [SecurityPlatform].[dbo].[SP-Guard] WHERE pin = S.pin)
        END
        ,guard_number = CASE guard_info
            WHEN 'Agency' THEN  (SELECT phone1 FROM [SecurityPlatform].[dbo].[SP-Guard-Agency] WHERE pin = S.pin_agency)
            ELSE (SELECT phone_number FROM [SecurityPlatform].[dbo].[SP-Guard] WHERE pin = S.pin)
        END
        ,agency_number = CASE S.guard_info
            WHEN 'Agency' THEN (
                SELECT contact_no_1 FROM [SecurityPlatform].[dbo].[SP-Agency] WHERE agency_id = (
                    SELECT agency_id FROM [SecurityPlatform].[dbo].[SP-Guard-Agency] WHERE pin = S.pin_agency
                )
            )
            ELSE NULL
        END
        ,C.client_name
        ,ST.site_name
        ,ST.phone_number AS site_phone
        ,ST.site_sin
        FROM [SecurityPlatform].[dbo].[SP-Shift] S
        JOIN [SecurityPlatform].[dbo].[SP-Job] J ON J.job_id = S.job_id
        JOIN [SecurityPlatform].[dbo].[SP-Site] ST ON ST.site_sin = J.[sin]
        JOIN [SecurityPlatform].[dbo].[SP-Client] C ON C.client_id = ST.client_id
        JOIN [SecurityPlatform].[dbo].[SP-ScheduleCall] SC ON SC.shift_id = S.shift_id 
        JOIN [SecurityPlatform].[dbo].[SP-TrackingCall] TC ON TC.call_id = SC.call_id
        WHERE S.[status] = 'Confirmed'
        AND SC.[status] != 'Unconfirmed'
        AND pin > 0 ORDER BY S.shift_id DESC, SC.win_end DESC";
        var_dump($query);    

输出这个

SELECT TOP 500 start,SC.status,S.shift_id,SC.call_id,SC.type,SC.win_end,S.job_id,pin = CASE WHEN pin IS NULL THEN pin_agency ELSE pin END ,CONVERT(VARCHAR, start, 3)+' '+CONVERT(CHAR(5), start, 108) AS start_time ,CONVERT(CHAR(5), [end], 108) AS finish_time ,guard_name = CASE guard_info WHEN 'Agency' THEN (SELECT shortname FROM [SecurityPlatform].[dbo].[SP-Guard-Agency] WHERE pin = S.pin_agency) ELSE (SELECT shortname FROM [SecurityPlatform].[dbo].[SP-Guard] WHERE pin = S.pin) END ,guard_number = CASE guard_info WHEN 'Agency' THEN (SELECT phone1 FROM [SecurityPlatform].[dbo].[SP-Guard-Agency] WHERE pin = S.pin_agency) ELSE (SELECT phone_number FROM [SecurityPlatform].[dbo].[SP-Guard] WHERE pin = S.pin) END ,agency_number = CASE S.guard_info WHEN 'Agency' THEN ( SELECT contact_no_1 FROM [SecurityPlatform].[dbo].[SP-Agency] WHERE agency_id = ( SELECT agency_id FROM [SecurityPlatform].[dbo].[SP-Guard-Agency] WHERE pin = S.pin_agency ) ) ELSE NULL END ,C.client_name ,ST.site_name ,ST.phone_number AS site_phone ,ST.site_sin FROM [SecurityPlatform].[dbo].[SP-Shift] S JOIN [SecurityPlatform].[dbo].[SP-Job] J ON J.job_id = S.job_id JOIN [SecurityPlatform].[dbo].[SP-Site] ST ON ST.site_sin = J.[sin] JOIN [SecurityPlatform].[dbo].[SP-Client] C ON C.client_id = ST.client_id JOIN [SecurityPlatform].[dbo].[SP-ScheduleCall] SC ON SC.shift_id = S.shift_id JOIN [SecurityPlatform].[dbo].[SP-TrackingCall] TC ON TC.call_id = SC.call_id WHERE S.[status] = 'Confirmed' AND SC.[status] != 'Unconfirmed' AND pin > 0 ORDER BY S.shift_id DESC, SC.win_end DESC    

对我来说。您可以直接在 SQL 中尝试 var_dump 输出吗?我猜我有一点线索......

【讨论】:

  • 编辑了问题。您现在可以看到 var 转储。感谢您的关注。
  • 不贴代码就好了,说明问题出在哪里。
  • SELECT TOP 适用于 SQL 数据库,如果您在 MySQL 数据库上使用 Statement,则必须使用 LIMIT。你也可以试试这个:developer.mimer.com/sql-validator-99 for SQL Queries...
  • 但是我使用的是 SQL 而不是 MySQL,如果它无效,sql server 会返回错误,对吧?
  • 取决于...我再次阅读您的问题,500 服务器错误...您的代码/语句不应成为此错误的来源。检查您的文件的权限并检查您的 .htaccess 是否存在错误配置..
【解决方案2】:

我已经尝试了这里的所有建议,但找不到结果,所以我所做的就是将我的 Sql 查询更改为 Codeigniter 的查询生成器,现在它可以正常工作,没有任何时间错误。

希望这对其他人有帮助。

$this->db->select("
    start,
    SC.status
    ,S.shift_id
    ,SC.call_id
    ,SC.type
    ,SC.win_end
    ,S.job_id
    ,pin =
    CASE 
        WHEN pin IS NULL THEN pin_agency 
        ELSE pin 
    END 
    ,CONVERT(VARCHAR, start, 3)+' '+CONVERT(CHAR(5), start, 108) AS start_time
    ,CONVERT(CHAR(5), [end], 108) AS finish_time
    ,guard_name = 
    CASE guard_info
        WHEN 'Agency' THEN  (SELECT shortname FROM [SecurityPlatform].[dbo].[SP-Guard-Agency] WHERE pin = S.pin_agency)
        ELSE (SELECT shortname FROM [SecurityPlatform].[dbo].[SP-Guard] WHERE pin = S.pin)
    END
    ,guard_number =
    CASE guard_info
        WHEN 'Agency' THEN  (SELECT phone1 FROM [SecurityPlatform].[dbo].[SP-Guard-Agency] WHERE pin = S.pin_agency)
        ELSE (SELECT phone_number FROM [SecurityPlatform].[dbo].[SP-Guard] WHERE pin = S.pin)
    END
    ,agency_number =
    CASE S.guard_info
        WHEN 'Agency' THEN (
            SELECT contact_no_1 FROM [SecurityPlatform].[dbo].[SP-Agency] WHERE agency_id = (
                SELECT agency_id FROM [SecurityPlatform].[dbo].[SP-Guard-Agency] WHERE pin = S.pin_agency
            )
        )
        ELSE NULL
    END
    ,C.client_name
    ,ST.site_name
    ,ST.phone_number AS site_phone
    ,ST.site_sin ", FALSE);

    $this->db->from('SP-Shift S');
    $this->db->join('SP-Job J', 'J.job_id = S.job_id');
    $this->db->join('SP-Site ST', 'ST.site_sin = J.sin');
    $this->db->join('SP-Client C', 'C.client_id = ST.client_id');
    $this->db->join('SP-ScheduleCall SC', 'SC.shift_id = S.shift_id');
    $this->db->join('SP-TrackingCall TC', 'TC.call_id = SC.call_id');
    $this->db->where('S.status', 'Confirmed');
    $this->db->where('SC.status != ', 'Unconfirmed');
    $this->db->where('pin >= ', 0);

【讨论】:

  • 有趣!如果您仍然好奇,可以尝试按照this answer 在您的php 代码中设置memory_limitmssql.timeout ini 配置。当您通过 PHP 和任何其他 mssql 环境运行查询时,这些值会有所不同。 CodeIgniter 的查询构建器可能正在更改这些配置值或进行其他一些优化,因此它可以正常工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-17
  • 1970-01-01
  • 2011-09-23
  • 2010-10-16
  • 1970-01-01
  • 2018-07-19
相关资源
最近更新 更多