PHP:错误的SQL语法错误

PHP:错误的SQL语法错误,php,sql,where-clause,syntax-error,Php,Sql,Where Clause,Syntax Error,我有一个PHP类,它根据表单中输入的值创建SQL查询。我要走了 关键字“WHERE”附近的语法不正确 这是我的密码。问题发生在每个WHERE子句周围,顺便说一句,它们已经在处理SQL注入 if($from != ''){ $from = date('Y-m-d H:i:s',strtotime($from)); } if($to != ''){ $to = date('Y-m-d H:i:s',strtotime($to));

我有一个PHP类,它根据表单中输入的值创建SQL查询。我要走了

关键字“WHERE”附近的语法不正确

这是我的密码。问题发生在每个WHERE子句周围,顺便说一句,它们已经在处理SQL注入

    if($from != ''){
        $from = date('Y-m-d H:i:s',strtotime($from));
    }

    if($to != ''){
        $to   = date('Y-m-d H:i:s',strtotime($to));
    }



    $tsql = "SELECT COUNT(tblBackupArchive.StatusID) AS total, tblBackupArchive.StatusID ".
            "FROM tblBackupArchive INNER JOIN ".
            "tblBackup ON tblBackupArchive.BackupID = tblBackup.BackupID ".
            "GROUP BY tblBackupArchive.StatusID, tblBackup.ClientID ";

    if($from != '' && $to !=''){
        $tsql .=  "WHERE (tblBackupArchive.BackupDate BETWEEN '" . $from ."' AND '" . $to . "') ";
    }

    if($from != '' && $to=''){
        $tsql .= " WHERE (tblBackupArchive.BackupDate > '" . $from ."') ";
    }

    if($to != '' && $from = ''){
        $tsql .= " WHERE (tblBackupArchive.BackupDate < '" . $to ."') ";
    }

    if(isset($bmsid)){
        $tsql .= "HAVING (tblBackup.ClientID = " . $bmsid . ")";
    }
我对这些语法错误很反感:

有人能帮我吗


Jonesy

您的WHERE子句必须位于GROUP BY子句之前。

您不能将WHERE置于GROUP BY之后。您需要附加WHERE子句,然后在所有WHERE子句之后,将GROUP BY放在查询中。e、 g

$tsql = "SELECT COUNT(tblBackupArchive.StatusID) AS total, tblBackupArchive.StatusID ".
            "FROM tblBackupArchive INNER JOIN ".
            "tblBackup ON tblBackupArchive.BackupID = tblBackup.BackupID ";

    if($from != '' && $to !=''){
        $tsql .=  "WHERE (tblBackupArchive.BackupDate BETWEEN '" . $from ."' AND '" . $to . "') ";
    }

    if($from != '' && $to=''){
        $tsql .= " WHERE (tblBackupArchive.BackupDate > '" . $from ."') ";
    }

    if($to != '' && $from = ''){
        $tsql .= " WHERE (tblBackupArchive.BackupDate < '" . $to ."') ";
    }

    if(isset($bmsid)){
        $tsql .= "HAVING (tblBackup.ClientID = " . $bmsid . ")";
    }

    $tsql .= " GROUP BY tblBackupArchive.StatusID, tblBackup.ClientID ";
您的GROUPBY子句位于WHERE子句之前,这是一个问题。您还必须将HAVING子句移动到GROUPBY子句之后

更多信息将在文档中提供

MySQL:

PostgreSQL:

编辑:


此外,您应该在if子句中将$to=更改为$to==并将$from=更改为$from==我非常确信

$to=''
必须看起来像:

$to==''
这是逻辑问题,不是SQL,但仍然会返回奇怪的结果

更新:KM comment提醒了我一位同事,他建议将值写在左侧,将变量写在右侧,作为此问题的解决方案。代码如下所示:

$to==''
$x=; 如果5=$x{}//这将抛出一个错误 如果5==$x{}//则返回false


如果您能够提供生成并导致问题的实际查询,则会更有帮助$to={应该是if$from!=&&&$to={如果$to!=&&&$from={应该是if$to!=&&$from=={在php中,=意味着为变量赋值,而==意味着相等。即使您在代码中看到,…&&$to=$to被赋值为空字符串,并且没有检查是否有空字符串值。这会破坏代码的可读性。我知道这种做法很久了,但我自己从未使用过。