对表的 ajax 查询结果不一致


Inconsistent results of an ajax query to a table

N.B. - 对不起,最初标题错误 - 这是一个不同的问题,我试图在不发布的情况下解决。

我想问你两个关于从 php 文件调用返回数据的简单问题。感谢这个论坛,我对在 HMTL 中编写 PHP 代码以将数据保存到数据库表并从表中检索数据非常有信心。

但是现在,在单个页面上,我需要向表添加数据,从表中检索数据并更新该数据,所有这些都无需刷新HTML屏幕。所以我用一个MySQL表(6个字段(,一个用纯php编写的">后端"和一个用HTML和JavaScript编写的">前端"做了一个小的"测试"环境。

昨天一整天我都在拔掉我剩下的一点头发,但终于想出了将数据从 php 文件传递回 html/javascript 文件的概念(我会给你下面的所有代码(。整个事情都很棒!但它并不一致 - 因此使用以下步骤进行了实验:

  • 前端FTP上传
  • 后端的FTP上传
  • 在 IE 上刷新前端 2 倍
  • 在输入框中输入数字"150"。("150"是行号
    对于吉米亨德里克斯:-(
  • 单击表单上的"提交"按钮。(在这个实验中,我从来没有使用"回车"键(
  • 如果它有效,则会弹出一个警报,其中写着吉米亨德里克斯。
  • 如果它不起作用 - 什么都不会弹出。

所以这是两个实验的结果 Y=吉米·亨德里克斯 N=没有弹出框

  • 刷新
  • Y N Y
  • N Y
  • 刷新
  • 哎呀
  • ��

我真的看不到关于例程何时"工作"的模式。我已经看到这种行为是我关于保存到数据库的其他一些代码。

现在我的两个问题:

  • 你能解释一下这段代码如何工作的可变性吗?我以任何方式可能会解决它吗?
  • 我把吉米·亨德里克斯放在一个"警报"框中,但你会用什么命令把他放在一个div 中??.负荷?还是其他命令?

这是 PHP 文件:

<?php
$localid = $_POST['localid'];
$host = "hostname";
$user = "username";
$password = "password";
$dbname = "dbname";
$cxn = mysqli_connect($host,$user,$password,$dbname);
if (mysqli_connect_errno()) {echo "No connection" . mysqli_connect_error();}
$query = " select * from testtable where localid = $localid ";
$result = mysqli_query($cxn, $query) or die ("could not query database 1");
while ($row = mysqli_fetch_array($result))
{
 $firstname = $row['firstname'];
 $lastname = $row['lastname'];
 $zip = $row['physzip'];
 $gender = $row['gender'];
 $dob = $row['dob'];
}
$variablestopass = array
(
    'ln' => $lastname,
    'fn' => $firstname,
    'zip' => $zip,
    'gender' => $gender,
    'dob' => $dob 
);
echo json_encode($variablestopass);                     
?>

这是"前端"(不带标题(:

<body>
<form name="#inputform">
<table class="divtest">
<tr><td>Localid:</td><td> <input type="text" id="localid"></td></tr>
<tr><td colspan="2" align="center"><input type="submit" id="submitbutton" value="Submit" /></td></tr>
</table>
</form>
<div id="loadmehere" class="divtest"></div>
<script type="text/javascript">
$(document).ready(function(e) {
$("#submitbutton").click(function() {
var localid = document.getElementById("localid").value;
$.ajax({
        type: "POST",
        url: "testajaxbackend.php",
        data: {localid: localid},
        dataType : 'json',
        success: function(result) {
                                   alert(result['fn'] + result['ln'] + result['zip'] + result['gender'] + result['dob']);
                                   },
        error : function() { alert("error"); }
});//End of ajax call
});//End of click
});//End of ready
</script>
</body>
</html>

我提前感谢您可能提供的任何帮助。PS - 我也提出了这个,以防其他菜鸟可能会得到我的蛮力代码的帮助。

如果你想使用Ajax,你必须把表单提交放在一边。您不能同时使用两者。这会令人困惑。当您单击提交按钮时,将重新加载,并且 ajax 上下文将丢失。

将按钮更改为:

<input type="button" id="submitbutton" value="Submit" />

如果您愿意,可以删除form标记。

为了安全起见,请将您的 PHP 更改为以下内容:

<?php
$localid = $_POST['localid'];
if (!is_numeric($localid)) { echo "Error!"; exit; }// Prevention of SQL injection
$host = "hostname";
$user = "username";
$password = "password";
$dbname = "dbname";
$cxn = mysqli_connect($host,$user,$password,$dbname);
if (mysqli_connect_errno()) {echo "No connection" . mysqli_connect_error(); exit;}
$localid = mysqli_real_escape_string($localid, $cxn); // Double prevention of SQL injection
$query = "SELECT * FROM testtable WHERE localid = $localid LIMIT 0, 1";
$result = mysqli_query($cxn, $query) or die ("could not query database 1");
if (mysqli_num_rows($result) > 0)
{
    $row = mysqli_fetch_array($result);
    $variablestopass = array
    (
        'ln' => $row['lastname'],
        'fn' => $row['firstname'],
        'zip' => $row['physzip'],
        'gender' => $row['gender'],
        'dob' => $row['dob']
    );
    echo json_encode($variablestopass);
}
else 
{
    echo "Erro selection id"; 
}
?>

好吧,如您所见,我添加了一些SQL注入预防和结果检查mysqli_num_rows。如果我理解正确,这段代码可能只返回一个结果。所以我删除了while块,并在您的查询中添加了LIMIT子句。因此,前端将确定只会收到一个结果。如果我错了,您可以删除 LIMIT 子句并设置while,但必须这样,因为您的方式将无法返回多条记录:

$variablestopass = array();
while ($row = mysqli_fetch_array($result))
{
    $variablestopass[] = array
    (
        'ln' => $row['lastname'],
        'fn' => $row['firstname'],
        'zip' => $row['physzip'],
        'gender' => $row['gender'],
        'dob' => $row['dob']
    );
}

最后,我将您对 ajax 对象success稍微更改为:

sucess: function(result)
{
    var result = jQuery.parseJSON(result);
    alert(result.fn + " - " + result.ln + " - " + result.zip); // and so on...
}

注意:此success函数仅检查一个结果。

如有疑问,请告诉我们。祝你好运!