2010-10-26 5 views
0

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

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

Это мой код. Проблема возникает вокруг каждого из предложений WHERE (уже имеет дело с SQL-инъекциями btw).

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 . ")"; 
    } 

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

Может кто-то помочь мне?

Джоунси

+0

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

ответ

4

Ваш пункт 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 статей.

5

Ваш пункт WHERE должен прийти до пункта GROUP BY.

3

Вы не можете разместить WHERE после 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 "; 
3

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

$to='' 

должен выглядеть следующим образом:

$to=='' 

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

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

$ x = '';
если (5 = $ х) {} // это выдаст ошибку
если (5 == $ х) {} // это возвращает ложь

+2

'if ($ from! = '' && $ to = '') {' должно быть 'if ($ from! = '' && $ to == '') {' и 'if ($ to!= '' && $ from = '') {'должно быть' if ($ to! = '' && $ from == '') {'in php," = "означает присваивать значение переменной, а" = = "означает равенство. Даже несмотря на то, что в коде указано 'if (.... && $ to = '')' $ to присваивается значение пустой строки и не проверяется на наличие значения пустой строки. –

+0

Это портит читаемость кода. Я знаю эту практику целую вечность, но никогда не использовал ее сам. –

+0

Мне тоже, но это я считаю это классным решением –