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

Retrieve input value with server-side script for 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);

当我测试时,如果条件不满足,我会直接从其他地方收到消息“Problem to collect word。” 这意味着 $_POST["term"] 未定义。

如何检索输入值?

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

这可以使用 apache_request_headers() 函数实现,但仅当 PHP 是 Apache 上的 运行 作为模块时才有效。

  • 如何使用 apache_request_headers() :

如果 PHP 在 Apache 上是 运行 作为模块,那么可以使用 apache_request_headers() 函数检索浏览器发送的 header。以下示例代码使用 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 上的模块,浏览器 headers 应该存储在 $SERVER 数组中,键是请求 header 名称转换为大写,连字符替换为下划线,前缀为 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 headers

Chrome 有一个包含多个项目的选项卡 "Network",当我单击它们时,我可以在选项卡的右侧看到 header。

在 windows 上按 F12 或在 mac 上按 ⌥⌘I 调出 Chrome 开发者工具。

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

您可以使用

在 PHP 中检测使用了哪种请求类型(GET、POST、PUT 或 DELETE)
$_SERVER['REQUEST_METHOD']

详情请见documentation for the $_SERVER variable

或者您可以使用 $_REQUEST['you_variable'].

检索值

注意 $_REQUEST 是一个不同于 $_GET 和 $_POST 的变量,它在 PHP 中被这样对待 -- 修改 $_GET 或 $_POST 元素运行时间不会影响$_REQUEST中的元素,反之亦然。