如何在Swift Playgrounds中向phpMyAdmin数据库提交表单数据?
Swift Playgrounds表单数据提交到phpMyAdmin数据库问题
我正在用Swift Playgrounds开发应用,做了一个用户填写的表单:
Form { TextField("Email", text: $email) .disableAutocorrection(true) SecureField("Password", text: $userpassword) .disableAutocorrection(true) }
点击提交按钮时能触发函数,但函数内部逻辑有问题。我想把用户填的邮箱和密码提交到phpMyAdmin数据库,试过IP地址等方法都没解决,当前函数代码如下:
func insertSignUpDataIntoDatabase(email: String, userpassword: String) { guard let url = URL(string: "") else{ return } let body = "Email\(email)&Password\(userpassword)" let finalBody = body.data(using: .utf8) var request = URLRequest(url: url) request.httpMethod = "POST" request.httpBody = finalBody URLSession.shared.dataTask(with: request){ (data, response, error) in print(response as Any) if let error = error { print(error) return } guard let data = data else{ return } print(data, String(data: data, encoding: .utf8) ?? "*unknown encoding*") }.resume() }
我需要实现以下两种方案之一:
- a) 直接从Swift Playgrounds把邮箱和密码提交到phpMyAdmin数据库
- b) 调用我写好的PHP脚本,把这两个字段作为变量传入
我是Swift新手,需要详细指导和解释。另外有资料说直接提交不可行,请问要不要换数据库?需要的话请推荐。
解决方案
关于方案a:直接提交到phpMyAdmin不可行
phpMyAdmin是数据库管理工具,不是提供数据接口的服务,直接从Swift调用它提交数据完全不现实,而且极度不安全(会暴露数据库账号密码,还容易被SQL注入攻击),所以这个方案直接放弃。
方案b:调用PHP脚本(推荐实现方式)
这是Web开发中标准的前后端交互方式,步骤如下:
1. 修正Swift端的请求代码
你的当前代码有两个关键问题:
- URL为空,需要替换成你的PHP脚本的公网可访问地址(比如
http://你的服务器IP/insert_user.php) - POST请求的Body格式错误,应该用
key=value的格式,并且要对参数做URL编码避免特殊字符报错
修正后的Swift代码:
func insertSignUpDataIntoDatabase(email: String, userpassword: String) { // 替换成你的PHP脚本实际地址 guard let url = URL(string: "http://你的服务器IP/insert_user.php") else { print("无效的URL") return } // 对参数进行URL编码,避免特殊字符(比如@、&)导致请求错误 guard let encodedEmail = email.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed), let encodedPassword = userpassword.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else { print("参数编码失败") return } // 正确的POST Body格式:key1=value1&key2=value2 let body = "email=\(encodedEmail)&password=\(encodedPassword)" guard let finalBody = body.data(using: .utf8) else { print("Body转换失败") return } var request = URLRequest(url: url) request.httpMethod = "POST" // 设置Content-Type,告诉PHP服务器这是表单数据 request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type") request.httpBody = finalBody URLSession.shared.dataTask(with: request) { data, response, error in if let error = error { print("请求错误:\(error.localizedDescription)") return } // 打印响应状态码,方便排查问题(比如404是脚本不存在,500是PHP代码错误) if let httpResponse = response as? HTTPURLResponse { print("响应状态码:\(httpResponse.statusCode)") } guard let data = data else { print("未收到响应数据") return } // 打印PHP返回的内容,方便调试 if let responseString = String(data: data, encoding: .utf8) { print("服务器响应:\(responseString)") } }.resume() }
2. 编写/修正PHP脚本(insert_user.php)
确保你的PHP脚本部署在有公网IP的服务器上,并且已经配置好MySQL(phpMyAdmin管理的就是MySQL数据库)连接。以下是基础的PHP代码示例:
<?php // 1. 数据库连接信息(替换成你的实际信息) $servername = "localhost"; // 通常是localhost,因为PHP和MySQL在同一服务器 $username = "你的数据库用户名"; $password = "你的数据库密码"; $dbname = "你的数据库名称"; // 2. 连接数据库 $conn = new mysqli($servername, $username, $password, $dbname); if ($conn->connect_error) { die("数据库连接失败: " . $conn->connect_error); } // 3. 获取Swift传来的POST参数 $email = $_POST['email'] ?? ''; $password = $_POST['password'] ?? ''; // 4. 验证参数是否为空 if (empty($email) || empty($password)) { echo "错误:邮箱或密码不能为空"; $conn->close(); exit; } // 5. 密码必须加密存储!绝对不能明文存密码! $hashedPassword = password_hash($password, PASSWORD_DEFAULT); // 6. 准备SQL语句(用预处理语句防止SQL注入) $stmt = $conn->prepare("INSERT INTO users (email, password) VALUES (?, ?)"); $stmt->bind_param("ss", $email, $hashedPassword); // "ss"表示两个字符串参数 // 7. 执行并返回结果 if ($stmt->execute()) { echo "用户注册成功"; } else { echo "注册失败: " . $stmt->error; } // 8. 关闭连接 $stmt->close(); $conn->close(); ?>
注意事项:
- 必须创建
users表,结构至少包含email(建议加唯一约束,防止重复注册)和password字段 - 绝对不要明文存储密码,必须用
password_hash加密 - 使用预处理语句防止SQL注入攻击
3. 调试步骤
- 先在浏览器里直接访问PHP脚本地址,看是否能正常返回(比如返回"错误:邮箱或密码不能为空")
- 检查服务器的防火墙,确保开放了80端口(HTTP)
- 在Swift Playgrounds里运行代码,查看控制台的打印信息,根据状态码和响应内容排查问题
关于数据库是否需要更换
不需要换数据库,phpMyAdmin只是MySQL的管理工具,你实际用的是MySQL数据库,这是非常成熟的方案,完全满足你的需求。如果后续需要更轻量的本地存储方案,可以考虑SQLite,但如果是需要多设备同步数据,MySQL依然是合适的选择。
内容的提问来源于stack exchange,提问作者Pratyush
相关产品推荐
相关产品推荐

