【问题标题】:PHP isset() with multiple parametersPHP isset() 带有多个参数
【发布时间】:2013-01-06 17:58:34
【问题描述】:

我正在尝试使用 AJAX 自动完成功能,但在让两种语言协同工作时遇到了一些问题。

当我只用 1 个 $_POST 替换所有 issets 时,下面的 sn-p 将起作用,但是通过添加另一个 $_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('');

        });
    });
});
});

【问题讨论】:

  • 每个数组索引一个isset。顺便说一句,isset == true 是多余的。

标签: php mysql ajax


【解决方案1】:

isset() 的参数必须是变量引用而不是表达式(在您的情况下是连接);但您可以像这样将多个条件组合在一起:

if (isset($_POST['search_term'], $_POST['postcode'])) {
}

仅当isset()所有 参数均已设置且不包含null 时,才会返回true

注意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

顺便说一句,您可以自定义过滤器以检查提交值的各个部分。

【讨论】:

  • 请注意 - 自 PHP 5.5.0 起 empty() 也明确支持表达式。
  • 你对我来说已经很先进了哈哈,我实际上只是在学习 PHP。谢谢
【解决方案2】:

你只需要:

if (!empty($_POST['search_term']) && !empty($_POST['postcode']))

isset &amp;&amp; !empty 是多余的。

【讨论】:

    【解决方案3】:

    isset() 的参数应该用逗号分隔(,)而不是点号(.)。您当前的代码将变量连接成一个参数,而不是将它们作为单独的参数传递。

    所以原始代码将变量评估为统一的string值:

    isset($_POST['search_term'] . $_POST['postcode']) // Incorrect
    

    虽然正确的形式将它们分别作为变量进行评估:

    isset($_POST['search_term'], $_POST['postcode']) // Correct
    

    【讨论】:

      【解决方案4】:

      将 php 的 OR (||) 逻辑运算符用于具有多个运算符的 php isset() 例如

      if (isset($_POST['room']) || ($_POST['cottage']) || ($_POST['villa'])) {
      
      }
      

      【讨论】:

      • 这是错误的,如果设置了$_POST['room'] 而其他没有设置,则会生成通知。您需要将所有这些包装在一个 isset 中并将最后两个变量作为参数传递,或者您需要将它们包装在它们自己的 isset 中。
      猜你喜欢
      • 1970-01-01
      • 2019-09-22
      • 1970-01-01
      • 2022-12-01
      • 2021-10-29
      • 1970-01-01
      • 1970-01-01
      • 2017-04-10
      • 1970-01-01
      相关资源
      最近更新 更多