///这是表单部分。我正在尝试从数据库中获取数据并将其显示在" txt" part.the脚本部分在同一个文件中,getService.php和这个文件位于同一个目录中。当我选择的东西时什么都没显示。
<form>
<select name="parent">
<option selected="users" onchange="showService(this.value)">Select a Service:</option>
<?php
$res=$mysqli->query("SELECT * FROM service");
while($row=$res->fetch_array())
{
?>
<option value="<?php echo $row['id']; ?>"><?php echo $row['name']; ?></option>
<?php
}
?>
</select>
</br>
</form>
<div id="txt"><b>Service info will be show here...</b></div>
</center>
</div>
//脚本部分。在同一个文件中。
<script>
function showService(str) {
if (str == "") {
document.getElementById("txtHint").innerHTML = "";
return;
} else {
if (window.XMLHttpRequest) {
// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp = new XMLHttpRequest();
} else {
// code for IE6, IE5
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
document.getElementById("txt").innerHTML = this.responseText;
}
};
xmlhttp.open("GET","getService.php?q="+str,true);
xmlhttp.send();
}
}
</script>
// getService.php
<?php
session_start();
include_once'db_connect.php';
?>
<!DOCTYPE html>
<html>
<head>
<style>
table {
width: 100%;
border-collapse: collapse;
}
table, td, th {
border: 1px solid black;
padding: 5px;
}
th {text-align: left;}
</style>
</head>
<body>
<?php
$q = intval($_GET['q']);
$sql="SELECT * FROM service WHERE id = '".$q."'";
$result = mysqli_query($mysqli,$sql);
echo "<table>
<tr>
<th>id</th>
<th>Service name</th>
<th>Detail</th>
</tr>";
while($row = mysqli_fetch_array($result)) {
echo "<tr>";
echo "<td>" . $row['id'] . "</td>";
echo "<td>" . $row['name'] . "</td>";
echo "<td>" . $row['detail'] . "</td>";
echo "</tr>";
}
echo "</table>";
mysqli_close($mysqli);
?>
</body>
</html>
答案 0 :(得分:1)
您的代码存在许多问题。为了与您的问题直接相关:
1)onchange="showService(this.value)"
应该是<select>
的属性,而不是第一个<option>
。因此它根本不会触发更改事件,这意味着您的ajax调用永远不会运行。
2)document.getElementById("txtHint")
错误(在两个地方) - 您的HTML中没有任何带有此ID的元素。 document.getElementById("txt")
应该有用。
3)你的getService.php不应该返回一个全新的HTML页面(包含DocType,html,body标签等)以插入另一个页面的div内,这不是真正有效的标记。而是仅返回实际需要进入主页特定部分的<table>
部分。如果您需要getService.php中的CSS,请将其移至主页或主页中包含的单独CSS文件。
4)您将q
作为int(使用intval()
)进行处理,然后将其传递给mySQL,就像它是一个字符串一样(在SQL语句中将单引号括起来)。如果数据库中的id
字段是整数,这将导致值不被视为彼此相等,因此不会返回任何结果。如果是这种情况,那么您应该删除单引号。
5)但是,上面的第4点是另一个问题的症状,因为您不应该只是通过将PHP字符串连接在一起而将变量添加到查询中。这使您容易受到SQL注入攻击,恶意用户可以通过将SQL插入变量本身来窃取,损坏或删除数据。相反,您应该使用参数化查询来防范这种情况,并且还可以消除问题的可能性,如第4点所述。http://bobby-tables.com/是一个很好的资源,可以解释注入攻击的危险,并包含解释如何使用参数化查询的资源和其他防范它的技术,包括使用PHP的例子。这是一个很好的习惯,可以立即进入,并保护您的应用程序中的数据。