использование автозаполнения для заполнения текстового поля ввода после того, как пользователь вводит свой ввод, используя jquery

Я пытаюсь использовать плагин autosuggest для jquery, чтобы принять ввод пользователя, jquery, который вводит в скрипт php mysql, чтобы получить информацию, а затем заменить ввод пользователя тем, что было получено из запроса jquery. Теперь это должно поставить вас всех в тупик на минуту.

во-первых... если я заменю возвращенный текст из сценария автозаполнения простым текстом, моя функция jquery javascript отлично вернет это значение. Но если я попытаюсь вернуть запрошенные данные из скрипта, тогда я получу ноль (0) для возвращаемых данных.

Я предоставлю код, необходимый для работы. Насколько мне известно, я включу в этот код те места, где существует проблема. и я приведу примеры того, что работает и что не работает.

Прежде чем написать это, я проверил несколько возможных ситуаций.

  1. Я убедился, что скрипт автозаполнения подключается к базе данных, что запрос действителен, что данные действительно существуют в таблице и что найденный набор результатов правильно отображается с помощью вторичной формы, которая просто отправляет запрос на публикацию в script, и он отвечает именно теми данными, которые он должен, поэтому мой скрипт запросов, который я знаю, работает правильно. Но в то же время я подозреваю, что это часть проблемы.

  2. Я проверил, что моя функция javascript AcctNmb запускается при изменении с помощью предупреждения, а также я вижу, что функция выполняется полностью по ответу, который я получаю в текстовом поле ввода по мере его изменения, класс загрузки включен, значение изменяется, класс загрузки удаляется, функция завершается полностью, как и должна.

  3. Теперь, чтобы увидеть, что проблема не удалась и удалась, просто перейдите к автозапросу php, и вы увидите мои две строки, одна из которых дает действительный ответ, а другая дает ответ 0. Это проблема, я не могу понять, как разница между двумя строками делает все различие в мире на этом.

// РЕДАКТИРОВАТЬ Я попытался изменить сценарий запроса на метод запроса старой школы, и я все еще получаю те же результаты. Если я повторяю запрошенные данные, я получаю ответ «0», если я повторяю строку текста, то этот текст возвращается мне. Ниже я добавил альтернативный метод запроса. Пожалуйста, кто-нибудь может увидеть, что я делаю неправильно? Я просто не вижу разницы между повторением вариантов и повторением строки текста, поскольку они должны быть, насколько я знаю, одно и то же.

//html код формы

  <form id="FormVoucher" name="FormVoucher" method="post" action="index.php">
    <table width="100%">
      <tr>
        <td>Supplier Number:</td>
        <td><input type="text" size="25" value="" name="Facctnmb" id="Facctnmb" onChange="AcctNmb(this)" AUTOCOMPLETE=OFF /></td>
      </tr>
      <tr>
        <td>Invoice Number:</td>
        <td><input type="text" name="Finvnmb" id="Finvnmb" size="25" maxlength="25" AUTOCOMPLETE=OFF /></td>
      </tr>
      <tr>
        <td>Invoice Amount:</td>
        <td><input type="text" name="Finvamt" id="Finvamt" size="25" maxlength="30" AUTOCOMPLETE=OFF /></td>
      </tr>
      <tr>
        <td>Invoice Date:</td>
        <td><input type="text" name="Finvdt" id="Finvdt" size="10" AUTOCOMPLETE=OFF /></td>
      </tr>
      <tr>
        <td>Purchase Order:</td>
        <td><input type="text" name="Fpo" id="Fpo" size="10" maxlength="8" AUTOCOMPLETE=OFF /></td>
      </tr>
      <tr>
        <td>Remark:</td>
        <td><input name="Fremark" id="Fremark" type="text" size="30" maxlength="30" AUTOCOMPLETE=OFF /></td>
      </tr>
      <tr>
        <td>&nbsp;</td>
        <td>&nbsp;</td>
      </tr>
    </table>
    <div align="left">
      <p>G/L: <input name="Fgl[]" id="Fgl[]" type="text" size="12" maxlength="15" AUTOCOMPLETE=OFF /> Amount: <input name="Famt[]" id="Famt[]" type="text" size="15" maxlength="15" AUTOCOMPLETE=OFF /></p>
      <p id="add-element">Add More G/L Lines For Entry</p>
      <div id="content"></div>
      <input type="submit" value="Submit" />
    </div>
  </form>

//код javascript

function AcctNmb(inputString){
$('#Facctnmb').addClass('load');
  $.post("acctnmb.php", {queryString: ""+inputString+""}, function(data){
    if(data.length >0) {
      $('#Facctnmb').val(data);
      $('#Facctnmb').removeClass('load');
    }
  });
}

// скрипт запроса автозаполнения

<?php
$db = new mysqli('localhost', 'username' ,'password', 'data');

if(!$db) {

  echo 'Could not connect to the database.';
} else {

  if(isset($_POST['queryString'])) {
      $queryString = $db->real_escape_string($_POST['queryString']);
  if(strlen($queryString) >0) {
      $query = $db->query("SELECT acct, mailing_name FROM pub_addrs WHERE acct = '$queryString'");
      if($query) {
        $result = $query->fetch_object();
        $varresults = $result->acct." ".$result->mailing_name;
        echo $varresults; //this one fails
        //echo 'This works'; 

      } else {
        echo 'OOPS we had a problem :(';
      }
  } else {
  // do nothing
  }
  } else {
      echo 'There should be no direct access to this script!';
  }
}
?>

//EDIT //альтернативный скрипт запроса автозаполнения

<?php
require_once('../Connections/workdata.php');
//select database
mysql_select_db($database_workdata, $workdata);

if(isset($_POST['queryString'])) {
  $queryString = $_POST['queryString'];
  $query = sprintf("SELECT acct, mailing_name FROM pub_addrs WHERE acct = '%s'",$queryString);
  $result = mysql_query($query, $workdata) or die(mysql_error());
  $row_result = mysql_fetch_assoc($result);
  echo $row_result['acct']." ".$row_result['mailing_name'];//this fails
  //echo 'this works';
}
?>

//тестовые данные таблицы mysql

-- phpMyAdmin SQL Dump
-- version 3.3.6deb1
-- http://www.phpmyadmin.net
--
-- Host: localhost
-- Generation Time: Sep 05, 2010 at 04:12 PM
-- Server version: 5.1.49
-- PHP Version: 5.3.2-2

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";


/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;

--
-- Database: `workdata`
--

-- --------------------------------------------------------

--
-- Table structure for table `pub_addrs`
--

CREATE TABLE IF NOT EXISTS `pub_addrs` (
  `acct` int(11) NOT NULL,
  `mailing_name` varchar(50) NOT NULL,
  `special_payee` int(11) NOT NULL,
  `pub_vendor` varchar(1) NOT NULL,
  `longaddress` varchar(20) NOT NULL,
  `alpha_name` varchar(40) NOT NULL,
  PRIMARY KEY (`acct`),
  KEY `longaddress` (`longaddress`),
  KEY `special_payee` (`special_payee`),
  KEY `alpha_name` (`alpha_name`),
  FULLTEXT KEY `mailing_name` (`mailing_name`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

--
-- Dumping data for table `pub_addrs`
--

INSERT INTO `pub_addrs` (`acct`, `mailing_name`, `special_payee`, `pub_vendor`, `longaddress`, `alpha_name`) VALUES
(701, 'DO NOT MAIL- Deleted Account ', 701, 'C', 'C24250 ', '**** DUPLICATE SET-UP **** '),
(702, 'DO NOT MAIL- Deleted Account ', 702, 'C', 'C24603 ', '**** DUPLICATE SET-UP **** ');

person cmptrwhz    schedule 05.09.2010    source источник
comment
ваш вопрос настолько огромен, что я сомневаюсь, что вы получите много ответов ... Убедитесь, что у вас открыта вкладка консоли firebug, когда вы тестируете форму (или любые запросы ajax), посмотрите и запросы и ответы   -  person Haroldo    schedule 06.09.2010
comment
Я только что установил firebug, похоже, с этим придется немного поучиться, но спасибо за совет, я попробую, чтобы посмотреть, что происходит. Большое Вам спасибо.   -  person cmptrwhz    schedule 06.09.2010
comment
похоже, что мой отправляемый запрос не отправляется, как я думал, я на самом деле отправляю объект, а не текст, который, как я думал, я отправлял, большое спасибо, поскольку теперь я понимаю, что происходит. Из firebug: queryString [object HTMLInputElement] Source queryString=%5Bobject+HTMLInputElement%5D   -  person cmptrwhz    schedule 06.09.2010
comment
Попробуйте это devbridge.com/projects/autocomplete/jquery   -  person zod    schedule 30.09.2010


Ответы (2)


Я вернусь к ответу на этот вопрос, как только мой сервер разработки завершит обновление. Тем не менее, я бы попробовал альтернативный PHP-скрипт, который вы указали.

<?php
require_once('../Connections/workdata.php');
//select database
mysql_select_db($database_workdata, $workdata);

if(isset($_POST['queryString'])) {
  $queryString = $_POST['queryString'];
  $query = sprintf("SELECT acct, mailing_name FROM pub_addrs WHERE acct = '%s'",$queryString);
  $result = mysql_query($query, $workdata) or die(mysql_error());
  $row_result = mysql_fetch_assoc($result);
  echo $row_result['acct']." ".$row_result['mailing_name'];//this fails
  //echo 'this works';
}
?>

Если эхо-сообщение «это работает» действительно работает так, как ожидалось, проблема существует в этой части кода.

<?php

        // Include the auxiallary files as required
        require_once('../../valentxt3.class.php');

        $testVar = 701;

        // Establish db connection.
        $DBase = new dbConn();
        $tmpStr = "SELECT `acct`, `mailing_name` FROM `pub_addrs` WHERE `acct` = '".$testVar."';";
        $result = $DBase->runQuery($tmpStr);

        // Lets see how many texts there are to send.
        $howMany = mysql_num_rows($result);

        $row_result = mysql_fetch_assoc($result);
        echo $row_result['acct']." ".$row_result['mailing_name']; //this fails
        echo 'this works';

        exit;
?>

Приведенный выше код выдает следующий результат:

php test.php
X-Powered-By: PHP/5.2.13
Content-type: text/html

701 DO NOT MAIL- Deleted Account this works

Очевидно, что это запускается через PHP CLI, но должно работать через запрос POST или GET. Как только я подготовлю свой сервер для разработки, я проведу более подробное тестирование.

person Jim Grant    schedule 06.09.2010

Ответ на вопрос состоит в том, чтобы передать значение this, а не объект this в форме. Firebug сообщил, что я передал объект текстового поля, а не значение.

// сообщается о пожарной ошибке.

queryString [object HTMLInputElement] Source queryString=%5Bobject+HTMLInputElement%5D

// исправление заключается в использовании 'this.value'

<input type="text" size="25" value="" name="Facctnmb" id="Facctnmb" onChange="AcctNmb(this.value)" AUTOCOMPLETE=OFF />
person cmptrwhz    schedule 06.09.2010