这是我使用AJAX的第一天,比我想象的更容易,我制作一个选择标签,打开另一个选择标签,它工作正常 那就是代码......
test.php的
<?php
require'models/category.php';
$object=new category;
$rows=$object->display_category();
?>
<!DOCTYPE html>
<html>
<head>
<script>
function showUser(str) {
if (str=="") {
document.getElementById("txtHint").innerHTML="choose a category";
return;
}
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 (xmlhttp.readyState==4 && xmlhttp.status==200) {
document.getElementById("txtHint").innerHTML=xmlhttp.responseText;
}
}
xmlhttp.open("GET","getTest.php?q="+str,true);
xmlhttp.send();
}
</script>
</head>
<body>
<form>
<select name="users" onchange="showUser(this.value)">
<option value="">Select a category:</option>
<?php
foreach($rows as $row){
$row['cat_name']=str_replace('-',' ',$row['cat_name']);
echo'<option value="'.$row['cat_id'].'">'.$row['cat_name'].'</option>';
}
?>
</select>
</form>
<br>
<div id="txtHint"><b>category info will be listed here.</b></div>
</body>
</html>
这是getTest.php
<?php
require'models/connection.php';
$q = $_GET['q'];
$query="select * from category where parent_id='".$q."' ";
$stmt=$db->prepare($query);
$stmt->execute();
$result=$stmt->fetchAll(PDO::FETCH_ASSOC);
?>
<form action='' method='get'>
<select name='select1'>
<?
foreach ($result as $one){
echo'<option value="'.$one["cat_id"].'">'.$one['cat_name'].'</option>';
}
?>
</select>
</form>
test.php中有一个select标签 当我选择某个选项时 另一个select标签打开,存在于getTest.php
中现在我想要第三个选择标签, 当我从第二个选择标签中选择时,会出现另一个标签。 我不知道该动作必须在test.php或getTest.php
中完成我想要出现的第三个选择当然取决于第二个选择,提前谢谢
答案 0 :(得分:1)
我建议你改变这样的代码,这样你可以毫无问题地使用数百万的选择。 我评论了我对代码的更改,以提高可见性。 的 test.php的强>
<?php
require'models/category.php';
$object=new category;
$rows=$object->display_category();
?>
<!DOCTYPE html>
<html>
<head>
<script>
function showUser(str,targetId) {//// add targetId here
if (str=="") {
document.getElementById("txtHint").innerHTML="choose a category";
return;
}
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 (xmlhttp.readyState==4 && xmlhttp.status==200) {
document.getElementById(targetId).innerHTML=xmlhttp.responseText;// this is my added data
document.getElementById(targetId).style.display = 'block';//update #2
}
}
xmlhttp.open("GET","getTest.php?q="+str,true);
xmlhttp.send();
}
</script>
</head>
<body>
<form>
<select name="users" onchange="showUser(this.value,select1)"><!-- add ,1 here -->
<option value="">Select a category:</option>
<?php
foreach($rows as $row){
$row['cat_name']=str_replace('-',' ',$row['cat_name']);
echo'<option value="'.$row['cat_id'].'">'.$row['cat_name'].'</option>';
}
?>
</select>
<!-- This section is added completely -->
<br>
<select id='select1' name='select1' onchange="showUser(this.value,select2)" style="display:none">
</select>
</form>
<br>
<br>
<select id='select2' name='select2' style="display:none">
</select>
</form>
<br>
<!-- End of added section -->
<div id="txtHint"><b>query status will be listed here.</b></div> <!-- category info will not listed here -->
</body>
</html>
<强> getTest.php 强>
<?php
require'models/connection.php';
$q = $_GET['q'];
$level = $_GET['level'];
$query="select * from category where parent_id='".$q."' "; ////DANGER! There is a sql injection vulnerability! Don't do this in your main site never ever
$stmt=$db->prepare($query);
$stmt->execute();
$result=$stmt->fetchAll(PDO::FETCH_ASSOC);
foreach ($result as $one){
echo'<option value="'.$one["cat_id"].'">'.$one['cat_name'].'</option>';
}
?>
但是你的sql查询中存在一个漏洞,使你的网站面临sql注入攻击的危险,将getTest.php中的查询代码更改为这个是一个很好的工作。但是你当然必须用一把笔友检查你的整个代码。
易受攻击的代码
$query="select * from category where parent_id='".$q."' ";
$stmt=$db->prepare($query);
$stmt->execute();
必须改为这个:
$query="select * from category where parent_id=:id ";
$stmt->execute(['id'=>$q]);
有关此问题的详细信息,请阅读以下文章:How can I prevent SQL-injection in PHP?
答案 1 :(得分:0)
这与第一个完全相同。
首先在test.php中编写另一个函数,就像你做的那样&#34; showUser&#34;并根据要求采取行动。
然后在getTest.php中返回带有以下内容的html。
<select name='select1' onchange="showUser(this.value)">
因此,请确保在新编码的select中的getTest.php中传递相同的函数。