使用服务器端脚本检索输入值以进行自动完成()

时间:2016-03-02 16:56:39

标签: php jquery post autocomplete jquery-autocomplete

当我尝试使用以下代码实现自动完成时:

$('#keyword').autocomplete({
    source : '/Dev/pages/search.php',
    minLength : 3,
    type : 'POST',
    select: function( event, ui )
    {
         $(this).data("autocomplete").menu.element.addClass("yellow");
    }
})
.data( "ui-autocomplete" )._renderItem = function( ul, item )
{
    console.log(item);
    return $( "<li>" )
    .append( "<a>" + add3Dots(item.name,20) + "</a>" )
    .appendTo( ul );
 };
if (isset($_POST["term"])){

    $term = trim($_GET['term']);

    $parts = explode(' ', $term);
    $p = count($parts);

    $a_json = array();
    $a_json_row = array();

    $search = connexion::bdd_test();
    $requete = "SELECT name from BDD_TEST.companies";

    for($i = 0; $i < $p; $i++) {
      $requete .= ' WHERE name LIKE ' . "'%" . $conn->real_escape_string($parts[$i]) . "%'";
    }

    $result = $search->query($requete);
    while($donnees = $result->fetch(PDO::FETCH_ASSOC)) {
        $a_json_row["name"] = $data['name'];
        array_push($a_json, $a_json_row);       
    }

}
else
{
    $a_json['call']=false;
    $a_json['message']="Problem to collect word.";
}

$json = json_encode($a_json);
print_r($json);

当我测试时,如果条件不满意,我直接从其他“问题收集单词”得到消息。 这意味着$ _POST [“term”]未定义。

如何检索输入值?

1 个答案:

答案 0 :(得分:0)

为了确保已发送值,您可以查看浏览器使用PHP发送到Web服务器的标头以进行测试。

这可以使用apache_request_headers()函数,但只有在Apache作为模块运行PHP时才有效。

  • 如何使用apache_request_headers():

如果PHP作为模块在Apache上运行,则可以使用apache_request_headers()函数检索浏览器发送的标头。以下示例代码使用print_r从此函数调用中输出值:

print_r(apache_request_headers());

使用Google Chrome的示例请求,上面的输出会输出类似于以下内容的内容:

Array
(
  [Host] => www.testing.local
  [Connection] => keep-alive
  [User-Agent] => Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.206.1 Safari/532.0
  [Cache-Control] => max-age=0
  [Accept] => application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
  [Accept-Encoding] => gzip,deflate,sdch
  [Accept-Language] => en-US,en;q=0.8
  [Accept-Charset] => ISO-8859-1,utf-8;q=0.7,*;q=0.3
)
  • 当PHP作为CGI运行时的替代选择:

如果PHP没有作为Apache上的模块运行,浏览器标题应该存储在$ SERVER数组中,其中键是请求标题名称转换为大写,超级用下划线替换,并且前缀为HTTP

上面显示来自$ _SERVER的相关行的相同请求如下:

[HTTP_HOST] => www.testing.local
[HTTP_CONNECTION] => keep-alive
[HTTP_USER_AGENT] => Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.206.1 Safari/532.0
[HTTP_CACHE_CONTROL] => max-age=0
[HTTP_ACCEPT] => application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
[HTTP_ACCEPT_ENCODING] => gzip,deflate,sdch
[HTTP_ACCEPT_LANGUAGE] => en-US,en;q=0.8
[HTTP_ACCEPT_CHARSET] => ISO-8859-1,utf-8;q=0.7,*;q=0.3

如果apache_request_headers()函数不存在,则替代方法是创建我们自己的函数,该函数仅从$ _SERVER中提取值并将键名转换为与apache_request_headers()相同的样式。这样工作原理如下:

if(!function_exists('apache_request_headers')) {
    function apache_request_headers() {
        $headers = array();
        foreach($_SERVER as $key => $value) {
            if(substr($key, 0, 5) == 'HTTP_') {
                $headers[str_replace(' ', '-', ucwords(str_replace('_', ' ', strtolower(substr($key, 5)))))] = $value;
            }
        }
        return $headers;
    }
}

只有具有该名称的函数尚不存在时,才会声明新函数。最终结果是,无论内部PHP函数是否存在,您都可以在代码中调用具有此名称的函数。

循环通过$ SERVER数组完成,任何以HTTP 开头的键都会添加到数组中,并且密钥通过一系列函数调用转换为与由apache_request_headers()返回。

  • 在Google Chrome浏览器中查看HTTP标头

Chrome有一个带有多个项目的“网络”标签,当我点击它们时,我可以在标签中看到右侧的标题。

在Windows上按 F12 或在Mac上按⌥⌘I打开Chrome开发者工具。

enter image description here

  • 尝试在不知道HTTP方法的情况下检索值

您可以使用

检测PHP中使用的请求类型(GET,POST,PUT或DELETE)
$_SERVER['REQUEST_METHOD']

有关详细信息,请参阅documentation for the $_SERVER variable

或者您可以使用$ _REQUEST ['you_variable']检索值。

注意$ _REQUEST是一个与$ _GET和$ _POST不同的变量,在PHP中也是如此 - 在运行时修改$ _GET或$ _POST元素不会影响$ _REQUEST中的元素,反之亦然。