2015-01-05 3 views
1

Мне просто интересно, почему этот запрос ничего не возвращает в PHP на browswer, в то время как он возвращает большое количество элементов при использовании в MySQL Workbench.Использование переменных PHP в MySQL

Я получаю даты, повторяя их оба, а затем используя те же даты и получая элементы, возвращаемые в Workbench MySQL.

$_POST['startdate'] 
$_POST['enddate'] 

Поэтому я не уверен, почему он не работает в запросе. Ошибок/предупреждений PHP или MySQL не существует.

SELECT 
     mantis_category_table.name, 
     mantis_bug_history_table.bug_id, 
     FROM_UNIXTIME(mantis_bug_table.date_submitted, "%m-%d-%Y") AS DATE2, 
     FROM_UNIXTIME(min(mantis_bug_history_table.date_modified), "%m-%d-%Y") AS FirstOfdate_modified, 
     ROUND((min(mantis_bug_history_table.date_modified)- mantis_bug_table.date_submitted)/ 86400, 1) as day_difference 
    FROM (mantis_bug_table INNER JOIN mantis_bug_history_table 
    ON 
     mantis_bug_table.id = mantis_bug_history_table.bug_id) 
    INNER JOIN 
     mantis_category_table ON mantis_bug_table.category_id = mantis_category_table.id 
    WHERE 
     FROM_UNIXTIME(mantis_bug_table.date_submitted, "%m-%d-%Y") 
      BETWEEN '.$_POST['startdate'].' AND '.$_POST['enddate'].' 
    GROUP BY 
     mantis_category_table.name, mantis_bug_table.category_id, mantis_bug_table.date_submitted, mantis_bug_table.status, mantis_bug_history_table.bug_id, mantis_bug_history_table.field_name, mantis_bug_history_table.new_value 
    HAVING 
     (((mantis_bug_table.status)<>90) AND ((mantis_bug_history_table.field_name)="status") AND ((mantis_bug_history_table.new_value)="50")) 
    ORDER BY 
     mantis_category_table.name, mantis_bug_table.date_submitted' 

Проблема заключается в том, что эта часть запроса. Это недопустимо в MySQL? Есть ли лучший способ сделать это?

WHERE 
     FROM_UNIXTIME(mantis_bug_table.date_submitted, "%m-%d-%Y") 
      BETWEEN '.$_POST['startdate'].' AND '.$_POST['enddate'].' 

Спасибо.

+1

Вы эхом отозвали запрос с помощью переменных POST и запустили его с помощью MySQL Workbench? –

+0

Возможно, проблема конкатенации. – EternalHour

+1

'BETWEEN '". $ _ POST [' startdate '].' 'AND' ". $ _ POST ['enddate']." '' Дать этому * whirl * –

ответ

1

По желанию OP в:

Объединить свои значения, как это:

BETWEEN "'.$_POST['startdate'].'" AND "'.$_POST['enddate'].'" 

как вы уже не хватает цитат, которые необходимы, так как мы имеем дело со строковыми значениями.

Даты могут содержать дефисы (и двоеточия), такие как 2015-01-05 22:00, которые будут вызывать ошибку SQL.

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

Использовать mysqli with prepared statements, или PDO with prepared statements, они намного безопаснее.

3

Прежде всего, вы всегда должны избегать ввода пользователя, прежде чем передавать его в запрос или, еще лучше, использовать подготовленные операторы. См. Это related question.

Во-вторых, вы должны убедиться, что значения даты, получаемые с PHP, находятся в том же формате, что и данные, хранящиеся в вашей базе данных. Поскольку вы сохраняете время unix в своем столбце, вы можете использовать strtotime, чтобы конвертировать ваши опубликованные даты в unix-время, подходящее для прямого сравнения со значениями столбца, или вы могли бы использовать date_format, чтобы преобразовать их в допустимый формат даты, как вы пытаетесь в вашем текущем сравнении.

Смежные вопросы