使用自动完成的服务器端脚本检索输入值()
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中的元素,反之亦然。
当我尝试使用以下代码实现自动完成时:
$('#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中的元素,反之亦然。