1
///這是形式的一部分。我試圖從數據庫中獲取數據並在「txt」部分顯示它。腳本部分在同一個文件中,getService.php與這個文件在同一個目錄中。當我選擇一些東西的時候什麼都沒有顯示。php ajax錯誤...不顯示數據
<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>
你的getService.php不應該返回一個全新的HTML頁面插入另一個,這不是真正有效的標記。在返回頁面 – ADyson
的特定部分內實際需要的'
最後是「id」的意思是一個整數?因爲在你的查詢中,你用引號將它作爲字符串發送到mySQL,所以它不會將它與表中的整數進行匹配。同樣,如果您使用了適當的參數化查詢,這種問題就會消失。 – ADyson
回答
有許多與你的代碼的問題。爲了與您的問題直接相關:
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)您將int處理爲
q
(使用intval()
),但將它傳遞給mySQL,就好像它是一個字符串(通過在SQL語句中放置單引號)。如果數據庫中的id
字段是一個整數,則這會導致值不被視爲彼此相等,因此不會返回任何結果。如果是這種情況,那麼你應該刪除單引號。5)但是,上述第4點是另一個問題的症狀,因爲您不應該通過簡單地將PHP字符串連接在一起來將變量添加到查詢中。這使您很容易受到SQL注入攻擊的攻擊,其中惡意用戶可能通過將SQL插入變量本身來竊取,破壞或刪除您的數據。相反,您應該使用參數化查詢來防止出現這種情況,並消除潛在的問題,如第4點所述。http://bobby-tables.com/是一個很好的資源,它解釋了注入攻擊的危險,幷包含解釋如何使用參數化查詢和其他技術的資源警惕它,包括使用PHP的例子。這是一個很好的習慣,可以保護您應用程序中的數據。
來源
2017-07-06 10:59:24 ADyson
相關問題