我想从数据库中提取一些数据而不刷新页面。最好的方法是什么?
我使用以下XMLHTTPRequest函数从cart.php
文件中获取一些数据(购物车项目)。此文件基于option
值执行各种功能。
例如:option=1
表示获取所有购物车商品。 option=2
表示删除所有购物车商品并返回字符串"Your shopping cart is empty."
。选项= 3,4 ......依此类推。
我的XHR功能:
function getAllCartItems()
{
if(window.XMLHttpRequest)
{
allCartItems = new XMLHttpRequest();
}
else
{
allCartItems=new ActiveXObject("Microsoft.XMLHTTP");
}
allCartItems.onreadystatechange=function()
{
if (allCartItems.readyState==4 && allCartItems.status==200)
{
document.getElementById("cartmain").innerHTML=allCartItems.responseText;
}
else if(allCartItems.readyState < 4)
{
//do nothing
}
}
var linktoexecute = "cart.php?option=1";
allCartItems.open("GET",linktoexecute,true);
allCartItems.send();
}
cart.php 文件如下:
$link = mysql_connect('localhost', 'user', '123456');
if (!$link)
{
die('Could not connect: ' . mysql_error());
}
mysql_select_db('projectdatabase');
if($option == 1) //get all cart items
{
$sql = "select itemid from cart where cartid=".$_COOKIE['cart'].";";
$result = mysql_query($sql);
$num = mysql_num_rows($result);
while($row = mysql_fetch_array($result))
{
echo $row['itemid'];
}
}
else if($option == 2)
{
//do something
}
else if($option == 3)
{
//do something
}
else if($option == 4)
{
//do something
}
我的问题:
答案 0 :(得分:2)
我不认为拒绝服务攻击是您的主要关注点。这种担忧与cart.php
返回HTML一样有效。不,通过AJAX公开公共API是非常常见的做法。
但要记住的一件事是,通过相同的URL列出和删除项目的模糊性。最好(至少)将这些操作(或“方法”)分成不同的URL(例如:/cart/list
和/cart/clear
)。
如果您愿意更进一步,则应考虑实施“RESTful”API。除其他外,这意味着只能使用正确的HTTP谓词调用方法。您可能只听说过GET
和POST
,但还有PUT
和DELETE
等。这背后的原因是使方法幂等,这意味着无论你多少次调用它们,它们会一次又一次地做同样的事情。例如,对GET
的{{1}}来电将始终列出内容,/cart
对DELETE
的来电将始终删除购物车中的所有商品。
尽管为您的购物车编写完整的REST API可能不切实际,但我确信其中一些原则可能有助于您构建更强大的系统。
一些阅读材料:A Brief Introduction to REST。
答案 1 :(得分:1)
Ajax
是此目的的最佳选择。
使用Ajax
,最好使用XML
发送和接收数据。因此,我建议使用Web services
。您可以使用SOAP / REST
Web服务根据请求从数据库中提取数据。
您可以使用此Link了解有关Web服务的更多信息。
对于教程,可以在Internet上找到足够的文章。
答案 2 :(得分:1)
您正在使用XMLHttpRequest
对象,因此您不刷新页面(它是AJAX),或者您还没有告诉
如果黑客想要DDOS您的网站或您的数据库,他可以使用它的任何页面...只要您不在客户端和服务器之间传输将在您的SQL请求中使用的字符串,那应该没问题
我警告你使用原始文本响应显示。我鼓励您将响应格式化为XML或JSON,以正确定位需要插入DOM的对象,并返回标记以正确处理错误(die(“我是你父亲的luke”)将无济于事您的任何用户)并将其显示在您网页的特殊区域
答案 3 :(得分:1)
首先,您应该考虑分离应用程序的不同部分。拥有执行与推车相关的所有其他任务的通用文件,违反了各种软件设计原则。
其次,第一个漏洞是SQL注入。您应该从不只是将输入连接到SQL。
假设我发布了1; TRUNCATE TABLE cart;
。然后你的SQL看起来像:
select itemid from cart where cartid=1; TRUNCATE TABLE cart;
首先选择相关项目,然后废弃您的数据库。
你应该写这样的东西:
$item = $_COOKIE['cart'];
$item = preg_replace_all("['\"]", "\\$1", $item);
要避免刷新,您可以在页面上添加链接。像<a href="javascript:void(0);" onclick="getAllCartItems();">Refresh</a>
就安全性而言,无论您的业务逻辑如何,引入仅涉及您的数据的数据库层总是要付出代价,然后添加依赖于数据库层的服务层,这将提供执行业务层操作的工具。
您还应该注意@PPvG建议,并且 - 使用Apache的mod_rewrite或其他类似工具 - 使您的网址更有意义。
另一个注意事项:尝试以JSON或XML格式封装数据。我建议在服务器端使用json_encode();
,在客户端使用JSON.parse();
。这将确保安全交付。