我是非常新的PHP和JavaScript,但仍然试图让我的网页工作。 我试图在页面上添加一个5星投票系统,它将联系我的数据库并相应地更新。 你可能已经注意到我的代码语法也不完美。
<div class="first" onmouseover="starmove('-32px')" onmouseout="starnormal()" onclick="rate('harrys','1')">
这是“联系”javascript的div
function rate(id,ratings){
var i=id;
var r=ratings;
var xmlhttp;
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()
{
xmlhttp.open("POST","http://------/rating.php?id="+i+"&rating="+r,true);
xmlhttp.send();
}
这是javascript
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Namnlös 1</title>
</head>
<body>
<?php
mysql_connect("host", "username", "password") or die(mysql_error());
mysql_select_db("database") or die(mysql_error());
mysql_set_charset('utf8');
$itemid = ($_GET["id"]);
$rating = ($_GET["rating"]);
$query = "INSERT INTO ratings(id,rating) VALUES ('$itemid','$rating')";
mysql_query($query);
?>
</body>
</html>
这是我的rating.php文件(注意:mysql_connect中的值在实际页面上是正确的,即使这里没有定义。)
如果我只是打开我的php文件,会在mysql中添加一行,所以我知道它已正确连接。
答案 0 :(得分:5)
您将值传递给rating.php作为GET,但您将其作为POST
获取xmlhttp.open("POST","http://------/rating.php?id="+i+"&rating="+r,true);
此处,即使您将方法设为POST,?id="+i+"&rating="+r
也表示ID和评级正在作为GET传递。
所以你不能以
的形式访问它们$itemid = ($_POST["id"]);
$rating = ($_POST["rating"]);
您需要将其更改为:
$itemid = ($_GET["id"]);
$rating = ($_GET["rating"]);
同时将您的查询更改为:
$query = "INSERT INTO ratings(id,rating) VALUES ('".$itemid."','".$rating."')";
编辑:
我在这里更新了Javascript代码。试试这个:
<script>
function rate(id,ratings)
{
var i=id;
var r=ratings;
var xmlhttp;
if (window.XMLHttpRequest)
{
// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
}
else
{ // code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.open("POST","http://------/rating.php?id="+i+"&rating="+r,true);
xmlhttp.send();
}
</script>
的变化: 1.之后有两个括号:
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
}
第二个大括号有效地关闭了rate()
函数,因此之后的代码没有按预期执行。所以我将该大括号移到代码的末尾,以包装函数。
onreadystatechange
函数,以便跟踪请求发生了什么。在您的代码中,您在onreadystatechange中发送了请求,该请求永远不会执行,因为请求永远不会被发送.. 我改变了
xmlhttp.onreadystatechange=function()
{
xmlhttp.open("POST","http://------/rating.php?id="+i+"&rating="+r,true);
xmlhttp.send();
}
进入一个简单的POST调用:
xmlhttp.open("POST","http://------/rating.php?id="+i+"&rating="+r,true);
xmlhttp.send();
我希望这能解释一切:)
答案 1 :(得分:1)
您应该尝试使用jQuery for XHTTP Calls。这样,您确信所有浏览器都支持您的代码。
将此添加到您的头部:
<script type="text/javascript" src="http://code.jquery.com/jquery-latest.min.js"></script>
然后使用此代码调用PHP页面:
var i = id;
var r = ratings;
$.get("http://------/rating.php?id="+i+"&rating="+r);
我也注意到你确实放了&#34; sds&#34;在&#34; id&#34;您的查询中的字段。 &#34; id&#34;字段应该是整数。如果它已经是整数,那就是你的问题。同时将$ _POST更改为$ _GET。修正版:
$itemid = ($_GET["id"]);
$rating = ($_GET["rating"]);
$query = "INSERT INTO ratings(id,rating) VALUES ($itemid,'$rating')";
答案 2 :(得分:0)
请使用jQuery来处理ajax请求。 jQuery跨浏览器工作,你可以确定它有效。
另外:
$itemid = ($_POST["id"]);
$rating = ($_POST["rating"]);
$query = "INSERT INTO ratings(id,rating) VALUES ('sds','$rating')";
是不安全的
$itemid = intval($_POST["id"]);
$rating = intval($_POST["rating"]);
$query = "INSERT INTO ratings(id,rating) VALUES ('sds','$rating')";
好多了
答案 3 :(得分:0)
首先,如果您尝试请求的php文件位于同一站点,请使用relative而不是绝对链接:
// Absolute link
xmlhttp.open("POST","http://------/rating.php?id="+i+"&rating="+r,true);
// Relative link
xmlhttp.open("POST","rating.php?id="+i+"&rating="+r,true);
然后,您尝试通过POST
发送和检索信息,但是您要在查询字符串(GET
)中发送信息:
JS:
xmlhttp.open("GET","rating.php?id="+i+"&rating="+r,true);
PHP:
$itemid = $_GET["id"];
$rating = $_GET["rating"];
最后,在插入之前,根据您使用的MySQL库,使用mysql_real_escape_string()或mysqli_real_escape_string(),以防止数据库中的SQL注入并危及您的站点:
$itemid = mysql_real_escape_string($_GET["id"]);
$rating = mysql_real_escape_string($_GET["rating"]);
$query = 'INSERT INTO ratings(id,rating) VALUES ('.$itemid.','.$rating.')';
mysql_query($query);