You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 20:46:04