在动态 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')">
<input id="partno" type="text" name="partno" maxlength="20" autocomplete="off" autofocus onclick="this.value = ''" onkeyup="part_lookup()">
<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 查找中丢失输入字符的主要内容,如果未能解决你的问题,请参考以下文章
#转#VS2012 正则表达式 动态插入 动态替换 (查找和替换工具)