php ajax错误...没有显示数据

时间:2017-07-06 10:20:23

标签: php ajax

///这是表单部分。我正在尝试从数据库中获取数据并将其显示在" 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>

1 个答案:

答案 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的例子。这是一个很好的习惯,可以立即进入,并保护您的应用程序中的数据。