这个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 字符串混合使用(如下所示),但我不确定这是否被认为是好的做法。令我震惊的是,您也可以选择将 tableidclientid 放入 JSON 中(例如 request="tableid":1,"clientid":2,"orderitems":[1,2,3])。或者甚至将整个事情变成 JSON(例如 Content-Typeapplication/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代码有效吗?的主要内容,如果未能解决你的问题,请参考以下文章

有人可以解释这个 PHP 代码吗? [关闭]

<?= 是一个有效的 php 语句吗?

PHP有peek数组操作吗?

你能用 PDO 查询帮助我理解这个 PHP 代码吗? [关闭]

php单例数据库连接,这个代码是不好的做法吗?

CURL 代理问题:我的代码有效吗?