#php #mysql
#php #mysql
Вопрос:
Я знаю, что я делаю много, много неправильных вещей в этом, но я понятия не имею, как это исправить (кроме создания множества отдельных запросов.
mysql_query( 'SELECT *
FROM opdracht
where'. if(isset($opleiding))
{
'opleiding = "'.$opleiding.'" and'
}
if(isset($duur))
{
'duur = "'.$duur.'" and '
}
if(isset($type))
{
'type = "'.$type.'" and'
}
' gevuld ="nee";');
по сути, то, что я пытаюсь сделать, это сделать запрос, операторы которого зависят от переменных.
Этот код не работает, но я не могу придумать способ заставить его работать.
Помогите?
Комментарии:
1. @yi_H Как это может работать? Вы не можете выполнить объединение с оператором if.
2. Я это знаю . Тем не менее, он должен был опубликовать сообщение об ошибке.
3. кроме того, добавьте пробел после where . (
where '.if(...)
Ответ №1:
if (isset($opleiding)) { $opleiding = 'opleiding = "'.$opleiding.'" and'; } else { $opleiding = ""; }
if (isset($duur)) { $duur= 'duur= "'.$duur.'" and'; } else { $duur= ""; }
if (isset($type)) { $type= 'type= "'.$type.'" and'; } else { $type= ""; }
$query = "SELECT * FROM optdracht WHERE $oplediding $duur $type gevuld ='nee';"
mysql_query($query);
Установите их снаружи, а затем используйте их внутри запроса. Кроме того, вы должны проверять наличие ошибок. (Я не помню, как это сделать, mysql_query()
поскольку он очень старый, и я им не пользуюсь. Если кто-то знает, пожалуйста, отредактируйте мой ответ)
Комментарии:
1. этот код будет выдавать ошибки «неопределенной переменной» для переменных, которые не установлены
2. @Col. Шрапнель:
error
я думаю, это будет не an, а awarning
?3. @Col. Шрапнель: Нет, это
notice
. Кстати, писать код, который выдает эти уведомления, — плохая практика…4. @yi_H Я говорю не об этих глупых категориях сообщений об ошибках . Я говорю об ошибках в вашем коде. Использование неопределенной переменной — КРОВАВАЯ ОШИБКА, как и многие обычные ошибки php-ish lame. Это не «плохая практика», а ошибка.
5. @Col. Shrapnel: ну, вы, очевидно, не заботитесь о терминологии. ну, другие делают. разберитесь с этим.
Ответ №2:
'where ' . (isset($opleiding) ? "opleiding = '$opleiding' and " : '') . ...
или
$query = array();
if (isset($opleiding) { $query[] = "opleiding = '$opleiding' and "; }
....
.... 'where ' . implode(' and ', $query);
Примечание: ищите пробелы, даже если ваш код «работал», он все равно должен был создать запрос типа whereopleiding ...
и andduur ...
. Кроме того, пожалуйста, напишите небольшой API для ваших запросов к базе данных, который проверяет сообщения об ошибках, показывает их в режиме отладки, при необходимости ведет журнал и все такое прочее.
Ответ №3:
Помимо того, что сказали другие, проблема в том, что там, где они должны быть, нет пробелов.
Например:
mysql_query(
'SELECT *
FROM opdracht
where'. if(isset($opleiding))
{
'opleiding = "'.$opleiding.'" and'
}
.
.
.
Когда это выполняется, вы получаете ….’Из opdracth whereopleiding = ‘
Вот исправление:
<?php
$query = "SELECT * FROM oprecht WHERE" .
(isset($opleiding) ?
' opleiding = "'.$opleiding.'" and'
:
""
) .
(isset($duur) ?
' duur = "'.$duur.'" and '
:
""
) .
(isset($type) ?
' type = "'.$type.'" and'
:
""
) .
' gevuld ="nee";';
echo $query;
Ответ №4:
Я думаю, вам следует использовать соответствующий шаблон проектирования. Попробуйте шаблон проектирования MVC (и, возможно, класс репозитория для хранения класса connection, а также его методов), создание методов для разных типов поиска сделает ваш код более стабильным и простым в отладке…
Ответ №5:
Вы можете использовать следующее:
$opleidingClause = (isset($opleiding) ? "opleiding = '{$opleiding}' AND " : "" );
$duurClause = (isset($duur) ? " duur = '{$duur}' AND " : "" );
$typeClause = (isset($type) ? " type = '{$type}' AND " : "" );
$query = "SELECT * FROM optdracht WHERE {$opledidingClause} {$duurClause} {$typeClause} gevuld = 'nee';"
mysql_query($query);
ПРИМЕЧАНИЕ: фигурные скобки {}
могут использоваться внутри строки с переменными для удобства чтения.
Комментарии:
1. Это не просто удобочитаемость, это помогает вам отделять имена переменных от других элементов в строке. Мне проще использовать фигурные скобки, чем снова и снова объединять строку.
2. @Полковник Шрапнель: если вас не устраивает использование фигурных скобок, не используйте его тогда. Я пытался ответить на вопрос, используя мой способ кодирования.