【发布时间】: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 中这样做是没有意义的,因为它在客户端上执行,而恶意客户端显然会绕过它。
标签: javascript php mysql ajax