在Mac电脑上使用VS Code进行PHP开发并关联操作MySQL数据库,然后将数据库部署到ECS。
确保你的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
登录到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;
你需要在PHP代码中使用PDO或mysqli扩展来连接MySQL数据库。
确保你的MySQL服务正在运行,并且你已经创建了相应的用户、数据库和权限。
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());
}
?>
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'] . "
";
}
} else {
echo "没有结果";
}
// 关闭数据库连接
$conn->close();
?>
Demo:https://github.com/Gamin-fzym/php_test_demo
注意:使用Launch Built-in web server配置运行时,需要将"localhost:0"改成其它端口,不然每次运行都会随机生成端口号,很不方便。
{
"name": "Launch Built-in web server",
"type": "php",
"request": "launch",
"runtimeArgs": [
"-dxdebug.mode=debug",
"-dxdebug.start_with_request=yes",
"-S",
"localhost:8080"
],
"program": "",
"cwd": "${workspaceRoot}",
"port": 9003,
"serverReadyAction": {
"pattern": "Development Server \\(http://localhost:([0-9]+)\\) started",
"uriFormat": "http://localhost:%s/index.html",
"action": "openExternally"
}
}
城市信息表单
城市信息表单
城市信息表单
PDO连接MySQL封装
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;
}
?>
输出封装
$errorCode,
'message' => ErrorCode::getErrorMessage($errorCode),
'data' => $data
];
// 设置响应内容为 JSON 格式
header('Content-Type: application/json');
// 将数据转换为 JSON 字符串
$json = json_encode($response);
// 输出 JSON 字符串
echo $json;
}
?>
增加、删除、修改、查询城市
$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);
}
}
}
// 改变数据 插入|更新|删除
function changeData(string $sql, array $arr) {
global $pdo;
$stmt = $pdo->prepare($sql);
$result = $stmt->execute($arr);
return $result;
}
// 查询数据
function findData(string $sql, array $arr) {
global $pdo;
$stmt = $pdo->prepare($sql);
$stmt->execute($arr);
$result = $stmt->fetch();
return $result;
}
?>
分页查询城市列表
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);
}
?>
在本地开发环境中测试你的PHP脚本,确保它可以正确地与MySQL数据库进行交互。
登录到阿里云管理控制台,创建一个ECS实例。
通过SSH连接到你的ECS实例,使用相应的包管理器安装MySQL。
启动MySQL服务:
$ brew services start mysql
登录到MySQL:
$ mysql -u root -p
授予相应的权限:
$ GRANT PROCESS ON *.* TO 'gamin'@'localhost';
刷新权限:
$ FLUSH PRIVILEGES;
退出MySQL:
$ EXIT;
导出数据库:
格式
mysqldump -u [username] -p [database_name] > [filename].sql
示例
mysqldump -u gamin -p city_database > /Users/gamin/Desktop/files/city.sql
设置用户权限、创建数据库,并导入你的本地数据库数据到ECS上的MySQL实例。也可以直接选择数据库的“管理”,进入管理页直接导入。
导入报了一个错,这个错误是由于 MySQL 不识别 utf8mb4_0900_ai_ci这个字符集校对规则引起的。这通常是因为 MySQL 版本较旧,不支持该特定的字符集校对规则。
将 utf8mb4_0900_ai_ci替换为 MySQL 支持的字符集校对规则,例如 utf8mb4_general_ci或utf8mb4_unicode_ci。修改导入文件中的创建表语句,将字符集校对规则修改为合适的值。
导入成功
在ECS上安装和配置Nginx或Apache作为Web服务器来处理PHP请求。
使其指向ECS实例上的MySQL
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;
}
?>
这里我就直接在宝塔中上传PHP文件了,当然直接传这样没版本管理不怎么科学。还可以使用FTP、SCP或者Git方式,传输文件。
为了便于测试,我将前面写的表单页面也部署到了站点上。
访问页面,经过测试,我们能正常查询到从本地导入到MySQL的数据,也能正常连接线上数据库执行其它操作。
https://www.lnktools.com/page/index.html
确保在部署到生产环境之前,你的应用已经通过了所有必要的安全和性能测试。此外,确保对敏感信息(如数据库凭据)进行加密,并在ECS实例上配置合适的安全措施。