这个php代码有效吗?
Posted
技术标签:
【中文标题】这个php代码有效吗?【英文标题】:Is this php code valid? 【发布时间】: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 注入攻击。我建议您查看***.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 混合在一起感觉很奇怪,但正如您在下面看到的那样,它可以工作。
【参考方案1】:
你问:
是否可以同时 POST JSON 对象和非 JSON 对象?
有效的请求查询是什么样的? (我正在使用 Google Chrome 应用程序“Postman - REST Client”来测试查询)那么如果想要传递 tableid = 1、clientid = 1 和 json = 1,2,3,4,参数会是什么样子?
是的,您可以在一个请求中同时发布 JSON 和非 JSON。不过,JSON 1,2,3
没有意义。如果是一个简单的数组,那就是[1,2,3]
:
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
[request setHTTPMethod:@"POST"];
NSString *messageBody = @"function=addOrder&tableid=1&clientid=2&json=[1,2,3]";
NSData *messageData = [messageBody dataUsingEncoding:NSUTF8StringEncoding];
[request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
[request setHTTPBody:messageData];
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
[NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error)
if (error)
NSLog(@"sendAsynchronousRequest error: %@", error);
if (data)
NSString *string = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"%@", string);
];
注意,在您的while
循环中,您指的是$oitem['id']
,但我不明白您指的是id
。鉴于$orderitems
是一个简单的数组,每个项目都由$oitem
单独引用(没有['id']
)。
顺便说一句,我通常使用foreach
语法:
foreach ($orderitems as $oitem)
// now I can refer to $oitem
如果您的 JSON 是 ["id":1,"id":2,"id":3]
,那么您将引用 $oitem['id']
,但如果它是 [1,2,3]
,您只需引用 $oitem
。
【讨论】:
非常感谢您的出色回答!这对我更好地理解整个主题很有帮助。我更改了我的 Objective-C 代码以及我的 PHP 代码(事实证明,SQL 插入部分也存在问题)。现在,代码对我来说更清晰了,我不再那么困惑了。 (不幸的是,我不能赞成您的答案,因为我的声誉还太低,但我将其标记为已接受的答案)。谢谢!以上是关于这个php代码有效吗?的主要内容,如果未能解决你的问题,请参考以下文章