2012-12-03 12 views
7

से POST का उपयोग करके PHP को सरणी पास करना, इसलिए मैंने समस्याओं की एक अनगिनत संख्या देखी है, लेकिन उनमें से कोई भी उत्तर नहीं दिया कि मैं क्या देख रहा था या पूरी तरह से इसका उत्तर दिया ताकि उम्मीद है कि आप सभी मेरी मदद कर सकते हैं।आईओएस

मुझे POOS का उपयोग करके आईओएस से रेस्तरां फ़ाइल की एक सरणी पास करने की ज़रूरत है या फिर भी यह अच्छी तरह से काम करेगा। मैं ASIHTTPRequest के बारे में जानता हूं लेकिन मैं कुछ निर्मित करने की तलाश में हूं और इसे डेवलपर द्वारा छोड़ा गया है। और आखिरकार, मैं उन्हें यूआरएल के माध्यम से पास नहीं करना चाहता क्योंकि मुझे नहीं पता कि कितनी प्रविष्टियां होंगी।

तो यहां तक ​​कि मुझे अब तक क्या मिला है।

NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:theURL]]; 

[request setHTTPMethod:@"POST"]; 

NSMutableDictionary *jsonDict = [[NSMutableDictionary alloc] init]; 
[jsonDict setValue:restaurants forKey:@"restIDs"]; 
NSLog(@"JSON Dict: %@",jsonDict);//Checking my array here 


NSData *jsonData = [NSJSONSerialization dataWithJSONObject:jsonDict options:kNilOptions error:nil]; 
NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]; 
NSLog(@"JSON String: %@",jsonString); //Checking my jsonString here... 

[request setValue:@"application/json" forHTTPHeaderField:@"Accept"]; 
[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"]; 

[request setValue:@"json" forHTTPHeaderField:@"Data-Type"]; 
[request setValue:[NSString stringWithFormat:@"%d", [jsonData length]] forHTTPHeaderField:@"Content-Length"]; 
[request setHTTPBody: jsonData]; 
NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]; 
NSLog(@"Return DATA contains: %@", [NSJSONSerialization JSONObjectWithData:returnData options:NSJSONReadingMutableContainers error:nil]); 
NSArray *restMenuCount = [NSJSONSerialization JSONObjectWithData:returnData options:NSJSONReadingMutableContainers error:nil]; 

तो, यह अंत से, मैं सब कुछ देख लिया है और यह सब अच्छा लग रहा है, लेकिन पीएचपी अंत से यह और भी यह लेने नहीं करता है।

यहाँ मेरी PHP फ़ाइल की तरह दिखता है:

$restIDs = $_POST['restIDs']; 
echo $restIDs; //Checking to see if it even has anything......but nothing there 
for ($i = 0; $i < $restIDs.count; $i++) { 
    $query = "SELECT * FROM `MenuItems` WHERE rest_id = '$restID'"; 
    $result = mysqli_query($connect, $query); 
    $number = mysqli_num_rows($result); 
    $menuNumber[$i] = $number; 
} 

echo json_encode($menuNumber); 

तो अंत में, क्या मैं गलत कर रहा हूँ? मुझे अपने PHP अंत में कुछ भी क्यों नहीं मिल रहा है। और सबसे अधिक, क्या कोई मुझे बता सकता है कि पोस्ट के माध्यम से सरणी कैसे भेजना है। क्योंकि मुझे लगता है कि यह मेरी असली समस्या है, मैं खुद को समस्या को ठीक करने के लिए पर्याप्त समझ में नहीं आता। मुझे समझ में नहीं आता कि आप आईओएस पक्ष से सबकुछ कैसे डाल सकते हैं और इसे PHP पक्ष पर उठा सकते हैं।

मुझे उम्मीद है कि यह सब पर्याप्त स्पष्ट था, अग्रिम धन्यवाद।

संपादित करें:
मैं यूआरएल के माध्यम से एक स्ट्रिंग के रूप सरणी गुजर करने की कोशिश की तो यह विस्फोट, सौभाग्य से यह काम किया है ... लेकिन मैं सिर्फ यूआरएल सीमा के अंतर्गत हूँ, इसलिए मैं अभी भी यह पता लगाने के लिए करना चाहते एक और समाधान। कम से कम, अब मुझे पता है कि मेरा बाकी कोड अपेक्षित काम कर रहा था।

+1

आप एक php ढांचे का उपयोग कर रहे हैं? – ekims

+1

आपके कोड में एक [एसक्यूएल इंजेक्शन भेद्यता] है (http://en.wikipedia.org/wiki/SQL_injection)। आप mysqli का उपयोग कर रहे हैं, आप तैयार कथन का उपयोग क्यों नहीं कर रहे हैं? – Charles

+0

हाय चार्ल्स, हाँ मेरे कोड में एसक्यूएल इंजेक्शन भेद्यताएं हैं, लेकिन तैयार बयानों से आपका क्या मतलब है? – WiseOlMan

उत्तर

8

आपको $_POST वैरिएबल भरने के बारे में एक मूल गलतफहमी है। दस्तावेज़ प्रकार को JSON के रूप में निर्दिष्ट करना और पोस्ट बॉडी के रूप में JSON स्ट्रिंग को फेंकना इस सरणी को स्वत: पॉप्युलेट नहीं करेगा। शरीर को एक विशिष्ट प्रारूप में होना चाहिए। आमतौर पर, इसका मतलब है यूआरएल-एन्कोडेड जोड़े, उदाहरण के लिए a=1&b=2&c=2&d=%2fg+y इत्यादि। यह कुछ हद तक उस डेटा को सीमित करता है जिसे आप भेज सकते हैं। विशेष रूप से, इस अर्थ में एक मनमानी JSON ऑब्जेक्ट संभव नहीं है, यदि आप इसे $ _POST चर में स्वचालित रूप से दिखाना चाहते हैं। यहां से कुछ विकल्प हैं:

विकल्प एक: $_POST का उपयोग करने के बजाय, सीधे पोस्ट बॉडी का उपयोग करें। fopen("php://input") का प्रयोग करें और पार्स एक PHP JSON पार्सर का उपयोग कर कि:

$input = file_get_contents("php://input"); 
$obj = json_decode($input,true); 
$restIDs = $obj['restIDs']; 

आप इस मार्ग आप हालांकि restIDs नाम के एक क्षेत्र के साथ एक वस्तु बनाने की जरूरत नहीं है के लिए चला गया है। इसके बजाय आप बस सरणी को क्रमानुसार कर सकते हैं और प्रयोग $obj रूप $restIDs

विकल्प दो, restIDs में अपनी वस्तुओं संभालने बस तार कर रहे हैं, बजाय एक JSON ऑब्जेक्ट के रूप में डेटा पास करने का, शरीर प्रारूप के रूप में पीएचपी उपयोग के लिए:

NSMutableString *bodyStr = [NSMutableString string]; 
for (NSString *restID in restaurants) { 
    [bodyStr appendFormat:@"restIDs[]=%@&",[restID stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]; 
} 
NSData *body = [bodyStr dataUsingEncoding:NSUTF8StringEncoding]; 
[request setHTTPBody: body]; 

अब आप $_POST['restIDs'] का उपयोग करके इसे एक्सेस करने में सक्षम होना चाहिए जैसा आप उम्मीद करेंगे।

+0

हाय एड, मैंने दूसरे विकल्प की कोशिश की, लेकिन पूरी तरह से समझ में नहीं आया कि इसे कैसे कार्यान्वित किया जाए क्योंकि दूसरी तरफ कुछ भी नहीं निकलता है। BodyStr को $ _POST के अंदर सरणी में कैसे बनाया जाएगा? इसके अलावा, पहले विकल्प के लिए, मैंने अपने प्रश्न के लिए सबकुछ रखा, और अपनी तीन पंक्तियों को मेरे PHP कोड में जोड़ा, फिर $ obj ['restIDs'] और $ obj echo'd और कुछ भी नहीं निकला। मुझ से ऐसी कौनसी गलती हो जाएगी? क्या आईओएस पक्ष पर मेरा पोस्ट गलत है? – WiseOlMan

+0

जो मैं देख सकता हूं, सबकुछ सही दिखता है। आपके अलावा php स्क्रिप्ट के शीर्ष पर एक गूंज कथन है, जो आपके आउटपुट को मैंगल करेगा जब आप आईओएस पक्ष पर जेएसओएन के रूप में इसे पार्स करने का प्रयास करेंगे। मैं उद्देश्य-सी कोड में बहुत से 'NSLog' कथन और चीजों को ट्रैक करने के लिए php पक्ष पर' var_dump' कथन 'के बहुत सारे सुझाव दूंगा। विशेष रूप से, 'var_dump (file_get_contents ("php: // input") आज़माएं); ' –

+0

ठीक है, जब मैं अपराधी को ट्रैक करता हूं तो मैं वापस पोस्ट करूंगा, धन्यवाद! – WiseOlMan

1

आप सरणी को गलत कर रहे हैं। सबसे पहले आपने इसे JSON स्ट्रिंग में रखा और फिर आपने पोस्ट वैरिएबल में JSON स्ट्रिंग नहीं डाला लेकिन HTML संदेश के बॉडी के रूप में।यदि आप एक पोस्ट संदेश के माध्यम से PHP में डेटा स्थानांतरित करने के लिए JSON का उपयोग करने जा रहे हैं तो आपको इसे एक पोस्ट चर के रूप में सेट करने की आवश्यकता है। फिर PHP में, आप चर को पढ़ते हैं और जेसन को अपने मूल चर प्राप्त करने के लिए डीकोड करते हैं। यहां एक उदाहरण दिया गया है कि मैंने इसे कैसे किया।

क्षमा करें, मैंने मूल रूप से यहां जावा कोड चिपकाया है। इससे अधिक समझ हो सकती है।

-(void) setPath: (NSString *) input 
{ 
    Path=input; 
} 

-(void) run 
{ 
    NSDictionary* jsonDictionary=[NSDictionary dictionaryWithObject: data1 forKey:@"data"]; 
    NSString* jsonString = [jsonDictionary JSONRepresentation]; 
    AFHTTPClient *httpClient=[[AFHTTPClient alloc] initWithBaseURL:url]; 
    NSDictionary *params =[NSDictionary dictionaryWithObjectsAndKeys: 
          apps,@"app", 
          jsonString,@"smpdata",nil]; 
    NSMutableURLRequest *request = [httpClient requestWithMethod:@"POST" path:Path parameters:params]; 

    NSURLResponse *response = nil; 
    NSError *error = nil; 

    NSData *data=[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]; 

    if (error) { 
     NSLog(@"Error: %@",error); 
    } 
    else { 
     id JSON = AFJSONDecode(data, &error); 
     NSArray *dataarray=[JSON valueForKey:@"Data"]; 
     status= [NSString stringWithFormat:@"%@",[JSON valueForKeyPath:@"Status"]]; 
     NSLog(@"%@",status); 
     returndata= dataarray; 

    } 
} 

-(NSArray *) returndata { 
    return returndata; 
} 

-(NSString *) status { 
    return status; 
} 

@end 

पीएचपी

<? 
$jsondata=$_POST['smpdata']; 
$data = json_decode($jsondata); 
?> 
+0

हाय कोडेगुय, इस दृष्टिकोण के साथ समस्या यह है कि मुझे नहीं पता कि मेरे पास समय से कितने चर होंगे, इसलिए नाम/मूल्य जोड़े चाल नहीं करेंगे। क्या कोई तरीका है कि मैं जेसन को एक सरणी में डीकोड कर सकता हूं जिसे मैं फिर से कर सकता हूं? मुझे यह कैसे करना है? साथ ही, आपने उल्लेख किया है कि मैं अपना JSON डेटा गलत कर रहा हूं। मैं इसे एक पोस्ट चर के रूप में कैसे पास करूंगा? और फिर मैं इसे PHP पक्ष पर कैसे पकड़ूंगा? धन्यवाद। – WiseOlMan

+0

हमने एक सरणी का उपयोग करके इसे संभाला। सरणी में चर की संख्या के रूप में कई पंक्तियां हो सकती हैं। हम कभी-कभी हम चर को एक सीएसवी स्ट्रिंग में फेंक देते हैं और जेएसओएन स्ट्रिंग में भी पास करते हैं। न तो सरणी या सीएसवी स्ट्रिंग पंक्तियों या स्तंभों को परिभाषित करती है ताकि वे चर हो सकें। एक बेहतर तरीका हो सकता है लेकिन सीएसवी स्ट्रिंग को पास करने से पहले JSON का उपयोग करने का निर्णय लिया गया था। – Codeguy007