• [PHP]关联和操作MySQL数据库然后将数据库部署到ECS


    在Mac电脑上使用VS Code进行PHP开发并关联操作MySQL数据库,然后将数据库部署到ECS。

    1.安装PHP和MySQL

    确保你的Mac上已经安装了PHP和MySQL。你可以使用Homebrew来安装它们:

    1. $ brew install php
    2. $ brew install mysql

    安装mysql完成后记住这一句:

    1. MySQL is configured to only allow connections from localhost by default
    2. To connect run:
    3.     mysql -u root

    使用以下命令查询安装情况:

    1. $ php -v
    2. $ mysql --version

    启动MySQL服务:

    $ brew services start mysql

    重启MySQL服务:

    $ brew services restart mysql

    停止MySQL服务:

    $ brew services stop mysql

    2.创建MySQL用户、数据库和权限

    登录到MySQL:

    1. // 无密码直接用这一句登录
    2. $ mysql -u root
    3. // 也可以用这指令,输密码是直接回车跳过就是
    4. $ mysql -u root -p

    创建新数据库:

    $ CREATE DATABASE mydatabase;

    创建新用户并设置密码(替换myuser和mypassword为你自己的设置):

    $ CREATE USER'myuser'@'localhost' IDENTIFIED BY'mypassword';

    授权新用户访问数据库:

    $ GRANT ALL PRIVILEGES ON mydatabase.*TO'myuser'@'localhost';

    刷新权限:

    $ FLUSH PRIVILEGES;

    退出MySQL:

    $ EXIT;

    3.配置PHP连接MySQL

    你需要在PHP代码中使用PDO或mysqli扩展来连接MySQL数据库

    确保你的MySQL服务正在运行,并且你已经创建了相应的用户、数据库和权限。

    1).PDO

    1. $host = '127.0.0.1';
    2. $db   = 'your_database';
    3. $user = 'your_username';
    4. $pass = 'your_password';
    5. $charset = 'utf8mb4';
    6. $dsn = "mysql:host=$host;dbname=$db;charset=$charset";
    7. $options = [
    8.     PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    9.     PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    10.     PDO::ATTR_EMULATE_PREPARES  => false,
    11. ];
    12. try {
    13.     $pdo = new PDO($dsn, $user, $pass, $options);
    14. } catch (\PDOException $e) {
    15.     throw new \PDOException($e->getMessage(), (int)$e->getCode());
    16. }
    17. ?>

    2).mysqli扩展

    1. // 数据库连接配置
    2. $host = 'localhost';
    3. $dbname = 'mydatabase';
    4. $username = 'myusername';
    5. $password = 'mypassword';
    6. // 创建 mysqli 连接对象
    7. $conn = new mysqli($host, $username, $password, $dbname);
    8. // 检查连接是否成功
    9. if ($conn->connect_error) {
    10.     die("连接失败: " . $conn->connect_error);
    11. }
    12. // 执行查询语句
    13. $query = "SELECT * FROM users";
    14. $result = $conn->query($query);
    15. // 处理结果集
    16. if ($result->num_rows > 0) {
    17.     while ($row = $result->fetch_assoc()) {
    18.         echo $row['username'] . "
      "
      ;
    19.     }
    20. } else {
    21.     echo "没有结果";
    22. }
    23. // 关闭数据库连接
    24. $conn->close();
    25. ?>

    4.在VS Code中编写和运行PHP代码

    注意:使用Launch Built-in web server配置运行时,需要将"localhost:0"改成其它端口,不然每次运行都会随机生成端口号,很不方便。

    Demo:https://github.com/Gamin-fzym/php_test_demo

    index.html

    城市信息表单

    1. html>
    2. <html>
    3. <head>
    4. <title>城市信息表单title>
    5. head>
    6. <body>
    7. <h1>城市信息表单h1>
    8. <form action="http://localhost:8080/city.php" method="post">
    9. <label for="cityName">城市名称:label>
    10. <input type="text" id="name" name="name" required><br><br>
    11. <label for="cityCode">城市编码:label>
    12. <input type="text" id="code" name="code" required><br><br>
    13. <label for="cityCode">增删改查:label>
    14. <input type="text" id="mark" name="mark" required><br><br>
    15. <input type="submit" value="提交">
    16. form>
    17. <p id="jsonResponse">p>
    18. <script>
    19. document.querySelector('form').addEventListener('submit', function (event) {
    20. event.preventDefault();
    21. // 方式一:PHP 中使用这种方式获取 $name = $_POST['name'] ?? '';
    22. var form = event.target;
    23. var formData = new FormData(form);
    24. fetch(form.action, {
    25. method: 'POST',
    26. body: formData
    27. })
    28. .then(response => response.json())
    29. .then(data => {
    30. document.getElementById('jsonResponse').textContent = JSON.stringify(data);
    31. })
    32. .catch(error => console.error('请求接口失败', error));
    33. /*
    34. // 方式二:PHP中用这种方式获取 $data = json_decode(file_get_contents('php://input'), true); $name = $data['name'] ?? '';
    35. var form = event.target;
    36. var name = form.elements.name.value;
    37. var code = form.elements.code.value;
    38. var mark = form.elements.mark.value;
    39. var requestData = {
    40. name: name,
    41. code: code,
    42. mark: parseInt(mark) // mark 1:增 2:删 3:改 4:查
    43. };
    44. var xhr = new XMLHttpRequest();
    45. xhr.open('POST', form.action);
    46. xhr.setRequestHeader('Content-Type', 'application/json');
    47. // xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    48. xhr.onload = function () {
    49. if (xhr.status === 200) {
    50. var data = JSON.parse(xhr.responseText);
    51. document.getElementById('jsonResponse').textContent = JSON.stringify(data);
    52. } else {
    53. console.error('请求接口失败');
    54. }
    55. };
    56. xhr.send(JSON.stringify(requestData));
    57. */
    58. });
    59. script>
    60. body>
    61. html>

    pdoConnect.php

    PDO连接MySQL封装

    1. $host = '127.0.0.1';
    2. $db = 'city_database';
    3. $user = 'gamin';
    4. $pass = '123456';
    5. $charset = 'utf8mb4';
    6. $dsn = "mysql:host=$host;dbname=$db;charset=$charset";
    7. $options = [
    8. PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
    9. PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    10. PDO::ATTR_EMULATE_PREPARES => false,
    11. ];
    12. // 连接数据库
    13. try {
    14. $pdo = new PDO($dsn, $user, $pass, $options);
    15. createCitiesTable();
    16. } catch (\PDOException $e) {
    17. throw new \PDOException($e->getMessage(), (int)$e->getCode());
    18. }
    19. // 创建城市表
    20. function createCitiesTable() {
    21. $tb_name = "cities";
    22. // 检查表是否已存在
    23. $isTableExists = checkTableExists($tb_name);
    24. if (!$isTableExists) {
    25. // 创建表
    26. $sql = "CREATE TABLE $tb_name (
    27. id INT AUTO_INCREMENT PRIMARY KEY,
    28. name VARCHAR(255) NOT NULL,
    29. code INT NOT NULL
    30. )";
    31. global $pdo;
    32. $pdo->exec($sql);
    33. } else {
    34. }
    35. }
    36. // 检查表是否存在
    37. function checkTableExists($tableName) {
    38. global $pdo;
    39. $stmt = $pdo->query("SHOW TABLES LIKE '$tableName'");
    40. return $stmt->rowCount() > 0;
    41. }
    42. ?>

    sqlOperation.php

    操作封装

    1. require "pdoConnect.php";
    2. function pdo() {
    3. global $pdo;
    4. if (isset($pdo)) {
    5. return $pdo;
    6. } else {
    7. // 处理 $pdo 未初始化的情况
    8. return null;
    9. }
    10. }
    11. // 改变数据 插入|更新|删除
    12. function changeData(string $sql, array $arr) {
    13. $stmt = pdo()?->prepare($sql);
    14. $result = $stmt?->execute($arr);
    15. return $result;
    16. }
    17. // 查询数据
    18. function findData(string $sql, array $arr) {
    19. $stmt = pdo()?->prepare($sql);
    20. $stmt?->execute($arr);
    21. $result = $stmt?->fetch();
    22. return $result;
    23. }
    24. ?>

    output.php

    输出封装

    1. class ErrorCode {
    2. const FAILURE = -1;
    3. const SUCCESS = 0;
    4. const INVALID_INPUT = 100;
    5. const MISSING_PARAMETER = 101;
    6. const DATABASE_ERROR = 200;
    7. const FILE_NOT_FOUND = 201;
    8. const METHOD_NOT_ALLOW = 405;
    9. const INTERNAL_SERVER_ERROR = 500;
    10. const DATA_NOT_FOUND = 1000;
    11. public static function getErrorMessage($errorCode) {
    12. switch ($errorCode) {
    13. case self::FAILURE:
    14. return "Operation failed.";
    15. case self::SUCCESS:
    16. return "Operation succeeded.";
    17. case self::INVALID_INPUT:
    18. return "Invalid input provided.";
    19. case self::MISSING_PARAMETER:
    20. return "Required parameter is missing.";
    21. case self::DATABASE_ERROR:
    22. return "Database error occurred.";
    23. case self::FILE_NOT_FOUND:
    24. return "File not found.";
    25. case self::METHOD_NOT_ALLOW:
    26. return "Method not allowed.";
    27. case self::INTERNAL_SERVER_ERROR:
    28. return "Internal Server Error.";
    29. case self::DATA_NOT_FOUND:
    30. return "No matching data found.";
    31. default:
    32. return "Unknown error occurred.";
    33. }
    34. }
    35. }
    36. function outputJSON(int $errorCode, $data = []) {
    37. // 构建要返回的数据
    38. $response = [
    39. 'code' => $errorCode,
    40. 'message' => ErrorCode::getErrorMessage($errorCode),
    41. 'data' => $data
    42. ];
    43. // 设置响应内容为 JSON 格式
    44. header('Content-Type: application/json');
    45. // 将数据转换为 JSON 字符串
    46. $json = json_encode($response);
    47. // 输出 JSON 字符串
    48. echo $json;
    49. }
    50. ?>

    city.php

    增加、删除、修改、查询城市

    1. require "sqlOperation.php";
    2. require "output.php";
    3. $tb_name = "cities";
    4. // 检查POST数据
    5. if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    6. /* 方式一: */
    7. // 获取数据并验证
    8. $name = $_POST['name'] ?? '';
    9. $code = $_POST['code'] ?? '';
    10. $mark = $_POST['mark'] ?? 0;
    11. /* 方式二:表单中Content-Type用'application/json'时,用这种方式获取传参
    12. // 获取 JSON 数据并解析
    13. $data = json_decode(file_get_contents('php://input'), true);
    14. // 获取数据并验证
    15. $name = $data['name'] ?? '';
    16. $code = $data['code'] ?? '';
    17. $mark = $data['mark'] ?? 0;
    18. */
    19. if (empty($name) || empty($code) || $mark == 0) {
    20. outputJSON(ErrorCode::MISSING_PARAMETER);
    21. return;
    22. }
    23. // mark 1:增 2:删 3:改 4:查
    24. if ($mark == 1) {
    25. // 插入数据
    26. $result = changeData("INSERT INTO $tb_name (name, code) VALUES (:name, :code)", ['name' => $name, 'code' => $code]);
    27. if ($result) {
    28. outputJSON(errorCode::SUCCESS);
    29. } else {
    30. outputJSON(errorCode::FAILURE);
    31. }
    32. } else if ($mark == 2) {
    33. // 删除数据
    34. $result = changeData("DELETE FROM $tb_name WHERE code = :code", ['code' => $code]);
    35. if ($result) {
    36. outputJSON(errorCode::SUCCESS);
    37. } else {
    38. outputJSON(errorCode::FAILURE);
    39. }
    40. } else if ($mark == 3) {
    41. // 更新数据
    42. $result = changeData("UPDATE $tb_name SET name = :name WHERE code = :code", ['name' => $name, 'code' => $code]);
    43. if ($result) {
    44. outputJSON(errorCode::SUCCESS);
    45. } else {
    46. outputJSON(errorCode::FAILURE);
    47. }
    48. } else if ($mark == 4) {
    49. // 查询数据
    50. $result = findData("SELECT * FROM $tb_name WHERE code = :code", ['code' => $code]);
    51. if ($result) {
    52. // 查询成功,至少有一条匹配的数据
    53. outputJSON(errorCode::SUCCESS,$result);
    54. } else {
    55. // 查询失败,没有匹配的数据
    56. outputJSON(ErrorCode::DATA_NOT_FOUND);
    57. }
    58. }
    59. exit;
    60. }
    61. ?>

    cityList.php

    分页查询城市列表

    1. require("pdoConnect.php");
    2. require("output.php");
    3. // 检查POST数据
    4. if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    5. try {
    6. // 获取数据并验证
    7. $page = isset($_POST['page']) ? intval($_POST['page']) : 1; // 当前页码,默认为第一页
    8. $pageSize = isset($_POST['pageSize']) ? intval($_POST['pageSize']) : 10; // 每页数据条数,默认为 10
    9. // 对页码进行有效性检查
    10. $page = max(1, intval($page)); ;
    11. // 确保每页记录数为正整数
    12. $pageSize = max(1, intval($pageSize)); ;
    13. // 表名
    14. $tb_name = "cities";
    15. // 查询总记录数
    16. $countSql = "SELECT COUNT(*) AS total FROM $tb_name";
    17. $countStmt = $pdo->prepare($countSql);
    18. $countStmt->execute();
    19. $totalItems = $countStmt->fetchColumn();
    20. // 计算总页数
    21. $totalPages = ceil($totalItems / $pageSize);
    22. // 对页码进行有效性检查
    23. $page = min($page, $totalPages);
    24. // 计算偏移量
    25. $offset = ($page - 1) * $pageSize;
    26. // 查询当前页的数据
    27. $sql = "SELECT * FROM $tb_name LIMIT :offset, :pageSize";
    28. $stmt = $pdo->prepare($sql);
    29. $stmt->bindValue(':offset', $offset, PDO::PARAM_INT);
    30. $stmt->bindValue(':pageSize', $pageSize, PDO::PARAM_INT);
    31. $stmt->execute();
    32. $pagedData = $stmt->fetchAll(PDO::FETCH_ASSOC);
    33. // 构建要返回的数据
    34. $response = [
    35. 'page' => $page,
    36. 'pageSize' => $pageSize,
    37. 'totalPages' => $totalPages,
    38. 'totalItems' => $totalItems,
    39. 'data' => array_map(function ($item) {
    40. return $item;
    41. }, $pagedData)
    42. ];
    43. outputJSON(ErrorCode::SUCCESS, $response);
    44. } catch (Exception $e) {
    45. // 发生错误时返回错误响应
    46. outputJSON(ErrorCode::INTERNAL_SERVER_ERROR);
    47. }
    48. } else {
    49. // 非 POST 请求返回错误响应
    50. outputJSON(ErrorCode::METHOD_NOT_ALLOW);
    51. }
    52. ?>

    5.测试本地开发环境

    在本地开发环境中测试你的PHP脚本,确保它可以正确地与MySQL数据库进行交互。

    6.将MySQL数据库部署到ECS

    1).创建ECS实例:登录到阿里云管理控制台,创建一个ECS实例。

    2).安装MySQL:通过SSH连接到你的ECS实例,使用相应的包管理器安装MySQL。

    3).配置MySQL:设置用户权限、创建数据库,并导入你的本地数据库数据到ECS上的MySQL实例。

    4).更新你的PHP代码中的数据库连接信息,使其指向ECS实例上的MySQL。

    7.部署PHP代码到ECS

    1).将你的PHP代码上传到ECS实例。你可以使用FTP、SCP或者Git来传输文件。

    2).配置Web服务器:在ECS上安装和配置Nginx或Apache作为Web服务器来处理PHP请求。

    3).确保ECS的安全组规则允许访问MySQL和Web服务器的端口。

    8.测试远程环境

    在浏览器中访问你的ECS实例的公网IP地址,确保你的PHP应用能够正确地运行并连接到MySQL数据库。

  • 相关阅读:
    typescript高级类型-类型兼容性
    mysql主从复制和读写分离
    java计算机毕业设计校园爱心公益平台设计与实现源码+系统+mysql数据库+lw文档+部署
    心脏出血漏洞复现(CVE-2014-0160)
    动态权重之多任务不平衡论文 (一)
    数据仓库和数据湖的区别
    列表页面新增 字段查询 ,点击查询后,前端页面和后端控制台 出现红色报错信息,查询数据失败。
    IO流 -- 调研
    Vue iconfont-阿里巴巴矢量图标库用法
    rocketmq
  • 原文地址:https://blog.csdn.net/u012881779/article/details/134472774