2017-07-06 77 views
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> 
+0

你的getService.php不應該返回一個全新的HTML頁面插入另一個,這不是真正有效的標記。在返回頁面 – ADyson

+0

的特定部分內實際需要的'

'部分的同時,您應該在開發工具中檢查瀏覽器的控制檯和網絡選項卡,以查看是否發生了任何HTTP錯誤並檢查是否您正確地將該參數傳遞給服務器,並且發生了什麼(如果有)響應。此外,您的SQL非常容易受到注入攻擊 - 您應該使用參數化查詢,您可以輕鬆地谷歌。 – ADyson

+0

最後是「id」的意思是一個整數?因爲在你的查詢中,你用引號將它作爲字符串發送到mySQL,所以它不會將它與表中的整數進行匹配。同樣,如果您使用了適當的參數化查詢,這種問題就會消失。 – ADyson

回答

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)您將int處理爲q(使用intval()),但將它傳遞給mySQL,就好像它是一個字符串(通過在SQL語句中放置單引號)。如果數據庫中的id字段是一個整數,則這會導致值不被視爲彼此相等,因此不會返回任何結果。如果是這種情況,那麼你應該刪除單引號。

5)但是,上述第4點是另一個問題的症狀,因爲您不應該通過簡單地將PHP字符串連接在一起來將變量添加到查詢中。這使您很容易受到SQL注入攻擊的攻擊,其中惡意用戶可能通過將SQL插入變量本身來竊取,破壞或刪除您的數據。相反,您應該使用參數化查詢來防止出現這種情況,並消除潛在的問題,如第4點所述。http://bobby-tables.com/是一個很好的資源,它解釋了注入攻擊的危險,幷包含解釋如何使用參數化查詢和其他技術的資源警惕它,包括使用PHP的例子。這是一個很好的習慣,可以保護您應用程序中的數據。