2015-09-01 4 views
0

Я пытаюсь настроить отправку данных на сервер PHP, но мне вообще не повезло.Отправка данных на сервер PHP

Вот мой код PHP.

<?php 
require_once "../config/config.php"; 
var_dump($_POST); 
var_dump($_REQUEST); 
// Read request parameters 
if(isset($_REQUEST)){ 
    $username = $db->escape($_REQUEST["username"]); 
    $email = $db->escape($_REQUEST["email"]); 
    $password = $db->escape($_REQUEST["password"]); 
    $id = MD5($email); 
    echo $username; 
    //$db->query("INSERT INTO user ('id','username','email','password') VALUES ('$id','$username','$email',PASSWORD('$password'))"); 
    $returnValue = $id; 
}else{ 
    $returnValue = "No data received"; 
} 
// Send back request in JSON format 
echo json_encode($returnValue); 
?> 

Вот мой Swift Code

let request = NSMutableURLRequest(URL: NSURL(string: "http://***************/register.php")!) 

    let session = NSURLSession.sharedSession() 

    request.HTTPMethod = "POST" 

    let data = "username=JoeBloggs&[email protected]&password=12345" 

    request.HTTPBody = (data as NSString).dataUsingEncoding(NSUTF8StringEncoding) 
    request.addValue("application/json", forHTTPHeaderField: "Content-Type") 
    request.addValue("application/json", forHTTPHeaderField: "Accept") 

    let task = session.dataTaskWithRequest(request) { (data, response, error) -> Void in 
     print(response) 
     let strData = NSString(data: data!, encoding: NSUTF8StringEncoding) 
     print(strData) 
     print(error) 

    } 
    task.resume() 

Я не обеспокоен получения результата назад еще (у меня есть, что работает отлично). Я просто не могу получить какие-либо данные на сервере.

Вот результат приведенного выше сценария.

Optional(<NSHTTPURLResponse: 0x7ff9b3d6ea90> { URL: http://iep.almartin.co.uk/register.php } { status code: 200, headers { 
"Cache-Control" = "no-store, no-cache, must-revalidate, post-check=0, pre-check=0"; 
Connection = close; 
"Content-Type" = "text/html; charset=UTF-8"; 
Date = "Tue, 01 Sep 2015 09:02:46 GMT"; 
Expires = "Thu, 19 Nov 1981 08:52:00 GMT"; 
Pragma = "no-cache"; 
Server = nginx; 
"Set-Cookie" = "PHPSESSID=8j2d7oobg9plvdik1dcbqtoq70; path=/"; 
"Transfer-Encoding" = Identity; 
} }) 
Optional(array(0) { 
} 
array(0) { 
} 
<br /> 
<b>Notice</b>: Undefined index: username in <b>/home/linweb34/i/iep.almartin.co.uk/user/htdocs/register.php</b> on line <b>7</b><br /> 
<br /> 
<b>Notice</b>: Undefined index: email in <b>/home/linweb34/i/iep.almartin.co.uk/user/htdocs/register.php</b> on line <b>8</b><br /> 
<br /> 
<b>Notice</b>: Undefined index: password in <b>/home/linweb34/i/iep.almartin.co.uk/user/htdocs/register.php</b> on line <b>9</b><br /> 
"d41d8cd98f00b204e9800998ecf8427e") 
nil 

Как вы можете видеть, как $ _REQUEST, так и $ _POST возвращают пустые массивы.

Что я делаю неправильно?

ответ

0

Так я последовал @vadian ответ, который не работает на начальном этапе. Я сделал некоторые исследования, почему PHP не принимал приложение/json.

Я получил его для работы с использованием $ HTTP_RAW_POST_DATA вместо $ _POST или $ _REQUEST в php-файле.

Однако! $ HTTP_RAW_POST_DATA теперь изношен, но следующий код работает

$json = file_get_contents('php://input'); 
$obj = json_decode($json); 

Похоже, PHP взломать меня, но по крайней мере это работает.

0

Ошибка ясно говорит о наличии проблемы с использованием MySQL. Ниже приведен шаблон рабочего кода. Он использует PDO для соединения с БД.

function __construct() { 
    $this->conn = new PDO('mysql:host=<your hostnam>;dbname=<dbname>', '<user>', '<pass>'); 
    // Generate stack trace on failure. 
    $this->conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
} 

/* 
* Write a function and pass your variables 
*/ 
function get_data_from_db($id,$username,$password,$email) { 
    $stmt = $this->conn->prepare("INSERT INTO `user`(`id`,`username`,`email`,`password`) VALUES (:id,:username,:email,PASSWORD(:password))"); 
    $stmt->execute(array(':id' => $id, ':username' => $username, ':email' => $email, ':password' => $password)); 
    $data = $stmt->fetchAll(PDO::FETCH_ASSOC); 
    $stmt->closeCursor(); 

    return $data; 
} 

Теперь в вашем коде, просто добавьте вызов функции, и вы сделали:

if(isset($_REQUEST)){ 
    $username = $db->escape($_REQUEST["username"]); 
    $email = $db->escape($_REQUEST["email"]); 
    $password = $db->escape($_REQUEST["password"]); 
    $id = MD5($email); 

    $result = get_result_from_db($id,$username,$password,$email); 

    echo json_encode($result); 
} 

Примечание: Не тестировался, но он должен работать.

+1

Вы в этом нет. Ошибка в MySQL не является проблемой. Если вы посмотрите в ответе, первая ошибка заключается в том, что $ _REQUEST ["username"] является неопределенным индексом. Другими словами, этого не существует, что должно. По какой-то причине POST из моего приложения не доходит до сервера. Это проблема, а не MySQL. –

+0

Да, ур прав. Я думал, что проблема связана с проблемой MySQL получения правильного ассоциативного индекса.Также подумал, что данные поступают на PHP, видя условия var_dump и ISSET. – Naga2Raja

+0

Да, var_dump возвращает пустые массивы. Я сделал несколько примеров онлайн о том, как это сделать, но я не понимаю, почему это не работает для меня. –

0

Обнаружена проблема.

Кажется, эти строки являются виновниками моего приложения.

request.addValue("application/json", forHTTPHeaderField: "Content-Type") 
request.addValue("application/json", forHTTPHeaderField: "Accept") 

Он отлично работал, когда я удалил их.

Что вызывает другой вопрос, как мне настроить PHP для принятия типа заголовка «application/json»?

+0

сервер принимает json, но вы отправляете html/text. Вы должны сериализовать текст с помощью NSJSONSerialization – vadian

0

Чтобы отправить JSON на сервер с POST вы должны поместить данные, отправляемые в словарь и сериализовать словарь с NSJSONSerialization

let request = NSMutableURLRequest(URL: NSURL(string: "http://***************/register.php")!) 

let session = NSURLSession.sharedSession() 
let postData = ["username" : "JoeBloggs", "email" : "[email protected]", "password" : "12345"] 

do { 
    let jsonData = try NSJSONSerialization.dataWithJSONObject(postData, options: NSJSONWritingOptions()) 
    request.HTTPMethod = "POST" 
    request.setValue("\(jsonData.length)", forHTTPHeaderField:"Content-Length") 
    request.setValue("application/json", forHTTPHeaderField:"Accept") 
    request.setValue("application/json", forHTTPHeaderField:"Content-Type") 
    request.HTTPBody = jsonData 

    let task = session.dataTaskWithRequest(request) { (data, response, error) -> Void in 
    print(response) 
    let strData = NSString(data: data!, encoding: NSUTF8StringEncoding) 
    print(strData) 
    print(error) 

    } 
    task.resume() 
} catch let error as NSError { 
    print(error) 
} 
+0

Спасибо за ваш ответ. У меня было это первоначально, но у меня была такая же проблема, хотя у меня не было jsonData.length. Я попробую это снова сегодня вечером и посмотрю, сработает ли это. –

+0

Так что я пробовал это, и он все еще не работает. Интересно, если я напечатаю (jsonData), я получу это ---- <7b0a2020 22656d61 696c2220 3a20226a 6f654062 6c6f6767 732e636f 6d222c0a 20202270 61737377 6f726422 203a2022 31323334 35222c0a 20202275 7365726e 616d6522 203a2022 4a6f6542 6c6f6767 73220a7d>. Я думал, что данные Json должны быть удобочитаемыми? –

+0

no, 'jsonData' - это объект' NSData', такой как результат 'dataUsingEncoding:' – vadian

Смежные вопросы