2016-08-21 15 views
0

データを取得しようとすると、次のエラーが発生します。インターネットでは、PHPスクリプトが無効で、jsonデータが返されないため、そのことを読んでいます。しかし、PHPのスクリプトが正常に実行され、正しいデータを出力します。PHPスクリプトからJsonデータを取得しようとするとエラーが発生する

エラーメッセージ:

エラードメイン= NSCocoaErrorDomainコード= 3840「JSONテキストは、フラグメントが設定されていない可能にするために、配列やオブジェクトとオプションで起動しませんでした。」 UserInfo = {NSDebugDescription = JSONテキストが配列またはオブジェクトで始まっておらず、フラグメントが設定されないようにするためのオプション}

フラグメントを許可しようとしましたが、別のエラーメッセージが表示されました。ここで

は、私は、データを取得しようSWIFTコードです:

let myUrl = NSURL(string: "http://xxxxxxxxxxx.xxx/xxxxxxxx.php") 

let request = NSMutableURLRequest(URL: myUrl!) 
request.HTTPMethod = "POST" 

let postString = "userEmail=\(userEmail!)&userPassword=\(userPassword!)" 

request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding) 

NSURLSession.sharedSession().dataTaskWithRequest(request, completionHandler: { (data:NSData?, response:NSURLResponse?, error:NSError?) -> Void in 

    dispatch_async(dispatch_get_main_queue()) 
    { 
     if(error != nil) 
     { 
      var alert = UIAlertController(title: "Achtung", message: error?.localizedDescription, preferredStyle: UIAlertControllerStyle.Alert) 

      let action = UIAlertAction(title: "Ok", style: UIAlertActionStyle.Default, handler: nil) 

      alert.addAction(action) 

      self.presentViewController(alert, animated: true, completion: nil) 
     } 
     print("1") 
     do { 
      let json = try NSJSONSerialization.JSONObjectWithData(data!, options: .MutableContainers) as? NSDictionary 

      if let parseJSON = json { 

       let userId = parseJSON["userId"] as? String 
       if(userId != nil) 
       { 
        print("SUCESS FUCKER") 
        let mainView = self.storyboard?.instantiateViewControllerWithIdentifier("main") as! FlickrPhotosViewController 

        let mainPageNavi = UINavigationController(rootViewController: mainView) 
        //open mainView 
        let appdele = UIApplication.sharedApplication().delegate 
        appdele?.window??.rootViewController = mainPageNavi 


       } else { 
        let userMassage = parseJSON["message"] as? String 
        let myAlert = UIAlertController(title: "Alert", message: userMassage, preferredStyle: UIAlertControllerStyle.Alert); 

        let okAction = UIAlertAction(title: "OK", style: UIAlertActionStyle.Default, handler: nil) 
        myAlert.addAction(okAction); 
        self.presentViewController(myAlert, animated: true, completion: nil) 

       } 

      } 
     } catch{ 
      print(error) 
      print("FAILED CATCHED") 
     } 

    } 
}).resume() 

、これはPHPファイルの重要な部分である:私はそれを印刷するとき

$userSecuredPassword = $userDetails["user_password"]; 

$userSalt = $userDetails["salt"]; 

if($userSecuredPassword === sha1($userPassword . $userSalt)) 
{ 
    $returnValue["status"]="200"; 

    $returnValue["userFirstName"] = $userDetails["first_name"]; 

    $returnValue["userLastName"] = $userDetails["last_name"]; 

    $returnValue["userEmail"] = $userDetails["email"]; 

    $returnValue["userId"] = $userDetails["user_id"]; 
} else { 
    $returnValue["status"]="403"; 

    $returnValue["message"]="User not found"; 

    echo "failed"; 

    echo json_encode($returnValue); 

    return; 
} 



echo json_encode($returnValue); 

$のreturnValueはこれを返します。 : Array([status] => 200 [userFirstName] => Paul [userLastName] => Heinemeyer [userEmail] => paul_heine [userId] => 63)

+1

いくつかの無関係な観察:1.投稿リクエストの本文に追加した値をエスケープするパーセント値でなければなりません(例えば、パスワードに '&'または '+'文字がある場合、キャプチャされません正しく)。 2.ヘッダー( "Content-Type:application/json");をPHPに組み込むことができます。それは技術的には必要ではありませんが、それは良い方法です。 3.また、元のリクエストの 'Content-Type'を' application/x-www-form-urlencoded'に設定する必要があります。 4. Alamofireを使用して、適切にリクエストを作成し、レスポンスを解析する雑草から抜け出すことを検討してください。 – Rob

答えて

2

PHPコードは、あなたが他の部分に使用すると、エラーメッセージがすでに言うよう

failed{...} 

になり

echo "failed"; 
echo json_encode($returnValue); 

を持っていることを、わかります、この「JSONテキストは、配列やオブジェクトで起動しませんでした。 .. "

他のif部分にも同様の出力があります。

+0

Sry、しかし私はあなたの解決策を理解していないので、これら2行のコードのために私は失敗したブロックに入りますか? @Olaf Dietsche –

+0

これは解決策ではなく、ちょっとした見解です。そうでない場合は、PHP出力が "failed"で始まります。これは配列 '['の開始もオブジェクト '{' 。ですから、elseの場合、 'echo"を取り除いて失敗しました。 –

+0

これを完全に調べるには、クライアント側で応答を出力する必要があります。そこには、問題が何であり、間違った出力がどこから来るのかがわかります。あなたの質問の部分的なコードから、私は部分的な答えだけを推論することができます。 –

関連する問題