我的主人有一个php文件。我用它来访问mySQL数据库。
我有两个php文件,一个用于 INSERT ,另一个用于 SELECT 。当我在浏览器中使用url时,两者都有效。
domain.com/insert.php?query=insert%20into%20user%20(user,pass,email,phone)%20values('test','test','test','test');
domain.com/select.php?query=SELECT%20`id`%20FROM%20`user`%20WHERE%20user%20=%20'user'%20and%20pass%20=%20'pass';
在浏览器中使用它们时都能正常工作。我有一个快速的应用程序,通过contentsFromUrl
的php文件发送和接收数据。
let strURL = "http://domain.com/insert.php?query=insert%20into%20user%20(user,pass,email,phone)%20values('test','test','test','test');"
var dataURL = NSData(contentsOfURL: NSURL(string: strURL)!);
这可以正常工作,我可以轻松地将数据插入我的数据库。 我有另一个使用url从数据库中选择数据的代码。也是这样。
let strURL = "http://domain.com/select.php?query=SELECT%20`id`%20FROM%20`user`%20WHERE%20user%20=%20'user'%20and%20pass%20=%20'pass';"
var dataURL = NSData(contentsOfURL: NSURL(string: strURL)!);
当我运行此代码时,它会显示fatal error: unexpectedly received nil
当我从我的swift代码中复制这个url并将其粘贴到我的浏览器中时,它会正确执行并提供我想要的数据!!
纯粹的愚蠢,我的意思是字符串之间有什么区别?两个php文件都返回一个字符串,但似乎当我使用select语句时,它没有收到任何内容:|
请帮助我,它让我疯狂:\
答案 0 :(得分:1)
网址必须以其协议(http或https)开头。使用第二个URL的初始化返回nil,并且您强行打开它:NSURL(string: strURL)!
。这就是你遇到崩溃的地方。它返回nil,因为它没有传递有效的URL。
添加" http://"到URL的开头,它将起作用:
let strURL = "http://domain.com/select.php?query=SELECT%20`id`%20FROM%20`user`%20WHERE%20user%20=%20'user'%20and%20pass%20=%20'pass';"
var dataURL = NSData(contentsOfURL: NSURL(string: strURL)!);
注意:此网址在您的浏览器中有效,因为浏览器很好并假设" http"如果你没有指定协议。
答案 1 :(得分:0)
您需要使用stringByAddingPercentEncoding验证您的链接:
let strLink = "http://domain.com/select.php?query=SELECT%20`id`%20FROM%20`user`%20WHERE%20user%20=%20'user'%20and%20pass%20=%20'pass';"
let linkComponents = strLink.componentsSeparatedByString("?")
if let query = linkComponents.last?.stringByRemovingPercentEncoding {
print(query) // "query=SELECT `id` FROM `user` WHERE user = 'user' and pass = 'pass';"
if let queryPercentEncoded = query.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLQueryAllowedCharacterSet()) {
print(queryPercentEncoded) // "query=SELECT%20%60id%60%20FROM%20%60user%60%20WHERE%20user%20=%20'user'%20and%20pass%20=%20'pass';"
let linkPercentEncoded = (linkComponents.first ?? "") + "?" + queryPercentEncoded
if let strURL = NSURL(string: linkPercentEncoded ) {
print(true)
// note you should download your data asynchronously using NSURLSession dataTaskFromURL
if let data = NSData(contentsOfURL: strURL) {
print(data.length)
}
}
}
}