【问题标题】:Twitter typeahead with mysql sourceTwitter typeahead with mysql source
【发布时间】:2015-07-02 05:30:03
【问题描述】:

我正在尝试使用 PHP 源文件的 typeahead 函数。

这是我的输入字段:

<input type="text" class="form-control typeahead" id="test-field" placeholder="Contact"/>

我的 PHP 源码:

<?php

    require_once dirname(__FILE__) . ("/../db_connection.php");
    global $connection;
    $search = $_POST['query'];
    $get = "SELECT * FROM contacts WHERE contact_fname LIKE '%{$search}%'";
    $query = mysqli_query($connection, $get);

    $json = array();
    while ($rows = mysqli_fetch_assoc($query)) {
      $json[] = $rows;
    }
    $json =  json_encode($json);
    print_r($json);
?>

我的 JQuery:

 <script src="plugins/typeahead/typeahead.bundle.min.js"></script>
  jQuery(document).ready(function() {


      // Init Twitter Typeahead.js
    var substringMatcher = function(strs) {
      return function findMatches(q, cb) {
        var matches, substrRegex;

        matches = [];

        substrRegex = new RegExp(q, 'i');

                $.each(strs, function(i, str) {
          if (substrRegex.test(str)) {
                        matches.push({
              value: str
            });
          }
        });

        cb(matches);
      };
    };


    $('.typeahead').typeahead({
          source: function (query, process) {
            $.ajax({
              url: '../includes/functions/json_test.php',
              type: 'POST',
              dataType: 'JSON',
              data: 'query=' + query,
              success: function(data) {
                //console.log(data);
                process(data);
              }
            });
    }
  });

  });

如果我直接使用以下方式访问 PHP 文件,我能够显示结果:例如 (localhost/X/XX/json_test.php?query=er) - 仅当我将 $_POST 更改为 $_GET 时(不知道为什么)。 Typeahead 根本不工作。我缺少的任何东西。 谢谢。

编辑: 这是返回的 json:

[{"contact_id":"6","contact_account_id":"38","contact_fname":"firstname","contact_lname":"lastname","contact_title":"CEO","contact_phone":"(123) 456-5885","contact_email":"user@email.com","contact_fax":"(123) 456-5885","contact_facebook":null,"contact_twitter":null,"contact_linkedin":null,"contact_is_main":"0"}]

【问题讨论】:

  • 你的$.ajax中的type: 'POST2',是什么?
  • @Sean Typo,抱歉 - 已删除。
  • 您要在返回的 JSON 中搜索哪个字段?
  • @LloydBanks contact_fname

标签: php jquery mysql twitter-bootstrap


【解决方案1】:

您的代码存在一些问题:

  1. 您只能通过$_GET 访问它的原因是您正在向服务器发出GET 请求。

  2. 向服务器发出搜索请求时,实际上最好使用GET 请求,因为您尝试获取数据而不是操作数据。

  3. 您直接注入到您的搜索词 mysqli_query 调用中,这会使您面临 SQL 注入漏洞。

  4. 使用print_r 不会为JavaScript 提供可读格式的数据。

  5. 在未设置正确标头 (application/json) 的情况下将数据发送回 JavaScript 将导致结果不一致。

我建议做以下事情

PHP:

require_once dirname(__FILE__) . ("/../db_connection.php");

global $connection;

$search = $_GET['query'];

$query = "SELECT * FROM `contacts` WHERE `contact_fname` LIKE '%?%'";

$results = [];

if ($stmt = mysqli_prepare($connection, $query)) {

    mysqli_stmt_bind_param($stmt, "s", $search);

    mysqli_stmt_execute($stmt);

    $result = mysqli_stmt_get_result($stmt);

    while ($row = mysqli_fetch_array($result, MYSQLI_ASSOC) {
        $results[] = $row;
    }
}

header("Content-type: application/json");

exit(json_encode($results));

JavaScript(在 HTML 中):

<script src="plugins/typeahead/typeahead.bundle.min.js"></script>
<script>
jQuery(document).ready(function() {


    // Init Twitter Typeahead.js
    var substringMatcher = function(strs) {
        return function findMatches(q, cb) {
            var matches, substrRegex;

            matches = [];

            substrRegex = new RegExp(q, 'i');

            $.each(strs, function(i, str) {
                if (substrRegex.test(str)) {
                    matches.push({
                        value: str
                    });
                }
            });

            cb(matches);
        };
    };


    $('.typeahead').typeahead({
        source: function (query, process) {
            $.getJson('../includes/functions/json_test.php', {
                'query': query
            }, function(data) {
                //console.log(data);
                process(data);
            });
        }
    });
});
</script>

我注意到的另一件事是,您的 javascript 位于脚本标记之外,而您的脚本标记位于其上方的 plugins/typeahead/typeahead.bundle.min.js 文件中。如果这确实在 JavaScript 文件中,则需要将其放在页面上的 HTML 中,并将 JavaScript 包装在 &lt;script&gt; 标记中。还要确保您的路径对于 JavaScript 和 PHP 文件是正确的,以便正确加载它们。通常最好为您的资产提供相对于根 URL 的绝对 URL,例如 /full/path/to/plugins/typeahead/typeahead.bundle.min.js/full/path/to/includes/functions/json_test.php

我担心的一件事是,您的 db_connection.php 文件似乎位于您的 webroot 中,这意味着人们可以访问并可能下载您的 /includes/db_connection.php 文件并获取您的所有数据库连接凭据。

如果您需要任何进一步的帮助,请告诉我!

【讨论】:

  • 你好安德鲁,它不起作用。我有正确的代码放置。我是否必须通过 include() 在代码中包含 json_test.php。 ?在 PHP 查询的第 13 行还得到“mysqli_prepare() 需要 2 个参数”。
  • 查看我对mysqli_prepare 的编辑,最初我使用mysqli 的OOP 实现编写它。您不需要在页面中使用带有 javascript 的 include(),因为 getJson jQuery 调用直接从页面加载它。你的项目的公共目录结构是什么?
猜你喜欢
  • 1970-01-01
  • 2013-07-13
  • 1970-01-01
  • 2013-03-28
  • 1970-01-01
  • 2014-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多