PHP mssql_query删除,创建并从#temp表中选择

时间:2017-06-19 15:39:37

标签: php sql sql-server temp-tables

我想:

  1. 删除临时表(如果存在)。
  2. 使用所选数据创建临时表。
  3. 从临时表中选择。
  4. 我得到"解析错误:解析第57行C:\xampp\htdocs\test.php中的错误。

    任何帮助将不胜感激!

    简短信息:

    • PHP Version 5.2.9
    • MS SQL 2008 R2
    • 在MS SQL中执行的查询按预期工作

    以下PHP代码:

    $query = "IF OBJECT_ID('tempdb..#temp') IS NOT NULL DROP TABLE #temp"
    $result = mssql_query($query);
    
    $query = "
    SELECT *
    INTO #temp
    FROM (SELECT ROW_NUMBER() OVER (PARTITION BY key
          ORDER BY moment desc) AS Seq, *
    FROM  reportstable) t
    WHERE Seq = 1
    and moment between '$_GET[od] $time' and '$_GET[do] $time1'"
    $result = mssql_query($query);
    
    $query = "select * from #temp"
    $result = mssql_query($query);
    

    提前致谢!

2 个答案:

答案 0 :(得分:0)

由于一些原因,这不会按照书面形式起作用。

  1. 您在此处使用的临时表仅在当前会话中是本地的。换句话说,在{em>每次调用#temp后,mssql_query()正在消失。如果您需要临时表来跨多个上下文,它必须是一个全局临时表 - ##temp
  2. 您的代码全开到SQL注入 - 您正在使用来自用户的未经过抽取的输入。这是一个存在了20年的巨大安全漏洞而且你坚持不懈。阅读PDO和参数化查询/准备好的陈述。
  3. 您的查询可能格式错误。构建之后输出 actual $query,并确保日期时间格式正确。
  4. 所有这一切,并假设您修复了SQL注入漏洞,在这里使用临时表是没有意义的,浪费资源。以下就足够了:

    $query = "
    SELECT *
    FROM (SELECT ROW_NUMBER() OVER (PARTITION BY key
          ORDER BY moment desc) AS Seq, *
    FROM  reportstable) t
    WHERE Seq = 1
    and moment between '$_GET[od] $time' and '$_GET[do] $time1'"
    $result = mssql_query($query);
    

答案 1 :(得分:0)

基于alroc建议的工作解决方案:

由于缺少分号而引发了解析错误。并且##必须始终存在才能查询表格。

public int differentFields(Foo foo1, Foo foo2) {
    int differentFields = 0;
   for all fields of foo1 and foo2:
       if foo1.field[i] != foo2.field[i]
           differentFields++;

   return differentFields;
}

P.S。以上只适用于同一会话。如果你在同一时间从不同的源调用同一页面,由于试图删除临时表,会抛出一个错误。