使用josery在用户输入输入后使用autosuggest填写输入文本字段

时间:2010-09-05 21:20:53

标签: php javascript jquery mysql autosuggest

我正在尝试使用jquery的autosuggest插件来获取用户输入,jquery输入到php mysql脚本以获取信息,然后将用户输入替换为从jquery请求中检索到的内容。现在这应该让你们所有人都待了一会儿。

首先关闭...如果我用纯文本替换autosuggest脚本中返回的文本我的jquery javascript函数完美地返回该值。但是,如果我尝试从脚本返回查询数据,那么当我得到返回数据的零(0)时。

我将提供必要的代码。我会在那段代码中包含我最熟悉的问题。我将举例说明哪些有效,哪些无效。

在写这篇文章之前,我确实测试了几种可能的情况。

  1. 我确保autosuggest脚本连接到db,查询有效,数据确实存在于表中,并且找到的结果集通过使用仅仅是二级表单正确回显向脚本发送一个post请求,它会准确地响应它应该的数据,所以我知道的查询脚本工作正常。但与此同时,我怀疑它是问题的一部分。

  2. 我测试了我的javascript函数AcctNmb是通过使用警报在更改时触发的,而且我可以看到函数通过我在输入文本字段上收到的响应一直传递,因为它更改,加载class被打开,值更改,load类被删除,函数完全应该完成。

  3. 现在看到问题失败并成功只需转到autosuggest查询php,您将看到我的两行提供有效响应,另一行提供0的响应。这是我无法理解的问题这两条线之间的差异使得世界在这方面有所不同。

  4. // EDIT 我试图将查询脚本更改为旧学校的查询方法,我仍然得到相同的结果。如果我回显查询的数据,如果我回显一串文本,我会得到一个'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');
        }
      });
    }
    

    // autosuggest查询脚本

    <?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 //备用autosuggest查询脚本

    <?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 **** ');
    

2 个答案:

答案 0 :(得分:0)

一旦我的开发服务器完成了自我更新,我将回答这个问题。但是,我会尝试替换您列出的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';
}
?>

如果echo'ing'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请求来运行。一旦我的开发服务器准备就绪,我将进行更详细的测试。

答案 1 :(得分:0)

问题的答案是传递'this'的值而不是表单中的'this'对象。 Firebug报告说我传递的是文本字段的对象而不是值。

// 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 />