正在向 PHP 服务器发送数据
Sending data to PHP server
我正在尝试设置将数据发送到 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代码
let request = NSMutableURLRequest(URL: NSURL(string: "http://***************/register.php")!)
let session = NSURLSession.sharedSession()
request.HTTPMethod = "POST"
let data = "username=JoeBloggs&email=joe@bloggs.com&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 都返回空数组。
我做错了什么?
错误清楚地表明您的 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);
}
注意:未测试,但应该可以。
找到问题了。
这些行似乎是我应用程序中的罪魁祸首。
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
request.addValue("application/json", forHTTPHeaderField: "Accept")
当我删除它们时它工作正常。
这又引出了另一个问题,我如何设置 PHP 以接受 header 类型 "application/json"?
要使用 POST 将 JSON 发送到服务器,您必须将要发送的数据放入字典中并使用 NSJSONSerialization
序列化字典
let request = NSMutableURLRequest(URL: NSURL(string: "http://***************/register.php")!)
let session = NSURLSession.sharedSession()
let postData = ["username" : "JoeBloggs", "email" : "joe@bloggs.com", "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)
}
所以我遵循了@vadian 的回答,但最初没有用。我研究了为什么 PHP 不接受 application/json.
我通过在 php 文件中使用 $HTTP_RAW_POST_DATA 而不是 $_POST 或 $_REQUEST 使其工作。
但是! $HTTP_RAW_POST_DATA 现在已折旧,但以下代码有效
$json = file_get_contents('php://input');
$obj = json_decode($json);
对我来说似乎是 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代码
let request = NSMutableURLRequest(URL: NSURL(string: "http://***************/register.php")!)
let session = NSURLSession.sharedSession()
request.HTTPMethod = "POST"
let data = "username=JoeBloggs&email=joe@bloggs.com&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 都返回空数组。
我做错了什么?
错误清楚地表明您的 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);
}
注意:未测试,但应该可以。
找到问题了。
这些行似乎是我应用程序中的罪魁祸首。
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
request.addValue("application/json", forHTTPHeaderField: "Accept")
当我删除它们时它工作正常。
这又引出了另一个问题,我如何设置 PHP 以接受 header 类型 "application/json"?
要使用 POST 将 JSON 发送到服务器,您必须将要发送的数据放入字典中并使用 NSJSONSerialization
let request = NSMutableURLRequest(URL: NSURL(string: "http://***************/register.php")!)
let session = NSURLSession.sharedSession()
let postData = ["username" : "JoeBloggs", "email" : "joe@bloggs.com", "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)
}
所以我遵循了@vadian 的回答,但最初没有用。我研究了为什么 PHP 不接受 application/json.
我通过在 php 文件中使用 $HTTP_RAW_POST_DATA 而不是 $_POST 或 $_REQUEST 使其工作。
但是! $HTTP_RAW_POST_DATA 现在已折旧,但以下代码有效
$json = file_get_contents('php://input');
$obj = json_decode($json);
对我来说似乎是 PHP 破解,但至少它有效。