使用php和ajax制作3个选择标记

时间:2016-08-19 08:14:41

标签: php html ajax

这是我使用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

中完成

我想要出现的第三个选择当然取决于第二个选择,提前谢谢

2 个答案:

答案 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中传递相同的函数。