N.B。 - 对不起最初错误的标题 - 这是一个不同的问题,我试图在不发布的情况下解决。
我想问你关于从php文件调用中返回数据的两个简单问题。 感谢这个论坛,我非常有信心在HMTL中编写PHP代码以将数据保存到db表,并从表中检索数据。
但是现在,在一个页面上,我需要 添加 数据到表格, 检索 数据从表格和 更新 这些数据,所有这些都无需刷新HTML屏幕。所以我用 MySQL表 (6个字段),“ 后端 ”做了一个“测试”环境用纯PHP编写,用HTML和JavaScript编写的“ frontend ”。
昨天整天我都在拿出我留下的小头发,但终于想出了将数据从php文件传回html / javascript文件的概念(我将在下面给你所有的代码)。 整件事情很棒! 但它不一致 - 所以使用以下步骤进行了实验:
所以这里是两个实验的结果Y = Jimi Hendrix N =没有弹出框
我真的无法在这里看到关于例程何时“工作”的模式。 我已经看到这种行为是关于保存到数据库的其他代码。
现在我的两个问题:
这是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 - 我也提出这个问题,万一我的暴力代码可以帮助其他新手。
答案 0 :(得分:1)
如果要使用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
函数只会产生一个结果。
有任何疑问,请告诉我们。祝你好运!