【问题标题】:Get data from webserver (php/mysql) by ASIHTTPRequest JSON通过 ASIHTTPRequest JSON 从网络服务器(php/mysql)获取数据
【发布时间】:2013-05-15 12:40:03
【问题描述】:

我在这个函数中向网络服务器发送请求:

-(void)getData
{    
    NSURL *url = [NSURL URLWithString:@"http://10.10.10.10/application.php"]; //some address
    ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];
    request.delegate = self;
    [request setPostValue:@"6577098" forKey:@"serial_number"];
    [request startAsynchronous];
}

然后在 application.php 中的服务器部分:

<?php
    //$serial_number from $_POST["serial_number"];
    $serial_number = $this->getString('serial_number', 64); 

    $stmt = $this->pdo->prepare('SELECT S.DateTime, SN.Name FROM States S LEFT JOIN StateNames SN on SN.ID=S.State_ID WHERE S.SerialNumber = ?');

    $stmt->execute(array($serial_number));
    $states = $stmt->fetchAll(PDO::FETCH_ASSOC);
    $result = array();
    foreach ($states as $state)
    {               
        $result[] = $state;            
    }

    sendResponse(200, json_encode($result));
?>

当我从浏览器尝试时,这部分有效,它有效,我得到了这个:

[{"DateTime":"2013-05-15 10:22:11","Name":"No water"},{"DateTime":"2013-05-13 14:55:31","Name":"Water"}]

然后回到Xcode中处理:

-(void)requestFinished:(ASIHTTPRequest *)request
{
    if (request.responseStatusCode == 200)
    {
       NSString *responseString = [request responseString];
       NSLog(@"%@",responseString);  //if I try this nothing happened
    }
}

我想我必须对 JSON 做点什么。 我觉得我的要求反应不好。但我有 responseStatusCode 200。 谁能帮我?我没发现有什么问题。 谢谢

【问题讨论】:

  • 您确定您的服务器代码响应 POST 请求以及 GET 请求吗?
  • 是的,我确定。如果不是,则无法返回 responseStatusCode 200。我尝试更改或删除该 POST 值 serial_number,如果错误,则返回状态码 400。应该是正确的。
  • 从您的帖子和 cmets 我仍然无法理解这是服务器/php 问题还是 app/objective-c 问题。你能从服务器获取任何页面的内容吗?
  • 嗯,我需要从服务器上的 mysql 获取数据,我使用 php。我想通过 ASIHTTPRequest 使用参数 serial_number 将它发送到该服务器,并且该 sql 选择的结果应该是该请求的响应。就像这里raywenderlich.com/2965/… 但它不起作用。 :(
  • 只需将此代码放在您的 php 文件的顶部:ini_set('display_errors', 1); ini_set('error_reporting', E_ALL);,如果您在服务器上有错误详细信息,您应该能够看到它们

标签: ios json asihttprequest


【解决方案1】:

我需要详细信息来告诉您需要调整哪些服务器设置。我的下一个最佳建议 - 逐行调试。例如在 php 文件中,执行:

$serial_number = $this->getString('serial_number', 64); //there I get serial_number from $_POST["serial_number"];
echo $serial_number; die;
// ...

此时,如果您再次运行您的应用程序,您应该会看到打印在 -(void)requestFinished:(ASIHTTPRequest *)request 中的序列号,如果这里没有任何问题的话。如果你确实看到了,移除回声并死掉,继续前进

//...
$stmt = $this->pdo->prepare('SELECT S.DateTime, SN.Name FROM States S LEFT JOIN StateNames SN on SN.ID=S.State_ID WHERE S.SerialNumber = ?');

$stmt->execute(array($serial_number));
$states = $stmt->fetchAll(PDO::FETCH_ASSOC);
print_r($states); die;
// ...

如果那里没有响应,这可能意味着您的 php 中没有 PDO driver installed

如果下一行sendResponse(200, json_encode($result)); 打断了它,那么我猜你的php 安装缺少json 模块。

【讨论】:

  • 我的东西必须在函数 sendResponse 上,或者不在函数中,而是在一些服务器设置中,关于 header 或 echo $body。因为如果我通过浏览器尝试它,我会从数据库和屏幕上打印的数据中看到结果。但是如果我从 Xcode 中尝试它,我没有看到它。但是如果我在localhost上尝试这个,php和apache的另一个设置应该在哪里,但我不知道我必须改变什么,有很多选项和模块等。
  • 这是我服务器上 php 的扩展列表:bz2、calendar、Core、ctype、curl、date、ereg、exif、fileinfo、filter、ftp、gettext、hash、iconv、json、libxml , mbstring, mhash, mysql, mysqli, mysqlnd, openssl, pcntl, pcre, PDO, pdo_mysql, pdo_sqlite, Phar, readline, Reflection, session, sockets, SPL, sqlite3, standard, tokenizer, zip, zlib
  • 这是我在本地主机上拥有但在服务器上没有的扩展:bcmath、dba、dom、gd、ldap、odbc、pdo_pgsql、pgsql、posix、shmop、SimpleXML、snmp、soap , SQLite, sysvmsg, sysvsem, sysvshm, 整洁, wddx, xml, xmlreader, xmlrpc, xmlwriter, xsl
  • 这是位于 localhost 而不是服务器上的 apache 模块列表:mod_file_cache、mod_mem_cache、mod_bucketeer、mod_echo、mod_example、mod_case_filter、mod_case_filter_in、mod_reqtimeout、mod_charset_lite、mod_proxy_scgi、mod_imagemap
  • 我现在很干 - 那么没有其他建议了。您是否尝试过像我说的那样逐行调试以找到脚本中断的确切位置?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多