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

news2024/12/23 17:26:05

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

1.安装PHP和MySQL

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

$ brew install php 
$ brew install mysql

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

MySQL is configured to only allow connections from localhost by default

To connect run:
    mysql -u root

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

$ php -v
$ mysql --version

启动MySQL服务:

$ brew services start mysql

重启MySQL服务:

$ brew services restart mysql

停止MySQL服务:

$ brew services stop mysql

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

登录到MySQL:

// 无密码直接用这一句登录
$ mysql -u root
// 也可以用这指令,输密码是直接回车跳过就是
$ 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

<?php
$host = '127.0.0.1';
$db   = 'your_database';
$user = 'your_username';
$pass = 'your_password';
$charset = 'utf8mb4';

$dsn = "mysql:host=$host;dbname=$db;charset=$charset";
$options = [
    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    PDO::ATTR_EMULATE_PREPARES   => false,
];

try {
    $pdo = new PDO($dsn, $user, $pass, $options);
} catch (\PDOException $e) {
    throw new \PDOException($e->getMessage(), (int)$e->getCode());
}
?>

2).mysqli扩展

<?php

// 数据库连接配置
$host = 'localhost';
$dbname = 'mydatabase';
$username = 'myusername';
$password = 'mypassword';

// 创建 mysqli 连接对象
$conn = new mysqli($host, $username, $password, $dbname);

// 检查连接是否成功
if ($conn->connect_error) {
    die("连接失败: " . $conn->connect_error);
}

// 执行查询语句
$query = "SELECT * FROM users";
$result = $conn->query($query);

// 处理结果集
if ($result->num_rows > 0) {
    while ($row = $result->fetch_assoc()) {
        echo $row['username'] . "<br>";
    }
} else {
    echo "没有结果";
}

// 关闭数据库连接
$conn->close();

?>

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

index.html

<!DOCTYPE html>
<html>
<head>
    <title>城市信息表单</title>
</head>
<body>
    <h1>城市信息表单</h1>
    <form action="http://localhost:8080/city.php" method="post">
        <label for="cityName">城市名称:</label>
        <input type="text" id="name" name="name" required><br><br>

        <label for="cityCode">城市编码:</label>
        <input type="text" id="code" name="code" required><br><br>

        <label for="cityCode">增删改查:</label>
        <input type="text" id="mark" name="mark" required><br><br>

        <input type="submit" value="提交">
    </form>

    <p id="jsonResponse"></p>

    <script>
        document.querySelector('form').addEventListener('submit', function (event) {
            event.preventDefault();
            // 方式一:PHP 中使用这种方式获取 $name = $_POST['name'] ?? '';
            var form = event.target;
            var formData = new FormData(form);
            fetch(form.action, {
                method: 'POST',
                body: formData
            })
            .then(response => response.json())
            .then(data => {
                document.getElementById('jsonResponse').textContent = JSON.stringify(data);
            })
            .catch(error => console.error('请求接口失败', error));

            /*
            // 方式二:PHP中用这种方式获取 $data = json_decode(file_get_contents('php://input'), true);  $name = $data['name'] ?? '';
            var form = event.target;
            var name = form.elements.name.value;
            var code = form.elements.code.value;
            var mark = form.elements.mark.value;
            var requestData = {
                name: name,
                code: code,
                mark: parseInt(mark) // mark 1:增 2:删 3:改 4:查
            };

            var xhr = new XMLHttpRequest();
            xhr.open('POST', form.action);
            xhr.setRequestHeader('Content-Type', 'application/json');
            // xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
            xhr.onload = function () {
                if (xhr.status === 200) {
                    var data = JSON.parse(xhr.responseText);
                    document.getElementById('jsonResponse').textContent = JSON.stringify(data);
                } else {
                    console.error('请求接口失败');
                }
            };
            xhr.send(JSON.stringify(requestData));
            */
        });
    </script>
</body>
</html>

pdoConnect.php

<?php
$host = '127.0.0.1';
$db = 'city_database';
$user = 'gamin';
$pass = '123456';
$charset = 'utf8mb4';

$dsn = "mysql:host=$host;dbname=$db;charset=$charset";
$options = [
    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    PDO::ATTR_EMULATE_PREPARES   => false,
];

// 连接数据库
try {
    $pdo = new PDO($dsn, $user, $pass, $options);
    createCitiesTable();
} catch (\PDOException $e) {
    throw new \PDOException($e->getMessage(), (int)$e->getCode());
}

// 创建城市表
function createCitiesTable() {
    $tb_name = "cities";
    // 检查表是否已存在
    $isTableExists = checkTableExists($tb_name);
    if (!$isTableExists) { 
        // 创建表
        $sql = "CREATE TABLE $tb_name (
            id INT AUTO_INCREMENT PRIMARY KEY,
            name VARCHAR(255) NOT NULL,
            code INT NOT NULL
        )";
        global $pdo;
        $pdo->exec($sql);
    } else {
         
    }
}

// 检查表是否存在
function checkTableExists($tableName) {
    global $pdo;
    $stmt = $pdo->query("SHOW TABLES LIKE '$tableName'");
    return $stmt->rowCount() > 0;
}

?>

sqlOperation.php

<?php
require "pdoConnect.php";

function pdo() {
    global $pdo;
    if (isset($pdo)) {
        return $pdo;
    } else {
        // 处理 $pdo 未初始化的情况
        return null;
    }
}

// 改变数据 插入|更新|删除
function changeData(string $sql, array $arr) {
    $stmt = pdo()?->prepare($sql);
    $result = $stmt?->execute($arr);
    return $result;
}

// 查询数据
function findData(string $sql, array $arr) {
    $stmt = pdo()?->prepare($sql);
    $stmt?->execute($arr);
    $result = $stmt?->fetch();
    return $result;
}

?>

output.php

<?php

class ErrorCode {
    const FAILURE = -1;
    const SUCCESS = 0;
    const INVALID_INPUT = 100;
    const MISSING_PARAMETER = 101;
    const DATABASE_ERROR = 200;
    const FILE_NOT_FOUND = 201;
    const METHOD_NOT_ALLOW = 405;
    const INTERNAL_SERVER_ERROR = 500;
    const DATA_NOT_FOUND = 1000;

    public static function getErrorMessage($errorCode) {
        switch ($errorCode) {
            case self::FAILURE:
                return "Operation failed.";
            case self::SUCCESS:
                return "Operation succeeded.";
            case self::INVALID_INPUT:
                return "Invalid input provided.";
            case self::MISSING_PARAMETER:
                return "Required parameter is missing.";
            case self::DATABASE_ERROR:
                return "Database error occurred.";
            case self::FILE_NOT_FOUND:
                return "File not found.";
            case self::METHOD_NOT_ALLOW:
                return "Method not allowed.";   
            case self::INTERNAL_SERVER_ERROR:
                return "Internal Server Error.";   
            case self::DATA_NOT_FOUND:
                return "No matching data found.";  
            default:
                return "Unknown error occurred.";
        }
    }
}

function outputJSON(int $errorCode, $data = []) {
    // 构建要返回的数据
    $response = [
        'code' => $errorCode,
        'message' => ErrorCode::getErrorMessage($errorCode),
        'data' => $data
     ];
    
    // 设置响应内容为 JSON 格式
    header('Content-Type: application/json');

    // 将数据转换为 JSON 字符串
    $json = json_encode($response);

    // 输出 JSON 字符串
    echo $json;
}

?>

city.php

<?php
require "sqlOperation.php";
require "output.php";

$tb_name = "cities";

// 检查POST数据
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    /* 方式一: */
    // 获取数据并验证
    $name = $_POST['name'] ?? '';
    $code = $_POST['code'] ?? '';
    $mark = $_POST['mark'] ?? 0;

    /* 方式二:表单中Content-Type用'application/json'时,用这种方式获取传参 
    // 获取 JSON 数据并解析
    $data = json_decode(file_get_contents('php://input'), true);
    // 获取数据并验证
    $name = $data['name'] ?? '';
    $code = $data['code'] ?? '';
    $mark = $data['mark'] ?? 0;
    */

    if (empty($name) || empty($code) || $mark == 0) {
        outputJSON(ErrorCode::MISSING_PARAMETER);
        return;
    }

    // mark 1:增 2:删 3:改 4:查
    if ($mark == 1) {
        // 插入数据
        $result = changeData("INSERT INTO $tb_name (name, code) VALUES (:name, :code)", ['name' => $name, 'code' => $code]);
        if ($result) {
            outputJSON(errorCode::SUCCESS);
        } else {
            outputJSON(errorCode::FAILURE);
        }
    } else if ($mark == 2) {
        // 删除数据
        $result = changeData("DELETE FROM $tb_name WHERE code = :code", ['code' => $code]);
        if ($result) {
            outputJSON(errorCode::SUCCESS);
        } else {
            outputJSON(errorCode::FAILURE);
        }
    } else if ($mark == 3) {
        // 更新数据
        $result = changeData("UPDATE $tb_name SET name = :name WHERE code = :code", ['name' => $name, 'code' => $code]);
        if ($result) {
            outputJSON(errorCode::SUCCESS);
        } else {
            outputJSON(errorCode::FAILURE);
        }
    } else if ($mark == 4) {
        // 查询数据
        $result = findData("SELECT * FROM $tb_name WHERE code = :code", ['code' => $code]);
        if ($result) {
            // 查询成功,至少有一条匹配的数据
            outputJSON(errorCode::SUCCESS,$result);
        } else {
            // 查询失败,没有匹配的数据
            outputJSON(ErrorCode::DATA_NOT_FOUND);
        }
    }

    exit;
}

?>

cityList.php

<?php
require("pdoConnect.php");
require("output.php");

// 检查POST数据
if ($_SERVER['REQUEST_METHOD'] === 'POST') { 
    try {
        // 获取数据并验证
        $page = isset($_POST['page']) ? intval($_POST['page']) : 1; // 当前页码,默认为第一页
        $pageSize = isset($_POST['pageSize']) ? intval($_POST['pageSize']) : 10; // 每页数据条数,默认为 10

        // 对页码进行有效性检查
        $page = max(1, intval($page)); ;
        // 确保每页记录数为正整数
        $pageSize = max(1, intval($pageSize)); ;

        // 表名
        $tb_name = "cities";

        // 查询总记录数
        $countSql = "SELECT COUNT(*) AS total FROM $tb_name";
        $countStmt = $pdo->prepare($countSql);
        $countStmt->execute();
        $totalItems = $countStmt->fetchColumn();
        // 计算总页数
        $totalPages = ceil($totalItems / $pageSize);

        // 对页码进行有效性检查
        $page = min($page, $totalPages);
        // 计算偏移量
        $offset = ($page - 1) * $pageSize;

        // 查询当前页的数据
        $sql = "SELECT * FROM $tb_name LIMIT :offset, :pageSize";
        $stmt = $pdo->prepare($sql);
        $stmt->bindValue(':offset', $offset, PDO::PARAM_INT);
        $stmt->bindValue(':pageSize', $pageSize, PDO::PARAM_INT);
        $stmt->execute();

        $pagedData = $stmt->fetchAll(PDO::FETCH_ASSOC);

        // 构建要返回的数据
        $response = [
            'page' => $page,
            'pageSize' => $pageSize,
            'totalPages' => $totalPages,
            'totalItems' => $totalItems,
            'data' => array_map(function ($item) {
                return $item;
            }, $pagedData)
        ];
        outputJSON(ErrorCode::SUCCESS, $response);
    } catch (Exception $e) {
        // 发生错误时返回错误响应
        outputJSON(ErrorCode::INTERNAL_SERVER_ERROR);
    }
} else {
    // 非 POST 请求返回错误响应
    outputJSON(ErrorCode::METHOD_NOT_ALLOW);
}

?>

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数据库。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1221720.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Notepad++ 通过HexEditor插件查看.hprof文件、heap dump文件的堆转储数据

文章目录 需求场景插件安装查看notepad的版本&#xff0c;看看是32位的还是64位的下载对应的版本解压导入插件打开notepad插件文件夹&#xff1a;Notepad安装目录新建一个HexEditor文件夹选中插件文件导入 重启notepad使用 需求场景 想要查看app内存的某个域的数据。 利用Andr…

2.项目疑问

Day01 1.前后端分离项目的全局异常处理怎么做 使用ControllerAdviceExceptionHandler&#xff08;类.class&#xff09;来实现异常处理 ControllerAdvice: Controller增强器。将异常处理器应用到所有的控制器 ExceptionHandler&#xff1a;异常处理器&#xff0c;只要发生异…

2023年(第六届)电力机器人应用与创新发展论坛-核心PPT资料下载

一、峰会简介 大会以“聚焦电力机器人创新、助力行业数字化转型、促进产业链协同发展”为主题&#xff0c;展示电力机器人产业全景创新技术&#xff0c;探讨数字化战略下电力机器人应用前景和发展趋势。为加快推进电力机器人应用拓新&#xff0c;助力电网数字化转型升级&#…

编译中的 CMP0148 警告

原因&#xff1a;CMake 3.12后&#xff0c; FindPythonInterp 及 FindPythonLibs被废弃 解决方法&#xff1a;使用 FindPython3、FindPython2、FindPython替换 实例&#xff1a;CMakeLists.txt中修改即可&#xff0c;如下图

【FPGA】Verilog:升降计数器 | 波纹计数器 | 约翰逊计数器 | 实现 4-bit 升降计数器的 UP/DOWN

目录 Ⅰ. 理论部分 0x00 升降计数器&#xff08;UP DOWN Counter&#xff09; 0x01 波纹计数器&#xff08;Ripple Counter&#xff09; 0x02 约翰逊计数器&#xff08;Johnson Counter&#xff09; Ⅱ. 实践部分 0x00 实现&#xff1a;升降计数器&#xff08;4-bit&…

基于java web的中小型人力资源管理系统

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…

计算机毕业论文内容参考|基于深度学习的交通标识智能识别系统的设计与维护

文章目录 导文摘要前言绪论1课题背景2国内外现状与趋势3课题内容相关技术与方法介绍系统分析总结与展望导文 基于深度学习的交通标识智能识别系统是一种利用深度学习模型对交通标识进行识别和解析的系统。它可以帮助驾驶员更好地理解交通规则和安全提示,同时也可以提高道路交通…

JAVA生成图片缩略图、JAVA截取图片局部内容

JAVA生成图片缩略图、JAVA截取图片局部内容 目前&#xff0c;google已经有了更好的处理JAVA图片的工具&#xff0c;请搜索&#xff1a;Thumbnailator JAVA生成图片缩略图 package com.ares.image.test;import java.awt.Color; import java.awt.Graphics; import java.awt.Im…

Java中利用OpenCV进行人脸识别

OpenCV 概述 ​ OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一个开源计算机视觉库&#xff0c;它提供了丰富的工具和算法&#xff0c;用于处理图像和视频数据。该库由一系列高效的计算机视觉算法组成&#xff0c;涵盖了许多领域&#xff0c;包括目…

K8S1.23.5部署(此前1.17版本步骤囊括)及问题记录

应版本需求&#xff0c;升级容器版本为1.23.5 kubernetes组件 一个kubernetes集群主要由控制节点&#xff08;master&#xff09;与工作节点&#xff08;node&#xff09;组成&#xff0c;每个节点上需要安装不同的组件。 master控制节点&#xff1a;负责整个集群的管理。 …

Pytorch torch.dot、torch.mv、torch.mm、torch.norm的用法详解

torch.dot的用法&#xff1a; 使用numpy求点积&#xff0c;对于二维的且一个二维的维数为1 torch.mv的用法&#xff1a; torch.mm的用法 torch.norm 名词解释&#xff1a;L2范数也就是向量的模&#xff0c;L1范数就是各个元素的绝对值之和例如&#xff1a;

RMI协议详解

前言特点应用示例存在的问题应用场景拓展 前言 RMI&#xff08;Remote Method Invocation&#xff0c;远程方法调用&#xff09;是Java中的一种远程通信协议&#xff0c;用于实现跨网络的对象方法调用。RMI协议基于Java的分布式计算&#xff0c;可以让客户端程序调用远程服务器…

MIB 6.1810实验Xv6 and Unix utilities(5)find

难度:moderate Write a simple version of the UNIX find program for xv6: find all the files in a directory tree with a specific name. Your solution should be in the file user/find.c. 题目要求&#xff1a;实现find &#xff0c;即在某个路径中&#xff0c;找出某…

Babyk勒索病毒数据集恢复,计算机服务器中了babyk勒索病毒怎么办?

计算机网络技术的不断应用&#xff0c;为企业的生产运营提供了极大便利&#xff0c;网络技术的不断发展也带来了许多网络安全隐患&#xff0c;近期&#xff0c;云天数据恢复中心陆续接到许多企业的求助&#xff0c;企业的计算机服务器遭到了babyk勒索病毒的攻击&#xff0c;导致…

nodejs+vue杰和牧场管理系统的设计与实现-微信小程序-安卓-python-PHP-计算机毕业设计

系统涉及的对象是奶牛。 系统使用员工有管理员和普通员工。 管理员有修改的权限&#xff0c;普通员工没有。系统包含新闻功能&#xff0c;最好是有个后台管理&#xff0c;在后台输入新闻标题和内容&#xff0c;插入图片&#xff0c;在网页上就可以展示。最好再有个轮播图。 新闻…

我的 2023 秋招总结,拿到了大厂offer

2023秋招小结 前言 & 介绍 作为2024年毕业的学生&#xff0c;在2023年也就是今年秋招。 现在秋招快结束了&#xff0c;人生可能没有几次秋招的机会&#xff08;应该就一次&#xff0c;最多两次吧哈哈&#xff09;&#xff0c;也有一点感悟&#xff0c;所以小小总结一下。…

基于SSM的项目管理系统设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

requests爬虫IP连接初始化问题及解决方案

问题背景 在使用HTTPS爬虫IP连接时&#xff0c;如果第一次请求是chunked方式&#xff0c;那么HTTPS爬虫IP连接将不会被初始化。这个问题可能会导致403错误&#xff0c;或者在使用HTTPS爬虫IP时出现SSL错误。 解决方案 为了解决这个问题&#xff0c;我们可以在requests库的ada…

从傅里叶变换,到短时傅里叶变换,再到小波分析(CWT),看这一篇就够了(附MATLAB傻瓜式实现代码)

本专栏中讲了很多时频域分析的知识&#xff0c;不过似乎还没有讲过时频域分析是怎样引出的。 所以本篇将回归本源&#xff0c;讲一讲从傅里叶变换→短时傅里叶变换→小波分析的过程。 为了让大家更直观得理解算法原理和推导过程&#xff0c;这篇文章将主要使用图片案例。 一…

sqlite与mysql的差异

差异点 安装过程&#xff1a;MySQL服务器通常需要单独安装&#xff0c;这涉及下载适用于特定操作系统的MySQL安装程序&#xff0c;运行安装程序并按照指示完成安装过程。SQLite作为嵌入式数据库&#xff0c;可以直接使用其库文件&#xff0c;不需要单独的安装过程。 配置和管理…