37

AJAX オートコンプリートを使用しようとしていますが、2 つの言語を相乗効果で動作させるのにいくつか問題があります。

すべての isset を 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を使用する必要があることを理解しています。最初にロジックを取得しようとしています:)

J:

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('');

        });
    });
});
});
4

4 に答える 4

86

へのパラメータisset()は、式ではなく変数参照でなければなりません(あなたの場合は連結)。ただし、次のように複数の条件をグループ化できます。

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

これは、 へのすべての引数が設定されていて、 が含まれていないtrue場合にのみ返されます。isset()null

isset($var)isset($var) == trueは同じ効果があるため、後者はやや冗長であることに注意してください。

アップデート

式の 2 番目の部分は次の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

ところで、フィルターをカスタマイズして、送信された値のさまざまな部分をチェックできます。

于 2013-01-23T09:49:49.097 に答える
9

のパラメータは、ドット記号 ( ) ではなくisset()コンマ記号 ( ) で区切る必要があります。現在のコードでは、変数を個別のパラメーターとして渡すのではなく、1 つのパラメーターに連結しています。,.

したがって、元のコードは変数を統一されたstring値として評価します。

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

正しい形式では変数として個別に評価されますが、次のようになります。

isset($_POST['search_term'], $_POST['postcode']) // Correct
于 2013-01-23T09:48:44.113 に答える
8

必要なのは:

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

isset && !empty冗長です。

于 2013-01-23T09:50:13.217 に答える
2

複数の演算子を持つphpのphpのOR (||)論理演算子を使用します。isset()

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

}
于 2014-05-31T13:32:17.737 に答える