2013-01-23 56 views
17

我正在嘗試使用AJAX autocompletes,並且遇到了使兩種語言協同工作的幾個問題。帶有多個參數的PHP isset()

當我更換所有隻有1 $ _ POST的issets的片段下方會工作,但是通過添加另一個$ _ 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'。順便說一句'isset == true'是多餘的。 – dualed

回答

48

參數(一個或多個),以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 

順便說一句,你可以自定義你的過濾器來檢查提交值的各個部分。

+0

一注 - 從PHP 5.5.0開始'empty()'也明確支持表達式。 – Boaz

+0

你對我來說已經遠遠超前了,我簡直就是在學習PHP。謝謝 –

6

isset()的參數應該是用逗號分隔(,)而不是點號(.)。您當前的代碼將變量連接到單個參數中,而不是將它們作爲單獨的參數傳遞。

所以原來的代碼評估變量作爲一個統一string值:

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

雖然正確的形式分別評估它們作爲變量:

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

你只需要:

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

isset && !empty是多餘的。

1

使用PHP的OR (||)爲PHP isset()邏輯運算符與多個運營商 e.g每個數組索引

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

} 
+0

這是錯誤的,並且如果設置了$ _POST ['room']'而其餘的不是,則會生成通知。您需要將所有這些包裝在一個'isset'中,並將最後兩個變量作爲參數傳遞,或者您需要將它們包裝在它們自己的'isset'中。 –