#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-инъекции.