获取此网站 --> http://www.secureshop.gr/POOL/acrosshotels/website/ 如果您检查左侧边栏,就会看到“查找酒店”边栏,当您从下拉菜单中选择位置时,酒店菜单会更改选项。这适用于 ajax。问题是它不适用于所有版本的 IE。当您选择目的地时,酒店下拉菜单为空/空白。 javascript代码是这样的。非常简单,只需单击目的地选项即可工作
<script type="text/javascript">
function selecthotel(str) {
if (window.XMLHttpRequest) {
xmlhttp=new XMLHttpRequest();
}else {
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange=function() {
if (xmlhttp.readyState==4 && xmlhttp.status==200) {
document.getElementById("hotelselection").innerHTML=xmlhttp.responseText;
}
}
if(str == 0) {
str = 0;
}
xmlhttp.open("GET","includes/ajaxlocationsearch.php?location="+str+"&language=<?php echo $language; ?>",true);
xmlhttp.send();
}
</script>
ajax文件是这个
$language = $_GET["language"];
$location = $_GET['location'];
if($location == "0") {
$result = mysql_query("Select * from eshop_articles where
category='/WEBSITE/SEARCHENGINE/HOTELS' order by
appearance",$link_id);
}else {
$result = mysql_query("Select * from eshop_articles where
category='/WEBSITE/SEARCHENGINE/HOTELS' and
short_description='$location' order by appearance",$link_id);
} ?>
<option value="0"><?php $a = $language."_choose_hotel"; echo ${$a};
?></option>
<?php while($row = mysql_fetch_assoc($result)) { ?>
<option value="<?php echo $row['appearance']; ?>"><?php echo
$row['title']; ?></option>
<?php } ?>
提前谢谢你:)
最佳答案
我做了一些测试,发现您的代码在结构上存在一些问题。您应该始终正确设置代码格式,以便更快地发现错误和问题。我格式化了您的代码,发现嵌套和查询存在一些问题。
我还想警告您,您遇到了一个非常严重的 SQL 注入(inject)问题,我在此代码中通过使用准备好的语句和一个小的额外 preg_replace
来修复该问题,以从查询中去除所有不需要的字符和一般表。您完全应该去了解更多有关防止 SQL 注入(inject)的知识。这里有一些专门针对该主题的精彩主题,我为您列出了这些文章的列表:
这是我格式化和修复的代码。我分别使用无参数、空参数、数据库中不存在的值和数据库中存在的值进行了测试。每个都相应地返回值:前三个返回null,而真正的查询返回true;在这种情况下,如果未找到,则返回“无可用酒店”,如果找到,则返回这些酒店的列表。如果数据库查询失败,会默认返回null,然后返回“Nohotelsfound”。
很抱歉稍微更改了代码布局,请随意将其编辑回来,这取决于您。不过,我强烈建议您进行正确的格式化(也可能是因为您的代码编辑器)。
index.php
<?php
$language = "en";
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Hotel Selection</title>
</head>
<body>
<select id="hotelselection">
<option value="null">No hotels available</option>
</select>
<script>
function selecthotel(str) {
if (window.XMLHttpRequest) {
xmlhttp = new XMLHttpRequest();
}else{
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange = function(){
if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
document.getElementById("hotelselection").innerHTML = xmlhttp.responseText;
}
}
if (typeof(str) == "undefined" || str == null) {
str = "";
}
xmlhttp.open("GET", "run.php?location=" + str + "&language=<?php echo($language); ?>", true);
xmlhttp.send();
}
selecthotel();
</script>
</body>
</html>
run.php
<?php
$phrases = array(
"en_error_db" => "No hotels available...",
"en_choose_hotel" => "Choose a hotel..."
);
$link_id = mysqli_connect("localhost", "", "", "");
if (mysqli_connect_errno($link_id)) {
die("Error occurred when attempting to connect to database (" . mysqli_connect_errno() . ": " . mysqli_connect_error() . ").");
error_log("Error occurred when attempting to connect to database (" . mysqli_connect_errno() . ": " . mysqli_connect_error() . ").");
exit(1);
}
$language_raw = isset($_GET["language"]) ? $_GET["language"] : "en";
$location_raw = isset($_GET['location']) ? $_GET["location"] : "";
$language = preg_replace("/[^\w.-]/", "", $language_raw);
$location = preg_replace("/[^\w.-]/", "", $location_raw);
if (empty($location)) {
$query = "SELECT * FROM `eshop_articles` WHERE `category` = '/WEBSITE/SEARCHENGINE/HOTELS' ORDER BY `appearance` ASC";
}else{
$query = "SELECT * FROM `eshop_articles` WHERE `category` = '/WEBSITE/SEARCHENGINE/HOTELS' AND `short_description` = ? ORDER BY `appearance` ASC";
}
if ($stmt = mysqli_prepare($link_id, $query)) {
if (!empty($location)) {
mysqli_stmt_bind_param($stmt, "s", $location);
}
mysqli_stmt_execute($stmt);
// Thanks to Bruce Martin on php.net for the SELECT * via _fetch (http://www.php.net/manual/en/mysqli-stmt.fetch.php#107034)
$metaResults = mysqli_stmt_result_metadata($stmt);
$fields = mysqli_fetch_fields($metaResults);
$statementParams = "";
foreach ($fields as $field) {
$statementParams .= (empty($statementParams) ? "\$column['" . $field->name . "']" : ", \$column['" . $field->name . "']");
}
$statment = "\$stmt->bind_result($statementParams);";
eval($statment);
print('<option value="0">' . $phrases[(isset($phrases[$language . "_choose_hotel"]) ? $language : "en") . "_choose_hotel"] . '</option>');
while (mysqli_stmt_fetch($stmt)) {
print('<option value="' . $column['appearance'] . '">' . $column['title'] . '</option>');
}
exit(1);
}else{
print('<option value="0">' . $phrases[(isset($phrases[$language . "_choose_hotel"]) ? $language : "en") . "_error_db"] . '</option>');
error_log("The script was unable to prepare a MySQLi statement (" . $query . ").");
exit(1);
}
?>
我切换到MySQLi数据库扩展名而不是您的 deprecated MySQL extension 。它不应再通过 PHP 错误日志返回 PHP 错误。我强烈建议切换到 MySQL PDO如果可能的话。我认为它非常简单、容易,而且效果更好!
另外,关于 XMLHttpRequest/ActiveXObject 用法的说明:如果您希望能够支持 IE 5,请为其创建一个类,并在客户端使用该浏览器时加载脚本,否则使用 jQuery Ajax ,它非常易于使用,您无需担心查询字符串等问题。之所以使用 ActiveXObject 脚本,是因为 IE 5 不支持 jQuery,尽管存在已知的安全问题,但 IE 5 是一种常见的浏览器。 IE 5 由旧计算机、一些银行、办公室和其他尚未研究安全细节的企业使用。
希望这对您有帮助。
关于javascript - Ajax 无法在 IE 上运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21982181/