【发布时间】:2013-08-23 01:38:29
【问题描述】:
我目前正在开发一个 iOS 应用程序,它与服务器上的数据库 (REST API) 进行通信。我已经设法向服务器发送简单的帖子查询并成功获得响应,但是几个小时后我就被以下 php 函数困住了(它不是我自己编写的!)。我的问题:
这是有效的 php 代码吗?
是否可以同时 POST JSON 对象和非 JSON 对象?
有效的请求查询是什么样的? (我正在使用 Google Chrome 应用程序“Postman - REST Client”来测试查询)那么如果想要传递 tableid = 1、clientid = 1 和 json = {1,2,3,4},参数会是什么样子?
非常感谢!
if($_POST['function'] == 'addOrder'){
$sql = "INSERT INTO orders SET
orderdate = NOW(),
tableid = '".$_POST['tableid']."',
clientid = '".$_POST['clientid']."'";
$result = mysql_query($sql);
$oid = mysql_insert_id();
$orderitems = json_decode($_POST['json'],true);
reset($orderitems);
while(list(,$oitem) = each($orderitems)){
$sql = "INSERT INTO orderitems SET
orderid = '".$oid."',
foodid = '".$oitem['id']."";
$result = mysql_query($sql);
}
}
【问题讨论】:
-
此代码容易受到 SQL 注入攻击。我建议您查看stackoverflow.com/questions/60174/…。例如,对变量使用
mysql_real_escape_string,或使用变量的参数化绑定。但是按照您现在的方式,您很容易受到 SQL 注入攻击(如果您的字符串中有单引号,则可能会出现简单的语法错误)。 -
好吧,我明白你的意思了——谢谢!除了安全问题:我可以在一个请求中发送 JSON 对象和字符串(addOrder、tableid、clientid)吗?据我所知,必须指定通过请求发送的对象类型(JSON 或文本,但不能同时使用两者)。我对吗?目前,在向服务器发送请求时收到以下错误消息:“传递给 each() 的变量不是域/XY 中的数组或对象.....”我使用“NSJSONSerialization”创建对象在由字典数组组成的 NSData 上(例如,一个字典是“id”:“1”)
-
顺便说一句,虽然您可以将简单的
$_POST参数与 JSON 字符串混合使用(如下所示),但我不确定这是否被认为是好的做法。令我震惊的是,您也可以选择将tableid和clientid放入 JSON 中(例如request={"tableid":1,"clientid":2,"orderitems":[1,2,3]})。或者甚至将整个事情变成 JSON(例如Content-Type的application/json)。我不确定这里有什么最佳做法。也许其他人对此有见解。将一堆标准的$_POST变量和 JSON 混合在一起感觉很奇怪,但正如您在下面看到的那样,它可以工作。