2011-12-26 9 views
0

、どの私のios5アプリに「id」を送り、その商品の「在庫」を受け取るようにします。JSONの構文解析:(データベース攻撃:MySQLを)PHP5から私は:(一日</p> <p>を(新たなものを)しようとしてきたので、私は、私はデータベースのMySQLを持っている誰かが私を置くに役立つことを願ってiOS5をiphone

私のPHPコードでは、「製品」(2行:「id」と「stock " :

これは私のアプリにJSONを送信すると思われるものの、私のアプリはこのJSONをfunctioで受け取りますnは呼ば:

- (void)requestFinished:(ASIHTTPRequest *)request 
{  
    NSString *responseStringWEB = [request responseString]; 
    NSLog(@"STRING:: %@ \n", responseStringWEB); //3 
    NSDictionary *responseDict = [responseStringWEB JSONValue]; 
    NSLog(@"DICT: %@ \n", responseDict); //3 
    NSString *id_producto = [responseDict objectForKey:@"id"]; 
    NSString *stock = [responseDict objectForKey:@"stock"]; 
    NSLog(@"ID: %@\n", id_producto); //3 
    NSLog(@"stock: %@", stock); //3 
} 

とコンソールをチェックするには、私が取得:

**`STRING`::** 
Connection establishedDatabase selected.. 
***{"id":"3","stock":"46"}*** 
Connection closedDesconectado 
2011-12-26 18:58:57.170 CaeDeCajon[1998:16403] Error Domain=NSCocoaErrorDomain Code=3840 "The operation couldn’t be completed. (Cocoa error 3840.)" (JSON text did not start with array or object and option to allow fragments not set.) UserInfo=0x984aeb0 {NSDebugDescription=JSON text did not start with array or object and option to allow fragments not set.} 
2011-12-26 18:58:57.171 CaeDeCajon[1998:16403] **`DICT`**: (null) 
2011-12-26 18:58:57.171 CaeDeCajon[1998:16403] **`ID`**: (null) 
2011-12-26 18:58:57.171 CaeDeCajon[1998:16403] **`stock`**: (null) 

質問です:私は、JSONは(配列に来ているフォーマットするかわからない、私が取得するNSStringのresponseStringWEBを解析する必要がありますどのようにそれらの2つの値(IDとSTOCK)。データベースからそれらを受け取ったようですが、私はそれらを抽出するために手を差し伸べません。

HELPは:)、

EDITING ::

感謝をありがとうございました。本当に助けになりました。

PHPコードで使用した複数のエコーとは何か関係があるようでした。今私はjson形式でデータを送信する1つのエコーを持っています。それは私のデータベースと私のアプリケーションと完全に動作します:私はすべてのアイテムのテーブル全体( "id"と "在庫")を受け取ります。ありがとう。

しかし、私は、製品が販売された後にデータベースを変更する必要があるということを発見しました。通常、PHPで配列を投稿する必要があります。影響を受ける製品/アイテム(array_idとarray_reductor)のidとreductor(インダクタはその "id"のどれだけの製品が販売されたかを表す)をPOSTすることです。

IOS5 CODE:

NSArray *array_id=[[NSArray alloc]initWithObjects:@"0",@"3",@"5", nil]; 

// ID製品と。

NSArray *array_reductor=[[NSArray alloc]initWithObjects:@"10",@"5",@"40", nil]; 

//販売されている製品の数(現在の在庫番号を取得するために、これまでのデータベースで以前の在庫数を減らす必要があります)。データは {

来ている場合

IF(ISSET($ _ POST [ 'ID'])& & ISSET($ _ POST [ '減速']))//チェック:MY PHPファイルは

NSURL *url=[[NSURL alloc]initWithString:@"http://www.haveyourapp.com/promos/"]; 
ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url]; 
[request setPostValue:array_id forKey:@"id"]; 
[request setPostValue:array_reductor forKey:@"reductor"]; 

[request setDelegate:self]; 
[request startAsynchronous]; 

私のコードは動作しません。私のアプリやPHPファイル(おそらく)に問題があるかどうかわかりませんが、どうすればこれらの2つの配列を受け取り、それらを使用できますか?事前

おかげで私は、スタックオーバーフローの上に多くの時間を費やす:VERY USEFULLLLLLLL !!!!!

答えて

0

HTTPScoopなどのツールを使用してPHPスクリプトの出力を確認してください。私は、あなたがJSONが始まる前に印刷されたスクリプトからいくつかのログを持っているように見えます

**`STRING`::** 
Connection establishedDatabase selected.. 
***{"id":"3","stock":"46"}*** 
Connection closedDesconectado 
...ライン Connection establishedDatabase selected..Connection closedDesconectadoが含まれているコンソール出力に基づいて、何かが間違っていると思われますこれはiOS側のJSONパーサでは受け入れられません。

+0

Joerick、私はあなたの権利を考えます。 PHPは正常に動作します。問題は今、アプリケーションからPHPで配列を受け取ることです。何かアドバイス? – Roberto

1

json_encodeはUTF-8エンコードされたデータでのみ動作するため、無効な文字を検出すると、すべてがNULLを返します。

データがUTF-8でエンコードされていることを確認してください。

また、ファイルがUTF-8を使用していることを確認してください。

json_encodeする代替:

// función interna: comprueba si un array es puro o no 
// es puro si sus índices son: 0, 1, 2, ..., N 
function aputio($a) { 
    $i=0; 
    foreach ($a as $n=>$v) { 
     if (strcmp($n,$i)) return(true); 
     $i++; 
    } 
    return(false); 
} 

// cambiar quotes, \n y \r para devolver cadenas válidas JSON 
function qcl2json($qcl) { 
    return str_replace('"','\"',str_replace("\n",'\n',str_replace("\r",'\r',$qcl))); 
} 

// devolver variable en formato json 
function ajson($av,$level=0,$utf8=false) { 
    if (($av===null) && !$level) return("null"); 
    if (!is_array($av)) return (gettype($av)=="integer"?$av:'"'.($utf8?utf8_encode($av):$av).'"'); 
    $isobj=aputio($av); 
    $i=0; 
    if (!$level) $e=($isobj?"{":"["); else $e=""; 
    foreach ($av as $n=>$v) { 
     if ($i) $e.=","; 
     if ($isobj) $e.=(is_numeric($n) && !is_string($n)?$n:"\"".qcl2json($utf8?utf8_encode($n):$n)."\"").":"; 
     if (!is_array($v)) { 
      if (is_bool($v)) $e.=($v?"true":"false"); 
      else if ($v==NULL) $e.='""'; 
      else if (is_int($v)||is_double($v)) $e.=$v; 
      else $e.='"'.qcl2json($utf8?utf8_encode($v):$v).'"'; 
     } else { 
      $e.=(count($v) 
       ?(aputio($v) 
        ?"{".ajson($v,$level+1)."}" 
        :"[".ajson($v,$level+1)."]") 
       :"{}"); 
     } 
     $i++; 
    } 
    if (!$level) $e.=($isobj?"}":"]"); 
    return($e); 
} 

を使用すると、UTF-8を使用することができる場合は、この機能を使用しないでください。

+0

ワウ...それは私には地獄のように見える、| o | o | 、絶対にこれは新しくないものです。私が追いついてもそれを守った。私は以前のエコーを削除する問題を解決しましたが、エコーjson_encodeが動作しました。今、私はARRAYSを投稿しようとしています。これは他の問題です:)助言はありがたいです – Roberto

1

あなたのjsonのエンコーディングは正しいですIOSは本当に応答が厳しいかもしれないので、この行をあなたのPHPスクリプトに追加してみてください。

は、PHPスクリプトにこれを追加します。

header('Content-type: application/json'); 

それ以外にも、あなたのパラメータの場合に一致している確認してください。あなたのPHPスクリプトはidを送信しますが、iosスクリプトが探しているようです。ID

+0

ありがとうGabriel、私はまだチェックアウトしていません。あなたのコードは何をしていますか?残りのエコーをきれいにする?私はすべてのエコーを削除するが、json_encodeを削除して解決しました。今、私はARRAYSを投稿しようとしています。これは他の問題です:)助言はありがたいです – Roberto

関連する問題

 関連する問題