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

在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 defaultTo 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

<?phpclass 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.mzph.cn/news/146187.shtml

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

相关文章

在.net 6版本以上的web api中添加像.net 5一样的Startup.cs

Program.cs中&#xff1a; 第一步&#xff1a;在var builder WebApplication.CreateBuilder(args);的后面添加上&#xff1a; var startup new Startup(builder.Configuration); startup.ConfigureServices(builder.Services); 第二步&#xff1a;在var app builder.Build()…

城市网吧视频智能监控方案,实现视频远程集中监控

网吧环境较为复杂&#xff0c;电脑设备众多且人员流动性大&#xff0c;极易发生人员或消防事故&#xff0c;亟需改变&#xff0c;TSINGSEE青犀AI智能网吧视频监管方案可以帮助实现对网吧环境和用户活动的实时监控和管理。 1、视频监控系统 在网吧内部布置高清摄像头&#xff0…

设计模式 -- 适配器模式(Adapter Pattern)

适配器模式&#xff1a;属于结构型模式&#xff0c;结合了两个独立接口的功能&#xff0c;作为 两个不兼容的接口之间的桥梁 。 介绍 意图&#xff1a;将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。主要…

【Shell脚本入门】

Shell中的特殊符号 1.$ 美元符号&#xff0c;用来表示变量的值。 如变量NAME的值为Mike&#xff0c;则使用$NAME就可以得到“Mike”这个值。2.# 井号&#xff0c;除了做为超级用户的提示符之外&#xff0c;还可以在脚本中做为注释的开头字母&#xff0c;每一行语句中&#xff…

WPF中可视化树和逻辑树的区别是什么

在WPF中&#xff0c;用户界面元素被组织成树形结构。这种结构主要分为两种&#xff1a;逻辑树&#xff08;Logical Tree&#xff09;和可视化树&#xff08;Visual Tree&#xff09;。它们在设计上各有特点和用途。 逻辑树&#xff08;Logical Tree&#xff09; 逻辑树是WPF中…

反转字符串中的单词

给你一个字符串 s &#xff0c;请你反转字符串中 单词 的顺序。 单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。 返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。 注意&#xff1a;输入字符串 s中可能会存在前导空格、尾随空格…

笔记54:门控循环单元 GRU

本地笔记地址&#xff1a;D:\work_file\DeepLearning_Learning\03_个人笔记\3.循环神经网络\第9章&#xff1a;动手学深度学习~现代循环神经网络 a a a a a a a

Bulk RNA-seq上下游分析

Bulk-RNA-seq上下游分析还是相对简单的&#xff0c;这次我以mouse为例&#xff0c;进行Bulk-RNA-seq上下游分析&#xff0c;并进行对应的图片绘制。 上游分析 1.软件准备 #安装所需软件 sudo apt install fastqc sudo apt install hisat2 sudo apt install cutadapt sudo ap…

快速幂:acwing 875. 快速幂

给定 n&#xfffd; 组 ai,bi,pi&#xfffd;&#xfffd;,&#xfffd;&#xfffd;,&#xfffd;&#xfffd;&#xff0c;对于每组数据&#xff0c;求出 abiimodpi&#xfffd;&#xfffd;&#xfffd;&#xfffd;mod&#xfffd;&#xfffd; 的值。 输入格式 第一行包…

腾讯云4核8G服务器性能如何多少钱一年?

腾讯云服务器4核8G配置优惠价格表&#xff0c;轻量应用服务器和CVM云服务器均有活动&#xff0c;云服务器CVM标准型S5实例4核8G配置价格15个月1437.3元&#xff0c;5年6490.44元&#xff0c;轻量应用服务器4核8G12M带宽一年446元、529元15个月&#xff0c;腾讯云百科txybk.com分…

Spring Security OAuth2.0 实现分布式系统的认证和授权

Spring Security OAuth2.0 实现分布式系统的认证和授权 1. 基本概念1.1 什么是认证&#xff1f;1.2 什么是会话&#xff1f;1.2.1 基于 session 的认证方式1.2.2 基于 token 的认证方式 1.3 什么是授权&#xff1f;1.3.1 授权的数据模型 1.4 RBAC 介绍 2. Spring Security2.1 S…

什么是JPA? JPA在springBoot中怎么使用

JPA&#xff08;Java Persistence API&#xff09;是Java EE 5规范中的一套ORM规范&#xff0c;用于在Java应用程序中进行对象关系映射&#xff08;ORM&#xff09;。它定义了一组标准API&#xff08;接口和类&#xff09;&#xff0c;用于在Java应用程序中管理持久化对象。 在…

鸿蒙4.0开发笔记之DevEco Studio如何使用Previewer窗口预览器(一)

一、预览器作用 DevEco Studio预览器概况在HarmonyOS应用开发过程中&#xff0c;通过使用预览器&#xff0c;可以查看应用的UI效果&#xff0c;方便开发者实时查看应用的运行效果&#xff0c;随时调整代码。 二、打开Previewer预览器 1、正常启动 打开预览器的位置在DevEco…

Spring Boot - devtools 热部署

spring-boot-devtools是Spring Boot提供的一组开发工具&#xff0c;它旨在提高开发体验。这些工具包括应用程序的自动重新启动、自动刷新和远程调试等功能。下面是将spring-boot-devtools整合到Spring Boot应用程序中的步骤&#xff1a; 0、启用"Build project automatic…

4核8G服务器价格选择轻量还是CVM合适?

腾讯云服务器4核8G配置优惠价格表&#xff0c;轻量应用服务器和CVM云服务器均有活动&#xff0c;云服务器CVM标准型S5实例4核8G配置价格15个月1437.3元&#xff0c;5年6490.44元&#xff0c;轻量应用服务器4核8G12M带宽一年446元、529元15个月&#xff0c;腾讯云百科txybk.com分…

Django之模型层

目录 一、前言 【1】测试脚本 【2】数据准备 二、单表操作 【1】数据的增加 【2】数据的删除 【3】数据的更改 三、常见的十几种查询方法 四、查看内部sql语句的方式 【1】方式一 【2】方式二 五、基于双下划线的查询 六、多表查询引入 【1】数据准备 【2】外键…

java8流处理器list转map的对比

文章目录 前言代码Collectors.toMap()方法有以下几个重载版本: 前言 写代码的时候&#xff0c;经常会需要处理拿到的数据&#xff0c;比如把list转成map&#xff0c;就有好多种写法&#xff0c;所以写文章理一下区别。 代码 假设我们有一个实体类User Data public class Us…

【论文阅读】A Survey on Video Diffusion Models

视频扩散模型&#xff08;Video Diffusion Model&#xff09;最新综述GitHub 论文汇总-A Survey on Video Diffusion Models。 paper&#xff1a;[2310.10647] A Survey on Video Diffusion Models (arxiv.org) 0. Abstract 本文介绍了AIGC时代视频扩散模型的全面回顾。简要介…

Redis7.2.3集群安装,新增节点,删除节点,分配哈希槽,常见问题

概念&#xff1a; 【Redis】高可用之三&#xff1a;集群&#xff08;cluster&#xff09; - 知乎 实操&#xff1a; Redis集群三种模式 主从模式 优势&#xff1a; 主节点可读可写 从节点只能读&#xff08;从节点从主节点同步数据&#xff09; 缺点&#xff1a; 当主节点…

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

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