swift对contentsFromUrl的奇怪反应

时间:2014-12-24 04:23:56

标签: php ios mysql swift nsdata

我的主人有一个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语句时,它没有收到任何内容:|

请帮助我,它让我疯狂:\

2 个答案:

答案 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)
            }
        }
    }
}