проблема с оператором IF в функции

#php

#php

Вопрос:

Я начинающий PHP-программист, и я создал функцию, которая изменяет команду SQL. Вот соответствующий фрагмент кода:

  $extra_text_length = strlen($_GET[extra_text]);
 $boolean = $_GET['first-boolean'];

 function check_boolean(){

  if($extra_text_length > 0){

    if($boolean=="and"){
        $query .= " AND (software.SWID='$_GET[extra_text]')";
        } elseif($boolean=="or"){
        $query .= " OR (software.SWID='$_GET[extra_text]')";
        } elseif($boolean=="not"){
        $query .= " NOT IN (software.SWID='$_GET[extra_text]')";
        }
    } return $boolean;
  }

check_boolean();
  

Проблема в том, что он не делает то, что должен делать. Однако, если я удалю код из функции и, как следствие, удалю метод check_boolean(), он будет работать идеально. Кто-нибудь даст мне подсказку? Заранее спасибо

Ответ №1:

boolean отсутствует его $ , хотя я бы предпочел сделать его параметром like function check_boolean($bool) вместо использования глобального var. Также, пожалуйста, ознакомьтесь с SQL-инъекцией. Это ужасная уязвимость, с которой вы сталкиваетесь прямо сейчас. Самое короткое решение — поместить mysql_real_escape_string() вокруг переменных в вашем запросе (при условии, что вы используете MySQL), но, пожалуйста, тщательно изучите SQL-инъекцию.

Ответ №2:

Обязательно используйте имя переменной $boolean вместо boolean, иначе она пытается получить константу.

Вы также должны быть осторожны с тем, что вы передаете своему методу. $query — это переменная, которую вы также не определили.

Обязательно сделайте что-то вроде этого

  $extra_text_length = strlen($_GET[extra_text]);
 $boolean = $_GET['first-boolean'];

 function check_boolean($query, $extra_text_length, $boolean, $software){

  if($extra_text_length > 0){

    if($boolean=="and"){
        $query .= " AND ($software.SWID='$_GET[extra_text]')";
        } elseif($boolean=="or"){
        $query .= " OR ($software.SWID='$_GET[extra_text]')";
        } elseif($boolean=="not"){
        $query .= " NOT IN ($software.SWID='$_GET[extra_text]')";
        }
    }
    return $query;
  }

$query = '...';
$software = '';
$query = check_boolean($query, $extra_text_length, $boolean, $software);
  

Также избегайте использования внешних переменных в функции, поскольку вы не знаете, как они отреагируют. ($_GET)
Вы также должны проверить существование всех ваших переменных.

Ответ №3:

Сначала вы должны использовать выражения $boolean вместо boolean внутри if .

Второе: $query , $extra_text_length и $boolean должны быть видны внутри check_boolean . Вы можете сделать это, передав их в качестве параметров, например:

 function check_bookean(amp;$query, $extra_text_length, $boolean) {
    # ...
}

check_boolean($query, $extra_text_length, $boolean);
  

$query необходимо добавить амперсанд (amp;) в определение функции, потому что оно изменено внутри функции.

check_boolean затем примет ваш запрос и добавит к нему логическое условие на основе extra_text . Но вам нужно очистить содержимое перед включением его в запрос, чтобы избежать внедрения SQL:

 if($extra_text_length > 0){

    $extra_text = mysql_real_escape_string($_GET['extra_text']);  # sanitize content

    if(boolean=="and"){
        $query .= " AND (software.SWID='$extra_text')";           # to use it in the query
        } elseif(boolean=="or"){
        $query .= " OR (software.SWID='$extra_text')";
        } elseif(boolean=="not"){
        $query .= " NOT IN (software.SWID='$extra_text')";
        }
    } return boolean;
}
  

Ответ №4:

Ну, проблема в области видимости переменных, когда вы вводите в функциональный блок, переменные в глобальной области видимости не видны.

Вы должны передать их в качестве параметра. Ваш вызов должен быть:

 check_boolean($extra_text_length, $boolean, $software);
  

и вы должны изменить объявление вашей функции как:

 function check_boolean($extra_text_length, $boolean, $software)
  

Кроме того, было бы лучше избегать смешивания глобального кода и ваших функций. вы могли бы поместить их в отдельный файл и использовать require_once для их включения.

Я бы также посоветовал вам вообще не использовать какой-либо глобальный код. например, вы можете обернуть первые две строки в функцию main().

Также «return boolean;» должно быть «return $query;»

Ответ №5:

Вы забыли знак $ перед $boolean. Я делал то же самое, когда начинал с PHP, зная другие языки ;-).

Ответ №6:

логическое значение==»and» должно быть $boolean==»and»

Ответ №7:

$extra_text_length , $boolean и $query недоступны внутри функции. Вы должны передать их в качестве аргументов.

Кроме того, изменение аргумента внутри функции не изменяет его значение вне функции. Вместо этого верните текст. Вот немного улучшенная версия:

 function check_boolean($length, $b, $extra_text){
  $operators = array('and', 'or', 'not');
  if($length > 0){
     if(in_array($b, $operators){
         return " " . $b . " (software.SWID='" . $extra_text . "')";
     }
  }
  return '';
}

$query .= check_boolean($extra_text_length, $boolean, mysql_real_escape_string($_GET['extra_text']));
  

Обратите внимание, что вы должны вызывать mysql_real_escape_string пользовательский ввод, иначе ваш код подвержен SQL-инъекции.