【问题标题】:PHP returns only half of my results from mysql_queryPHP 只从 mysql_query 返回我一半的结果
【发布时间】:2014-04-25 04:18:55
【问题描述】:

我必须打一个相当大的电话才能加入 4 个表并获得 50 行。当我在我的 PHP 服务器上进行拉取时,它会在 0.0013 秒内完成拉取,这很好。所以我尝试从我的 iOS 设备调用 PHP 来获取记录,有时我得到它们,有时我得到一半。

这是我的 PHP SQL 代码。

$sql = "SELECT NF.id, NF.type, NF.groupid, NF.classid, NF.videoid, NF.lessonid, NF.text, NF.path, NF.datetime, Groups.name as groupname, Groups.imagepath as groupimage, Classes.title as classname, Classes.imagepath as classimage, Videos.title as videoname, Videos.videopath as videopath, Lessons.title as lessonname, Lessons.imagepath as lessonimage   
     FROM NewsFeed as NF
     LEFT OUTER JOIN Groups on (NF.groupid=Groups.id)
     LEFT OUTER JOIN Classes on (NF.classid=Classes.id)
     LEFT OUTER JOIN Videos on (NF.videoid=Videos.id) 
     LEFT OUTER JOIN Lessons on (NF.lessonid=Lessons.id)
     WHERE $searchstring 
     ORDER BY NF.datetime DESC LIMIT 50";

$request = mysql_query($sql) or die(mysql_error());

$arr = array();

if(mysql_num_rows($request)){
    while($obj = mysql_fetch_object($request)) {
        $arr[] = $obj;
    }
}

// Return Array
echo '{"newsfeed":'.json_encode($arr).'}';

mysql_close($link);

现在,当我回显 json_encoded 数组时,有时我会从“newsfeed”开始获得整个数组:而其他时候我会得到这样的结果:

2014-04-24 23:07:09.574 ProgramName[6573:60b] 我们的编程理论...","path":"http://site.com/LMS/NewsFeedPictures/IMG2014170220465189.PNG ","datetime":"2014-02-17 20:46:56","groupname":"LMS for iOS","groupimage":"http://site.com/LMS/GroupThumbnails/LMS.jpg" ,"classname":null,"classimage":null,"videoname": ... (还有越来越多的记录,直到最后。)

如您所见,内容字符串开始的位置是我的数据的中间!

所以问题是为什么 PHP 只返回部分数据?

【问题讨论】:

    标签: php mysql ios json


    【解决方案1】:

    我以前见过这个。

    我当时的罪魁祸首是从mysql返回的数据中的字符串中的双引号(“)。它在到达js调用时使json字符串无效。

    尝试通过多个json validator 验证从php 生成的json。我最喜欢的是jslint

    【讨论】:

    • 所以我做了一个 error_log(json_encode($arr)) 并把它放在 jslint 中并且 JSON 是有效的。但是当脚本回显 json 时,我的应用程序只接收到损坏的数据......我决定修复这个问题。感谢您的提示,我将更频繁地使用 jslint。
    • 注明。然后另一个理论是json字符串在服务器和客户端之间被切成两半。为了证明这一点,尝试回显除 json 字符串之外的一些大字符串,并在客户端 js 中查看。如果它像 json 字符串一样被切成两半,那么我们可以确认在数据传输过程中发生了某些事情(这不太可能),并且可以继续深入研究。
    • 回显了一个非常长的字符串并且它没有被分割。会不会是我回显数组的方式?
    • 在这一点上,我实际上认为我从 NSMutableRequest 接收数据的方式有问题。我可能不得不使用 NSMutableData 而不仅仅是 NSData...
    • 昨晚我进行了更多挖掘,发现我的数据有时会以块的形式返回。不知道为什么会发生这种情况,但它只会带来丰厚的回报。
    【解决方案2】:

    在做了一些检查、双重检查和更多测试后,我得出结论,这毕竟不是我的 PHP,而是我的 NSURLConnection。

    -(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{ 
    

    您不能依赖此方法恢复全部数据,它在某些情况下会中断。因此,您必须实现一个 NSMutableData 集并像这样附加数据......

    if(arrData != nil){
      [arrData appendData:data];
    }
    

    并且在连接中确实完成了委托,执行此操作...

    -(void)connectionDidFinishLoading:(NSURLConnection *)connection{
    
        if (arrData != nil) {
            //Some method to return or use arrData
            arrData = nil;
        }
    }
    

    这样您将始终收到完整的数据。感谢@Robotys 的帮助和新工具!

    【讨论】:

      猜你喜欢
      • 2014-09-25
      • 1970-01-01
      • 2017-01-03
      • 1970-01-01
      • 1970-01-01
      • 2014-06-29
      • 2021-06-29
      • 2019-06-28
      • 2016-06-27
      相关资源
      最近更新 更多