PHP: неверный синтаксис SQL - PullRequest
       23

PHP: неверный синтаксис SQL

0 голосов
/ 26 октября 2010

У меня есть класс PHP, который создает запрос SQL на основе значений, введенных в форме. Я получаю

Неверный синтаксис рядом с ключевым словом «ГДЕ». ))

Вот мой код. Проблема возникает вокруг каждого из предложений 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 . ")";
    }

Я ужасен с этими синтаксическими ошибками: (

Может ли кто-нибудь мне помочь?

Джоунси

Ответы [ 4 ]

5 голосов
/ 26 октября 2010

Ваше предложение WHERE должно предшествовать предложению GROUP BY.

4 голосов
/ 26 октября 2010

Ваше предложение GROUP BY предшествует вашему предложению WHERE, что является проблемой. Вам также придется переместить предложение HAVING, чтобы оно появилось после предложения GROUP BY.

Более подробная информация будет доступна в документации.

MySQL: http://dev.mysql.com/doc/refman/5.0/en/select.html

PostgreSQL: http://www.postgresql.org/docs/current/static/sql-select.html

EDIT:

Кроме того, вы должны изменить $to = '' на $to == '' и $ from = '' на $from == '' в ваших if предложениях.

3 голосов
/ 26 октября 2010

Я почти уверен, что следующее

$to=''

должно выглядеть так:

$to==''

Это логическая проблема, а не SQL, но она все равно выдаст странные результаты.

ОБНОВЛЕНИЕ: Комментарий КМ напоминает мне коллегу, который предложил написать значение слева и переменную справа как решения этой проблемы. Код будет выглядеть так:

$ x = '';
if (5 = $ x) {} // это выдает ошибку
if (5 == $ x) {} // это возвращает false

3 голосов
/ 26 октября 2010

Вы не можете поместить ГДЕ после GROUP BY.Вам нужно будет добавить свои предложения WHERE, а затем после всех ваших предложений WHERE добавить в запрос GROUP BY.например,

$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 ";
...