使用 PHP 从 Swift 连接到在线数据库 (mySQL)。 (XCODE)

Posted

技术标签:

【中文标题】使用 PHP 从 Swift 连接到在线数据库 (mySQL)。 (XCODE)【英文标题】:Connect to an online database (mySQL) from Swift, using PHP. (XCODE) 【发布时间】:2015-03-31 08:31:28 【问题描述】:

我想将我的 xcode 应用程序连接到在线数据库并从中获取数据并显示在我的应用程序中 + 使用我的应用程序将数据写入在线数据库。我已经完成了应用程序,但现在它给了我一个错误。

错误:

我的网页中有我的在线数据库,并且我已将两个 php 文件上传到我网站的文件管理器中。一个 php 文件检索我数据库中的所有数据并将它们编码为 json。第二个 php 文件执行查询以从我的应用程序将数据写入我的在线数据库。

如上图所示,我成功地获得了 json 输出,但是当我尝试将数据放入 xcode 中的数组时,它给了我这个错误。

这是我的代码

import UIKit

class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate 

    @IBOutlet var tableview: UITableView!
    @IBOutlet var inputFriendName: UITextField!
    @IBOutlet var inputFriendInfo: UITextField!

    var data: NSArray = []

    override func viewDidLoad() 
        super.viewDidLoad()
        data = dataOfJson("http://bishanonline.com/extra/serviceselect.php")
        println(data)

    

    @IBAction func reload() 
        data = dataOfJson("http://bishanonline.com/extra/serviceselect.php")
        self.tableview.reloadData()
    

    override func touchesBegan(touches: NSSet, withEvent event: UIEvent) 
        self.view.endEditing(true)
    

    func dataOfJson(url: String) -> NSArray 
        var data = NSData(contentsOfURL: NSURL(string: url)!)
        return (NSJSONSerialization.JSONObjectWithData(data!, options: nil, error: nil) as NSArray)
    

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        return data.count
    

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
        var cell: additionInfoCell = self.tableview.dequeueReusableCellWithIdentifier("customCell") as additionInfoCell
        var maindata = (data[indexPath.row] as NSDictionary)
        cell.friendName!.text = maindata["Name"] as? String
        cell.friendInfo!.text = maindata["Additional Info"] as? String
        return cell
    

    @IBAction func uploadToDatabase() 
        var url: NSString = "http://bishanonline.com/extra/servicequery.php?x=\(inputFriendName.text)&y=\(inputFriendInfo.text)"
        url = url.stringByReplacingOccurrencesOfString(" ", withString: "%20")
        url = url.stringByReplacingOccurrencesOfString("/n", withString: "%0A")
        var data = NSData(contentsOfURL: NSURL(string: url)!)
        var result = NSString(data: data!, encoding: NSUTF8StringEncoding)
    

    override func didReceiveMemoryWarning() 
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    

问题出在此代码行中

 func dataOfJson(url: String) -> NSArray 
    var data = NSData(contentsOfURL: NSURL(string: url)!)
    return (NSJSONSerialization.JSONObjectWithData(data!, options: nil, error: nil) as NSArray)

请帮我将 json 数据放入数组中。感谢任何帮助。

【问题讨论】:

您的网站没有在浏览器中打开。请解决然后评论我会在您网站的链接测试后给您代码 @Johnny 这里是正确的链接bishanonline.com/extra/serviceselect.php bishanonline.com/extra/servicequery.php 抱歉链接我也更新了代码。感谢任何帮助。 这是我在 xcode 中得到的响应。如您所见,其中有一些额外的脚本文件,请删除它以便只打印 json 响应。可选(["Name":"Bishan","Additional Info":"MainDeveloper","Name":"AkilaPrabath","Additional Info":"BestBuddy"] ) 删除这个 ; @Johnny 在我的 php knw 中没有这样的代码行! 【参考方案1】:

终于问题解决了。首先我将详细说明确切的问题,然后将发布解决方案。 你正在做的代码完全没问题,但真正的问题是你的后端

对于 serviceselect.php

你为获取记录所做的代码是

func dataOfJson(url: String) -> NSArray 

   var data = NSData(contentsOfURL: NSURL(string: url)!)
   return (NSJSONSerialization.JSONObjectWithData(data!, options: nil, error: nil) as NSArray)

This above method is returing NSArray but the data you are getting from the server is kinda messed up because along with JSON data some garbage data is included as well.Check out the below image

因此,当尝试从上述字符串生成 JSON 数据时,我们会遇到崩溃和错误。 可能是由于免费托管服务,我们收到此消息(不确定)

解决方案

   func getallrecords()
    let url = NSURL(string: "http://bishanonline.com/extra/serviceselect.php")
    let task = NSURLSession.sharedSession().dataTaskWithURL(url!) (data, response, error) in
        var d = NSString(data: data, encoding: NSUTF8StringEncoding)
        var arr = d!.componentsSeparatedByString("<") // spliting the incoming string from "<" operator because before that operator is our required data and storing in array
        var dataweneed:NSString = arr[0] as NSString // arr[0] is the data before "<" operator and arr[1] is actually no use for us
         if let data = NSJSONSerialization.JSONObjectWithData(dataweneed.dataUsingEncoding(NSUTF8StringEncoding)!, options: NSJSONReadingOptions.MutableContainers, error: nil) as? NSArray

// JSONObjectWithData 的第一个参数总是 NSData 但我们的 dataweneed 实际上是 NSString 所以我们实际上是在将 NSString 转换为 NSData

   
            for dd in data
                var name : String = dd["Name"]! as String
                var info : String = dd["Additional Info"]! as String
                println("Name is : \(name)") // MainDeveloper for 0 and BestBuddy for 1 index
                println("Info is : \(info)") // Bishan for 0 and AkilaPrabath for 1 index
     
        
    

    task.resume()
    

最终输出

对于servicequery.php

   func addrecord(x:String,y:String)
   let request = NSMutableURLRequest(URL: NSURL(string: "http://bishanonline.com/extra/servicequery.php")!)
            var postString : String = "x="+x+"&y="+y
            request.HTTPMethod = "GET"
            request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding)
            let task = NSURLSession.sharedSession().dataTaskWithRequest(request) 
                data, response, error in

                if error != nil 
                    println("error=\(error)")
                    return
                


                let jsonResult = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: nil) as NSDictionary

                if jsonResult as String == "Successfully added "
                
                 // Show an alert to notify user
                
           
            task.resume()
           

同时删除“echo $query;”在 servicequery.php 的第 30 行

【讨论】:

非常感谢@johnny 它的工作!但实际上就像在我的代码中一样,我想从 getallrecords 函数返回 NSArray 。你能建议我一种方法吗?我不擅长这个:) 我正在将 url 从 viewDidLoad 发送到 getallrecords() 方法。这是代码: override func viewDidLoad() super.viewDidLoad() data = getallrecords("bishanonline.com/extra/serviceselect.php") println(data) 并且 getallrecords 必须返回 NSArray cus 我想将结果放入 var data: NSArray = []你能建议我一个合适的方法吗? 我的“让数据”也是一个数组,然后我只是循环遍历它。你必须做同样的事情。简单地从这个函数返回数据变量并循环它【参考方案2】:

试试这段代码从服务器解析 JSON

//created NSURL
let requestURL = NSURL(string: URL_GET_TEAMS)


//creating NSMutableURLRequest
let request = NSMutableURLRequest(URL: requestURL!)

//setting the method to post
request.HTTPMethod = "GET"

//creating a task to send the post request
let task = NSURLSession.sharedSession().dataTaskWithRequest(request)
    data, response, error in

    //exiting if there is some error
    if error != nil
        print("error is \(error)")
        return;
    

    //parsing the response
    do 
        //converting resonse to NSArray
        let myJSON =  try NSJSONSerialization.JSONObjectWithData(data!, options: .MutableContainers) as? NSArray


        //looping through all the json objects in the array teams
        for i in 0 ..< myJSON.count

            myJSON[i]["object key here"]
        

     catch 
        print(error)
    

//executing the task
task.resume()

来源:json parsing in ios swift

【讨论】:

以上是关于使用 PHP 从 Swift 连接到在线数据库 (mySQL)。 (XCODE)的主要内容,如果未能解决你的问题,请参考以下文章

Java - 使用 JDBC 连接到在线 MySQL 数据库时出现问题

使用 PHP 连接到 Facebook 聊天?

通过 php 中的 PDO 将 xampp 连接到在线 MSSQL 数据库

将 JSON 从外部服务器连接到 Swift tableView

如何从 Spring Boot 连接到在线 MongoDB 数据库?

使用 Node JS 连接到在线托管的 PostgreSQL