繁体   English   中英

尝试使用Swift从PHP发送发布请求

[英]Trying to send a post request with PHP from swift

我正在尝试将用户输入(通过UISearchBar完成)发送到我的PHP文件,以通过商店名称数据库进行搜索。 但是,似乎我的$ _POST变量$ searchWord为空。

我的快速代码:

func searchBarSearchButtonClicked(_ searchBar: UISearchBar)
{
if(searchBar.text!.isEmpty)
{
    return
}
searchBar.resignFirstResponder()
doSearch(searchWord: searchBar.text!, searchbar: searchBar )

}
func doSearch(searchWord: String, searchbar: UISearchBar){

mysearchBar = searchbar

mysearchBar.resignFirstResponder()

let myURL = NSURL(string: "http://localhost:8080/searchStore.php")

var request = URLRequest(url:myURL! as URL)
request.httpMethod = "POST"
request.addValue("application/json", forHTTPHeaderField: "Content-Type")

print("name=\(searchWord)")

let postString = "name=\(searchWord)"
request.httpBody = postString.data(using: String.Encoding.utf8)
request.addValue("application/json", forHTTPHeaderField: "Accept")

let task = URLSession.shared.dataTask(with: request) { (data: Data?, response: URLResponse?, error: Error?) in

    DispatchQueue.main.async() {

        if error != nil{
            self.displayAlertMessage(userMessage: (error?.localizedDescription)!)
            return
        }
        do{
            var _: Error?
            //STOPPED HERE AS OF NOW
            let json = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as? NSDictionary

            self.results.removeAll(keepingCapacity: false)
            self.tableView.reloadData()

            if let parseJSON = json{
                print("json")
                if let stores = parseJSON["stores"] as? [AnyObject]{
                    print("stores")

                    for storeOjb in stores{
                        let name = (storeOjb["name"] as! String)
                        self.results.append(name)
                    }

                    self.tableView.reloadData()

                }else if(parseJSON["message"] != nil){
                    print("message")

                    let errorMessage = parseJSON["message"] as? String
                    if(errorMessage != nil){
                        self.displayAlertMessage(userMessage: errorMessage!)

                    }
                }
            }
        } catch {
            print(error)
        }
    }

}

task.resume()
}

func displayAlertMessage(userMessage: String)
{
    let myAlert = UIAlertController(title: "Alert", message: userMessage, preferredStyle: UIAlertControllerStyle.alert);
let okAction =  UIAlertAction(title: "Ok", style: UIAlertActionStyle.default, handler: nil)
myAlert.addAction(okAction);
self.present(myAlert, animated: true, completion: nil)
}

我的PHP文件

<?php
require("Conn.php");
require("MySQLDao.php");

$returnValue = array();



if(empty($_POST["name"])){
    $returnValue["message"]= "Missing required field";
    echo json_encode($returnValue);
    return;
}

$searchWord =htmlentities($_POST["name"]);

$dao = new MySQLDao(Conn::$dbhost, Conn::$dbuser, Conn::$dbpass, 
Conn::$dbname);
$dao->openConnection();

$storeNames = $dao->searchStore($name);
$dao->closeConnection();

$returnValue["stores"]=$storeNames;
echo json_encode($returnValue);
?>

类MySQLDao {

var $dbhost = null;
var $dbuser = null;
var $dbpass = null;
var $conn = null;
var $dbname = null;
var $result = null;
function __construct($dbhost, $dbuser, $dbpassword, $dbname) {
    $this->dbhost = $dbhost;
    $this->dbuser = $dbuser;
    $this->dbpass = $dbpassword;
    $this->dbname = $dbname;
}


public function openConnection() {
    $this->conn = new mysqli($this->dbhost, $this->dbuser, $this->dbpass, 
$this->dbname);
    if (mysqli_connect_errno())
        throw new Exception("Could not establish connection with database");
    $this->conn->set_charset("utf8");
}

public function closeConnection() {
    if ($this->conn != null)
        $this->conn->close();
}



public function searchStore($name){
    $returnValue =  array();
    $sql  = "SELECT * FROM stores s WHERE s.name LIKE ? ";
    $statement = $this->conn->prepare($sql);
    if(!$statement)
    throw new Exception($statement->error);
    $name = '%' .$name. "%";
    $result->bind_param("s", $name);
    $result->execute();
    $result = $statement->get_result();

while($myrow = $result->fetch_object())
{
    $returnValue[] = $myrow;
}

return $returnValue;
}


}
?>

Conn.php包含MySQL连接详细信息。

快速代码中的PostString可以正确显示用户输入的内容(我可以使用断点弄清楚它)。 但是,无论何时搜索任何内容,我都会收到一条警告消息,提示“缺少必填字段”,表明我的$ _POST变量$ searchWord为空。 有谁知道如何解决这个问题?

仅当请求内容类型为x-www-form-urlencoded时,才会填充PHP $_POST数组。

如果您正在从Swift应用application/json ,那么您将需要从php输入流中解析请求主体: php://input ,也可以使用STDIN常量。

但是,在我看来,您实际上打算发送x-www-form-urlencoded数据,因此请适当地更改内容类型。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM