在动态 php mysql 查找中丢失输入字符

Posted

技术标签:

【中文标题】在动态 php mysql 查找中丢失输入字符【英文标题】:loosing input chars in dynamic php mysql lookup 【发布时间】:2014-12-07 09:15:26 【问题描述】:

我正在尝试做一个零件查找系统(大部分都有效),但我在 php var 中丢失了一些字符(仅有时)。 如果我在文本框中输入 1234,文本框将始终显示我输入的完整数字。

但是,结果部分会在一瞬间显示以 1234 开头的数字,然后会丢失 4,然后会丢失 3,然后会丢失 2,然后会显示 partno 以 1 开头,然后会留下。大多数情况下,它的速度非常快,看起来就像是一次丢掉了所有数字,但我看得很近,它一次丢一个字符。

输出到屏幕——用于测试 js var partno 显示 1234 js var idxno 显示 1234 php var idxno 显示 1

(这个数字 1234 只是一个例子,我使用 3 到 20 个字符的随机部分,当它丢弃字符时,它总是留下输入的第一个字符。)

如果我使用退格键删除 4,那么 23 将返回,我可以再次输入 4,php var idxno 将显示 1234。 如果我重新启动服务器,它总是会在我第一次输入部件号时发生,有时是第二次和第三次,然后它可能会正常工作 10 到 20 次以上的查找,然后会再次执行,它永远不会真正一致。 如果我在空数据库上运行此查询,它工作正常,永远不会丢弃数字。 如果我删除 'ORDER BY' 子句,它几乎总是会删除除第一个字符之外的所有字符。 我现在在这个程序的初稿上运行了这个基本代码,所有制造商都在单独的数据库中,它工作得很好。我正在尝试将所有制造商合并到一个数据库文件中,这在问题开始时进行。 对于单独的制造商,最大的价格表可能约为 150,000 行。 加上所有制造商,现在大约有 750,000 行,完成后将超过 1,000,000 行。

我正在跑步: Debian Wheezy 7.2 Apache 版本 2.2.22 mysql 版本 5.5.38 PHP 版本 5.4.4-14+deb7u14

我正在使用 Virtualbox 服务器来编写和测试代码,但我把它放在局域网上的真实服务器上,它的作用完全一样。

我希望我为这个问题提供了足够的信息,这是我第一次尝试真正的程序,我无法找到解决正在发生的事情的方法,我已经这样做了几个月,而且是第一次,最后决定寻求帮助。

感谢我能得到的任何帮助。

index.php

<!doctype html>
<html>
<head>
    <meta charset="utf-8">
    <link rel="stylesheet" type="text/css" href="styles.css">
<script type="text/javascript" src="js_php/jquery-1.11.1.js"></script>
<script type="text/javascript">
var npage = 0;
function part_lookup(cnt)
    var action = "lookup";
    var partno = document.getElementById("partno").value;
    var idxno = partno.replace(/[^a-zA-Z0-9%]/g,'');
        if (cnt == 'next') npage = npage + 15;
        else if (cnt == 'prev') npage = npage - 15;
        else npage = 0;
            if (npage < 0) npage = 0;
        $.post("js_php/partlookup.php", action:action, idxno:idxno, npage:npage,
         function(data)$("#part_data").html(data););
    
</script>
</head>
<?php
    $whereami='home';
//   include("page_setup.php");
?>
<!--body-->      <!--code will not validate w3c with this body tag, says tag already open ??-->
<div id="lookup">
    <div>
        <input id="Prev" type="button" value="Previous Page" onclick="part_lookup('prev')">
        &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
        <input id="partno" type="text" name="partno" maxlength="20" autocomplete="off" autofocus onclick="this.value = ''" onkeyup="part_lookup()">
        &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
        <input id="Next" type="button" value="   Next Page   " onclick="part_lookup('next')"> 
    </div>
</div>
<div id="part_data"></div>
</body>
</html>

partlookup.php

<?php
ini_set('display_errors', 'On');
error_reporting(E_ALL | E_STRICT);

include("db_connect.vars.php");
// Make a MySQLi Connection
$db_connect = mysqli_connect($db_host, $db_user, $db_pass, $db_name);
if (!$db_connect) die('Connect Error ('.mysqli_connect_errno().') '.mysqli_connect_error());
/*********************************************************************/
$idxno = $_POST['idxno'];
$page = $_POST['npage'];
echo "idxno = ".'<b>'.$idxno.'</b><br/>';
$result = mysqli_query($db_connect,
   "SELECT PriceList.*, Inventory.instk AS instk, Inventory.ovrstk AS ovrstk, Inventory.used AS used
   FROM PriceList
   LEFT JOIN Inventory ON PriceList.mfg = Inventory.mfg 
   AND PriceList.idxno = Inventory.idxno
   WHERE PriceList.idxno LIKE '$idxno%'
   ORDER BY PriceList.idxno
   LIMIT $page,15");
mysqli_close($db_connect);
?>  

好的,我按照 Jeff 的建议做了,

mysql> SET GLOBAL general_log = 'ON';
Query OK, 0 rows affected (0.00 sec)

然后查看'/var/lib/mysql/debian-7.log'文件,这是结果

141012 18:07:30   148 Connect   root@localhost on lawn2
          148 Query
          149 Connect   root@localhost on lawn2
          149 Query 
          149 Quit  
          150 Connect   root@localhost on lawn2
          150 Query 
          150 Quit  
          151 Connect   root@localhost on lawn2
          151 Query 
          151 Quit  
141012 18:07:31   148 Quit  

151 退出后有 148 退出, 所以我在 partlookup.php 文件的末尾添加了一个mysqli_close($db_connect);

但没有任何区别,仍然有同样的问题。

【问题讨论】:

我会将 sql 语句写入日志文件,以检查前面的情况是否正常。 只是猜测:更改此调用 function(data)$("#part_data").html(data); 以返回常量而不是查找。我怀疑它没有被正确使用。 这段代码function(data)$("#part_data").html(data);目前不返回任何数据,除了来自php文件的idxno值。目前我只是将 var idxno 传递给 partlookup.php 并运行 mysql 查询,没有返回数据进行测试,除了 idxno 的当前值。 我认为 Jeff 的意思是您应该记录正在执行的实际 SQL 查询,这样您就可以准确地看到正在查询的内容。此外,您确实需要修复您的查询变量,它们只是在等待被 SQL 注入黑客攻击。而不是LIKE '$idxno%' 你应该写:LIKE '".mysqli_real_escape_string($db_connect, $idxno)."%' @JimmyA 你需要在服务器端处理 SQL 注入,在 JS 中这样做是没有意义的,因为它在客户端上执行,而恶意客户端显然会绕过它。 【参考方案1】:

好的,我发现使用 Firebug 并启用 Net 选项卡时发生了什么。 我可以输入部件号 1234,PHP 文件以单独的连接将请求发送到服务器。 ??

1 需要 3.02 秒完成 12 需要 1.03 秒才能完成 123 需要 855 毫秒才能完成 1234 需要 12ms 完成

所以现在显示 1234 信息,然后 123信息出现,然后 显示 12 条信息,然后 1 信息显示。

由于输入部件号只需不到一秒钟的时间, 在返回的信息中显示以 1 开头的部件号。

现在,我想弄清楚如何优化查询或取消以前的查询。查询或只是将库存信息添加到价目表文件中,但这会产生一些额外的问题需要处理。

感谢所有回答此问题的人。

【讨论】:

以上是关于在动态 php mysql 查找中丢失输入字符的主要内容,如果未能解决你的问题,请参考以下文章

PHP、HTML JS MySQL 动态下拉菜单

MYSQL:查找字符串中字符的最后一次出现

键入 Android 时动态搜索

#转#VS2012 正则表达式 动态插入 动态替换 (查找和替换工具)

Jquery -> php -> mysql 和动态表单字段

PHP / PDO动态绑定值(无效的参数计数错误)