Javascript JQuery使用PDO语句自动完成

Javascript JQuery使用PDO语句自动完成,javascript,php,jquery,autocomplete,Javascript,Php,Jquery,Autocomplete,我很难找到这个错误。我花了大约10个小时进行搜索和测试,但谷歌无法为我提供任何信息。所以你们是我最后的希望。 我有一个简单的html文本字段: <input type="text" value="" id="keyword" name="zip" placeholder="Please enter ZIP code" required> 当我在文本字段中键入值“sw”时,我在控制台中得到以下结果: ["Swaziland\r","Sweden\r","Switzerland\r"

我很难找到这个错误。我花了大约10个小时进行搜索和测试,但谷歌无法为我提供任何信息。所以你们是我最后的希望。 我有一个简单的html文本字段:

 <input type="text" value="" id="keyword" name="zip" placeholder="Please enter ZIP code" required>
当我在文本字段中键入值“sw”时,我在控制台中得到以下结果:

["Swaziland\r","Sweden\r","Switzerland\r"]
这应该是正确的。这是我的第一个问题。“\r”是否正常? 我的第二个也是更重要的问题是:如何添加查询函数autocomplete?我的目标如下例所示:

请帮帮我,我测试了这么长时间,我找不到解决方案。我觉得这有点愚蠢的错误。 以下是所有文件:

autocomplete.php

if (!isset($_GET['keyword'])) {
    die();
}
$keyword = $_GET['keyword'];
$data = SQL::searchForKeyword($keyword);
echo json_encode($data);
searchForKeyword函数:

static function searchForKeyword($keyword) {
    $stmt = self::getInstance()->_conn->prepare("SELECT NameCountry as countries FROM `country` WHERE NameCountry LIKE ? ORDER BY countries");
    $keyword = $keyword . '%';
    $stmt->bindParam(1, $keyword, PDO::PARAM_STR, 100);
    $isQueryOk = $stmt->execute();
    $results = array();
    if ($isQueryOk) {
        $results = $stmt->fetchAll(PDO::FETCH_COLUMN);
    } else {
        trigger_error('Error executing statement.', E_USER_ERROR);
    }
    return $results;
}

jQuery ui文档的关键在于找到正确的页面。
您需要的是示例。

我在这个例子上浪费了很多时间(我甚至无法运行),因为我被“p”吓坏了

因此,对动态加载自动完成下拉列表的示例进行了一些增强。
我希望它能帮助很多人

有趣的是,我没有像jQuery文档所建议的那样使用
jsonp

它在控制台中创建了一个奇怪的错误:

错误:未调用jquery1124093770357477123055_1476875409950(…)


jQuery UI自动完成-远程数据源
.ui自动完成加载{
背景:白色url(“ajax loader.gif”)右中心无重复;
}
.ui小部件{
宽度:500px;
}
.ui前端{
宽度:10em;
背景色:#bebebe;
}
#日志{
高度:200px;
宽度:500px;
溢出:自动;
}
#诺雷索{
显示:无;
颜色:红色;
左:1米;
}
$(函数(){
功能日志(消息){
$(“”).text(message).appendTo(“#log”);
$(“#UScities”).blur();
}
$(“#UScities”).autocomplete({
来源:功能(请求、响应){
$.ajax({
url:“search.php”,
数据:{关键字:request.term},
数据类型:“json”,//不要使用jsonp!
cache:false,
成功:功能(数据){
控制台日志(数据);
//即使成功了,也可能没有结果。。。
if(typeof(数据[0])!=“未定义”){
//如果显示无结果错误,请将其删除
$(“#noResult”).css(“显示”、“无”);
//为了好玩,数一数!
var计数=0;
while(数据[计数]){
console.log(数据[计数]);
计数++;
}
}否则{
count=“否”;
//显示无结果错误
$(“#noResult”).css(“显示”、“内联”);
}
控制台日志(计数+结果);
//将数据传递到下拉列表!
答复(数据);
},
错误:函数(jqXHR、textStatus、errorshown){
console.log(错误抛出);
}
});
},
最小长度:4,
选择:功能(事件、用户界面){
日志(ui.item.value);
}
});
//显示输入焦点的结果
$(“#UScities”)。关于(“焦点”,函数(){
$(“#ui-id-1”).css(“显示”、“块”);
});
});
美国城市:
无结果
我已经在控制台中添加了结果计数(可以用来触发一些东西)和一条“无结果”消息给用户,因为关键字搜索可能没有结果

现在,jQuery文档中非常缺乏的是如何生成json输出

<?php
if (!isset($_GET['keyword'])) {
    // Do nothing if no keyword!
    die();
}

// Database connection infos (PDO).
$dsn = 'mysql:dbname=[Database Name];host=localhost';
$user = '[Database User]';
$password = '[UserPassword]';

try {
  $dbh = new PDO($dsn, $user, $password);
} catch (PDOException $e) {
  echo 'Connexion failed : ' . $e->getMessage();
}

// Getting the keyword and add % to get data that begins with it.
$keyword = $_GET['keyword'] . '%';

// If you want the keyword to be "contained" in the data, use (uncomment it):
//$keyword = '%' . $_GET['keyword'] . '%';

// Query.
$query = "SELECT city FROM SO_USAzipcodes WHERE city LIKE ? GROUP BY city limit 30";

$stmt = $dbh->prepare($query);
$stmt->bindParam(1, $keyword);

// Executing.
$stmt->execute();

// If SQL error...
if (!$stmt) {
   echo "\nPDO::errorInfo():\n";
   print_r($dbh->errorInfo());
   die();
}

// Fetching.
$data = array();
$data = $stmt->fetchAll(PDO::FETCH_COLUMN);

// This is sending the json to autocomplete.
echo json_encode( $data );
?>

如果此文件中有语法错误…
或者,如果由于数据库连接或SQL语法错误而出现错误…

您将在console中看到类似的内容:

SyntaxError: Unexpected token < in JSON at position 0(…)
SyntaxError:JSON中位于位置0(…)的意外标记

主页上什么也没发生,只是不断旋转的
.gif
。顺便说一句,我刚刚发现这个值得一看

我会尝试一下,让你知道,不过我已经非常感谢你了!!所以我试了一下。这又是我的问题。我总是得到“SyntaxError:Unexpected token<在JSON中的位置0(…)”错误。这是因为我必须链接search.php文件。在我的例子中,它被称为autocomplete.php。但由于我使用的是MVC原则,所以我必须将其与php联系起来。如下所示:url:“”但这似乎不起作用=(有什么建议吗?您的这个错误是因为您的autocomplete.php出现了一个错误,而不是json。直接访问它可以完全看到错误(使用完整路径+关键字,如
https://www.bessetteweb.com/SO/40118887/search.php?keyword=mass
)或检查您的
错误
<?php
if (!isset($_GET['keyword'])) {
    // Do nothing if no keyword!
    die();
}

// Database connection infos (PDO).
$dsn = 'mysql:dbname=[Database Name];host=localhost';
$user = '[Database User]';
$password = '[UserPassword]';

try {
  $dbh = new PDO($dsn, $user, $password);
} catch (PDOException $e) {
  echo 'Connexion failed : ' . $e->getMessage();
}

// Getting the keyword and add % to get data that begins with it.
$keyword = $_GET['keyword'] . '%';

// If you want the keyword to be "contained" in the data, use (uncomment it):
//$keyword = '%' . $_GET['keyword'] . '%';

// Query.
$query = "SELECT city FROM SO_USAzipcodes WHERE city LIKE ? GROUP BY city limit 30";

$stmt = $dbh->prepare($query);
$stmt->bindParam(1, $keyword);

// Executing.
$stmt->execute();

// If SQL error...
if (!$stmt) {
   echo "\nPDO::errorInfo():\n";
   print_r($dbh->errorInfo());
   die();
}

// Fetching.
$data = array();
$data = $stmt->fetchAll(PDO::FETCH_COLUMN);

// This is sending the json to autocomplete.
echo json_encode( $data );
?>
SyntaxError: Unexpected token < in JSON at position 0(…)