PHP isset() с несколькими параметрами
Я пытаюсь работать с автозаполнениями AJAX, и у меня есть несколько проблем с тем, чтобы два языка работали в синергии.
Когда я заменяю все этикеты только 1 $_POST, снимок ниже будет работать, однако, добавив еще $_POST, я получаю сообщение об ошибке в строке 5.
<?php
require_once '../Configuration.php';
if (isset($_POST['search_term'] . $_POST['postcode']) == true && empty ($_POST['search_term'] . $_POST['postcode']) == false) {
$search_term = mysql_real_escape_string($_POST['search_term'] . $_POST['postcode']);
$query = mysql_query("SELECT `customer_name`,`postcode` FROM `Customers` WHERE `customer_name` LIKE '$search_term%' ");
while(($row = mysql_fetch_assoc($query)) !== false) {
//loop
echo '<li>',$row['customer_name'] . $row['postcode'] '</li>';
}
}
?>
Любые советы о том, почему он выбрасывает эту ошибку, будут высоко оценены. Спасибо.
Я понимаю, что я должен использовать mysqli, я просто пытаюсь сначала получить логику:)
Js:
Primary.js:
$(document).ready(function() {
$('.autosuggest').keyup(function() {
var search_term = $(this).attr('value');
var postcode = $_GET['postcode'];
//alert(search_term); takes what is typed in the input and alerts it
$.post('ajax/search.php', {search_term:search_term, postcode:postcode}, function (data) {
$('.result').html(data);
$('.result li').click(function() {
var result_value = $(this).text();
$('.autosuggest').attr('value', result_value);
$('.result').html('');
});
});
});
});
Ответы
Ответ 1
Параметр до isset()
должен быть ссылкой на переменную, а не выражением (в вашем случае - конкатенацией); но вы можете группировать несколько условий вместе следующим образом:
if (isset($_POST['search_term'], $_POST['postcode'])) {
}
Это вернет true
, только если все аргументы в isset()
установлены и не содержат null
.
Обратите внимание, что isset($var)
и isset($var) == true
имеют одинаковый эффект, поэтому последнее несколько избыточно.
Обновление
Вторая часть вашего выражения использует empty()
следующим образом:
empty ($_POST['search_term'] . $_POST['postcode']) == false
Это неправильно по тем же причинам, что и выше. На самом деле вам здесь не нужно empty()
, потому что к этому времени вы уже проверили бы, будут ли переменные установлены, поэтому вы можете сократить полное выражение следующим образом:
isset($_POST['search_term'], $_POST['postcode']) &&
$_POST['search_term'] &&
$_POST['postcode']
Или используя эквивалентное выражение:
!empty($_POST['search_term']) && !empty($_POST['postcode'])
Заключительные мысли
Вам следует использовать функции filter
для управления входами:
$data = filter_input_array(INPUT_POST, array(
'search_term' => array(
'filter' => FILTER_UNSAFE_RAW,
'flags' => FILTER_NULL_ON_FAILURE,
),
'postcode' => array(
'filter' => FILTER_UNSAFE_RAW,
'flags' => FILTER_NULL_ON_FAILURE,
),
));
if ($data === null || in_array(null, $data, true)) {
// some fields are missing or their values didn't pass the filter
die("You did something naughty");
}
// $data['search_term'] and $data['postcode'] contains the fields you want
Btw, вы можете настроить фильтры для проверки различных частей представленных значений.
Ответ 2
Параметры isset()
должны быть разделены знаком запятой (,
), а не знаком точки (.
). Ваш текущий код объединяет переменные в один параметр, а не передает их как отдельные параметры.
Таким образом, исходный код оценивает переменные как унифицированное значение string
:
isset($_POST['search_term'] . $_POST['postcode']) // Incorrect
Пока правильная форма оценивает их отдельно как переменные:
isset($_POST['search_term'], $_POST['postcode']) // Correct
Ответ 3
Вам просто нужно:
if (!empty($_POST['search_term']) && !empty($_POST['postcode']))
isset && !empty
является избыточным.
Ответ 4
Использовать логический оператор php OR (||)
для php isset()
с несколькими операторами
например
if (isset($_POST['room']) || ($_POST['cottage']) || ($_POST['villa'])) {
}