【问题标题】:Jquery and PHP , autocompleteJquery 和 PHP , 自动完成
【发布时间】:2015-09-25 15:13:09
【问题描述】:

所以我刚刚发现了 jquery 自动完成功能,我想将它添加到我的网页中。我想将它连接到我的 php 代码,这样我就可以搜索我的 sql 数据库。但是,每当我尝试运行我的自动完成时,它似乎都没有找到我正在传递的 php 数组(我只是想让一个数组暂时工作)。有人可以帮忙吗?

jQuery 代码

<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <title>jQuery UI Autocomplete - Default functionality</title>
  <link rel="stylesheet" href="//code.jquery.com/ui/1.11.4/themes/smoothness/jquery-ui.css">
  <script src="//code.jquery.com/jquery-1.10.2.js"></script>
  <script src="//code.jquery.com/ui/1.11.4/jquery-ui.js"></script>
  <script>
  $(function() {
    $( "#tags" ).autocomplete({
      source: "test.php"
    });
  });
  </script>
</head>
<body>

<div class="ui-widget">
  <label for="tags">Tags: </label>
  <input id="tags">
</div>


</body>
</html>

PHP 代码

<?php
    $data[] = array(
        'c++','Java','JavScript',"c#" );
echo json_encode($data);
?>

【问题讨论】:

  • 你确定是`$data[] = array('c++','Java','JavScript',"c#");`而不是`$data = array('c++' ,'Java','JavScript',"c#" );`
  • 我实际上有 [],只是没有正确复制它。那没用
  • 你可以把它当作 $data = array('c++','Java','JavScript',"c#" );顺便说一句
  • 我认为您的问题在于您的 javascript 处理不正确。请参阅下面的答案。

标签: javascript php jquery html autocomplete


【解决方案1】:

这是您答案的更新版本,应该可以解决已弃用的 SQL 驱动程序和注入问题。您需要将SECOND_COLUMNNAME 替换为您的实际列名。除此之外,我认为这应该可行。

<?php
try {
    $dbh = new PDO('mysql:host=localhost;dbname=DB','username','password');
} catch (PDOException $e) {
    print "Error!: " . $e->getMessage() . "<br/>";
    die();
}
if(empty($_REQUEST['term']))
    exit();
//require_once('connect.php'); connection to db is in this file so connection is not needed
$query =  'SELECT name, SECOND_COLUMNNAME FROM locations 
        WHERE name 
        LIKE ?
        ORDER BY id ASC 
        LIMIT 0,10';
$stmt = $dbh->prepare($query);
$stmt->execute(array(ucfirst($_REQUEST['term']) . '%'));
$data = array();
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
    $data[] = array(
                'label' => $row['name'],
                'value' => $row['SECOND_COLUMNNAME']
                );
}
echo json_encode($data);
flush();

链接:

http://php.net/manual/en/pdo.prepared-statements.php
http://php.net/manual/en/pdo.connections.php
https://www.owasp.org/index.php/SQL_Injection_Prevention_Cheat_Sheet
How can I prevent SQL injection in PHP?

也不确定connect.php 中是否还有其他内容,您可能需要将其取回。

【讨论】:

  • 当我添加 $stmt = $dbh->prepare($query); $stmt->execute(array(ucfirst($_REQUEST['term']) . '%')); $数据=数组();。我没有工作
【解决方案2】:

这里使用的数组模式应该如下。

<?php
$data = array(
    array("value"=>'C++'),
    array("value"=>'Java'),
    array("value"=>'Javascript'),
    array("value"=>'C#'),
);
echo json_encode($data);

【讨论】:

  • 它有效,但它显示所有元素,而不是包含相同字母的元素
  • 也试过 $data = array( "value"=>'C++', "value"=>'Java', "value"=>'Javascript', "value"=>'C#' );这只会在我输入任何内容时返回 c#
  • 那永远行不通。 value 键每次都会被覆盖,你只会得到最后一个值。
  • 我认为你需要在这里进行搜索。
  • 是的,当然。你在这里使用数据库吗?如果您要从数据库表中检索数据,则根据您使用类似的查询。 $term = trim(strip_tags($_GET['term']));$qstring = "SELECT * FROM your_tbl WHERE language LIKE '%".$term."%'";
【解决方案3】:

如果您使用的是 PHP >= 5.4:

$data = [
    [ 'value' => 'C++' ],
    [ 'value' => 'Java' ],
    [ 'value' => 'Javascript' ],
    [ 'value' => 'C#' ]
];
echo json_encode( $data );

这是我的自动完成代码的一个工作示例:

function get_data(type, target, min_length )
{
    $(target).autocomplete({
        source: function( request, response ) {
            var submit = {
                term: request.term,
                type: type
            };
            $.ajax({
                url: '/request/get',
                data: { thisRequest: submit},
                dataType: "json",
                method: "post",
                success: function( data ) {
                    response($.map( data.Data, function( item ) {

                        return {
                            label: item.label,
                            value: item.label
                        }
                    }));
                }
            });
        },
        minLength: min_length
    })
}

【讨论】:

  • 您是否发布了整个 javascript 处理程序?
  • 是的,也许这不能通过 php 传递数组来完成
  • 可以,因为我一直在用。你的 javascript 是错误的。当自动完成正在寻找 javascript 数组时,您正在回显 JSON 字符串。
【解决方案4】:
<?php
    $data = array(
        'c++',
        'Java',
        'JavScript',"c#" );
echo json_encode($data);
?>

【讨论】:

  • 不,无论你输入什么,都会返回所有内容
  • 因为此代码返回 4 个值 - 您必须编写一些 PHP 代码来过滤结果:D
【解决方案5】:

所以我想要 Pratik Soni 的建议并进行了搜索。如果有人想使用它,这是 php 代码

<?php
// Connect to server and select databse.
$dblink = mysql_connect('localhost','username','password') or die(mysql_error());
mysql_select_db('DB');
?>

<?php
if(!isset($_REQUEST['term']))
exit();
require('connect.php');
  $term = 
  $query = mysql_query('
SELECT * FROM locations 
WHERE name 
LIKE "'.ucfirst($_REQUEST['term']).'%" 
ORDER BY id ASC 
LIMIT 0,10', $dblink
  );
  $data = array();
  while($row = mysql_fetch_array($query, MYSQL_ASSOC)){
        $data[] = array(
    'label' => $row['name'],
    'value' => $row['name'],
   );   
 }
 echo json_encode($data);
  flush(); 

【讨论】:

  • 这对 SQL 注入开放并使用已弃用的 mysql_ 函数。
  • 谢谢你,如果你有任何建议,我会很乐意让它变得更好。
  • 从这里开始:php.net/manual/en/book.mysqli.php 并深入了解它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-16
  • 2011-07-15
  • 2017-12-11
  • 2015-01-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多