dongzhun8449 2018-12-02 18:08
浏览 83
已采纳

PHP没有从Swift接收POST数据

I'm trying to write to a database and not able to get POST data from Swift into PHP. I've checked everything along the way and the data is present in request.httpBody before sending the request, but I get this error "SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'order_id' cannot be null"

Also PHP prints an empty array of $request

Any help is appreciated. Racking my brain on this one! Here's the code

SWIFT:

    func saveNewProduct(product: ProductClass) {

    //declare parameter as a dictionary which contains string as key and value combination.
    let productDict: [String:Any] = ["order_id": product.order_id!,
                                     "product_sku": product.product_sku!,
                                     "product_description": product.product_description!,
                                     "product_base_price": product.product_base_price!,
                                     "product_price": product.product_price!,
                                     "product_min_qty": product.product_min_qty!,
                                     "product_qty": product.product_qty!,
                                     "product_subtotal": product.product_subtotal!,
                                     "product_imageURL": product.product_imageURL!]

    let urlString: String = "https://www.mywebsite.com/dbinsertproduct.php"
    guard let url = URL(string: urlString) else {
        print("Error: cannot create URL")
        return
    }

    //create the session object
    let session = URLSession.shared

    //create the URLRequest object using the url object
    var request = URLRequest(url: url)
    //set http method as POST
    request.httpMethod = "POST"

    do {
        request.httpBody = try? JSONSerialization.data(withJSONObject: productDict, options: .prettyPrinted)
    } catch let error {
        print(error.localizedDescription)
    }

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

    let task = session.dataTask(with: request, completionHandler: {
    data,response,error in

        guard error == nil else {
            return
        }

        guard let data = data else {
            return
        }

        do {
            //create json object from data
            if let json = try JSONSerialization.jsonObject(with: data, options: .mutableContainers) as? [String: Any] {
                print(json)
                // handle json...
            }
        } catch let error {
            print(error.localizedDescription)
        }
    })
    task.resume()
}

PHP:

    <?php include("dbclass.php"); ?>

    <?php
    $postdata = file_get_contents("php://input");
    $request = json_decode($postdata, true);

    $newProduct = new DBConnector('mysql.mysite.com', 'username', 'password', 'mysiteorders');
    $p = $newProduct->dbInsertProduct($request);

    error_log($p);
    echo ($p);
    ?>

More PHP:

    public function dbInsertProduct($request)
    {

          try {

            $stmt = $this->prepare("INSERT INTO `products` (`order_id`,`product_sku`,`product_description`,`product_base_price`,`product_price`,`product_notes`,`product_min_qty`,`product_qty`,`product_subtotal`,`product_imageURL`) VALUES (:order_id,:product_sku,:product_description,:product_base_price,:product_price,:product_notes,:product_min_qty,:product_qty,:product_subtotal,:product_imageURL);");

            $stmt->bindParam(':order_id', $request['order_id']);
            $stmt->bindParam(':product_sku', $request['product_sku']);
            $stmt->bindParam(':product_description', $request['product_description']);
            $stmt->bindParam(':product_base_price', $request['product_base_price']);
            $stmt->bindParam(':product_price', $request['product_price']);
            $stmt->bindParam(':product_notes', $request['product_notes']);
            $stmt->bindParam(':product_min_qty', $request['product_min_qty']);
            $stmt->bindParam(':product_qty', $request['product_qty']);
            $stmt->bindParam(':product_subtotal', $request['product_subtotal']);
            $stmt->bindParam(':product_imageURL', $request['product_imageURL']);

            error_log( print_r($request, TRUE) );

            $stmt->execute();

          } catch(PDOException $e) {
            error_log($e->getMessage());
            echo json_encode($e->getMessage());
          }
      }

UPDATE:

The request shows up as GET, not POST (verified with Charles proxy). As you can see in the code, I'm setting request.httpMethod = "POST". Am I missing something else??

  • 写回答

1条回答 默认 最新

  • douchensou6495 2018-12-09 04:48
    关注

    I found that the POST was being changed to GET upon redirect from www.mysite.com to mysite.com. Removing the 'www' did the trick.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥50 unitywebrequest分段下载导致报错,如何解决?
  • ¥15 错误使用 gretna_GUI_PreprocessInterface>RunBtn_Callback
  • ¥15 WPF如何用Chart绘画出Y轴的左边数据
  • ¥15 pycharm无法查看内置代码
  • ¥15 跑hls xfopencv的例程standalone_hls_axi_example出的错误,csim没问题,c synthesis出的错误
  • ¥15 sqlserver update语句逐行生效
  • ¥20 Windows10系统命令行调用
  • ¥15 php环境如何实现国密SM2相关功能
  • ¥15 关于#单片机#的问题:K210 例程里面提示我iomem.h: No such file or directory
  • ¥15 LSPI算法的大问题