使用 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 中的 PDO 将 xampp 连接到在线 MSSQL 数据库
将 JSON 从外部服务器连接到 Swift tableView