Php POST无法正常工作

Php POST无法正常工作,php,ios,mysql,swift,Php,Ios,Mysql,Swift,我在使用Swift 3.0的Xcode上遇到了一个问题,我想用php将信息存储在mysql数据库中。php代码已到达,但插入请求总是返回失败。我不知道,它在安卓上运行得很好。这是我的密码: 斯威夫特: @IBAction func SignUp(_ sender: UIButton) { var Name1: String = Name.text! var Prenom: String = PRENAME.text! var add: String = Addr.text

我在使用Swift 3.0的Xcode上遇到了一个问题,我想用php将信息存储在mysql数据库中。php代码已到达,但插入请求总是返回失败。我不知道,它在安卓上运行得很好。这是我的密码:

斯威夫特:

@IBAction func SignUp(_ sender: UIButton) {
    var Name1: String = Name.text!
    var Prenom: String = PRENAME.text!
    var add: String = Addr.text!
    var code:String = CP.text!
    var mail:String = Email.text!
    var pass:String = password.text!


    var request = URLRequest(url: URL(string: "http://www.example.com/myscript.php")!)
    request.httpMethod = "POST"
    let postString = "name=\(Name1)&pname=\(Prenom)&add=\(add)&pc=\(code)&mail=\(mail)&pass=\(pass)"
    request.httpBody = postString.data(using: .utf8)
    let task = URLSession.shared.dataTask(with: request) { data, response, error in
        guard let data = data, error == nil else {                                                 // check for fundamental networking error
            print("error=\(error)")
            return
        }

        if let httpStatus = response as? HTTPURLResponse, httpStatus.statusCode != 200 {           // check for http errors
            print("statusCode should be 200, but is \(httpStatus.statusCode)")
            print("response = \(response)")
        }

        let responseString = String(data: data, encoding: .utf8)
        print("responseString = \(responseString)")
    }
    task.resume()
}
和我的PHP代码:

<?php

$reponse = array();



$pseudo = $_POST['name'];
$score = $_POST['pname'];
$add =  $_POST['add'];
$pc = $_POST['pc'];
$mail = $_POST['mail'];
$password = $_POST['pass'];
$mysqli = new MySQLi("host","root","pass","user");

$result = $mysqli->query("INSERT INTO compte (Name,Name2,Ad,code,maiil,pass) VALUES('$pseudo','$score','$add','$pc','$mail','$password')");
if ($mysqli->connect_error){
    die('Connect Error (' . $mysqli->connect_errno . ') '
        . $mysqli->connect_error);
}
if($result){

    $response["success"] = 1;
    $response["message"] = "SUCCESS!";

    echo json_encode($response);
}
else{
    $response["success"] = 0;
    $response["message"] = "FAILURE!";

    echo json_encode($response);
}

不要忘记将此添加到info.plist

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>
NSAppTransportSecurity
NSAllowsArbitraryLoads
因此,您可以触发http或https请求


--确保您的任何参数都不包含&so value可以成功发送,或者用%26替换它。对不起,我的错误一切正常,通过执行sqli->错误,我发现了错误,我忘记了我不允许在数据库中复制邮件。所以非常感谢大家。祝你周末愉快

几点想法:

  • 失败时,您应该将
    消息设置为
    $mysqli->error
    ,而不是只设置
    “failure!”
    ,以便查看失败的原因

  • 我建议在尝试查询之前,先移动“连接是否失败”逻辑。我还建议您将此更改为输出JSON,表示连接失败并退出,而不是仅执行
    die
    。稍后,当您改进Swift代码以解析错误时,将所有服务器消息保留为JSON将非常有用

  • 您应该更改PHP以使用转义参数。如果没有,如果任何值包含
    字符,则SQL将失败。(您也容易受到SQL注入攻击。)

  • 您应该将Swift更改为转义请求的
    httpBody
    中包含的值的百分比。有关示例,请参见。或者使用类似Alamofire的东西来为您解决这个问题。但事实上:

    • 如果这些值中的任何一个包含
      +
      字符,则可能会用空格替换

    • 如果这些值中的任何一个包含
      &
      字符,它将截断该字段

    • 如果这些值中的任何一个包含任何其他保留字符,则整个查询可能会失败

  • 虽然不是必要的,但我建议:

    • 在Swift代码中,将请求的
      内容类型
      标题设置为
      application/x-www-form-urlencoded
      ,将请求的
      接受
      标题设置为
      application/json

      request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
      request.setValue("application/json", forHTTPHeaderField: "Accept")
      
    • 在PHP代码中,在
      echo
      json之前,将
      Content-Type
      标题设置为
      application/json

      header("Content-Type: application/json");
      
      虽然这是可选的,但如果您以后采用类似Alamofire的库来对这些标准头执行验证,这将使您的生活更加轻松


  • 很抱歉,我的url是100%正确的,我正确地键入了Xcode,但出于保密目的,我使用myscript.php,而且,我在问题中告诉您,php代码已达到,但它总是返回失败。请参阅更新。我在info.plisty中这样做了。您的insert中有拼写错误,maiil
    (姓名、姓名2、广告、代码、maiil、通行证)
    应用程序没有告诉我问题是什么,问题是有时数据库中的插入工作正常,但有时不正常。所以我完全迷路了…老兄,我在帖子中告诉它,它在我的Android设备上运行良好,所以不会是输入错误。失败时,你可以查询,你没有返回错误代码,所以你就瞎了眼。我建议返回
    $mysqli->error
    ,而不是只返回
    “FAILURE!”
    ,这样您就可以看到它失败的原因了。另外,在执行查询之前,应该先对失败的连接进行测试。非常感谢!我已经忘记了我不会让我的数据库中的邮件重复,一切都很好,它的工作完美,谢谢!