PHP и «переменный» запрос MySQL

#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, а a warning ?

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. @Полковник Шрапнель: если вас не устраивает использование фигурных скобок, не используйте его тогда. Я пытался ответить на вопрос, используя мой способ кодирования.