|
|
- <?php
- class MySQLDatabase {
- private $host;
- private $username;
- private $password;
- private $database;
- private $port;
- private $conn;
- public function __construct($host, $username, $password, $database, $port = 3306) {
- $this->host = "p:" . $host;
- $this->username = $username;
- $this->password = $password;
- $this->database = $database;
- $this->port = $port;
- $this->connect();
- }
- private function connect() {
- $this->conn = new mysqli($this->host, $this->username, $this->password, $this->database, $this->port);
- if ($this->conn->connect_error) {
- die("连接失败:" . $this->conn->connect_error);
- }
- $this->conn->set_charset("utf8mb4");
- }
- public function query($sql) {
- return $this->conn->query($sql);
- }
- public function execute($sql) {
- return $this->conn->query($sql);
- }
- public function createUser($username, $password, $database, $privileges = 'ALL PRIVILEGES') {
- $sqlCreateUser = "CREATE USER '$username'@'localhost' IDENTIFIED BY '$password'";
- $sqlGrantPrivileges = "GRANT $privileges ON `$database`.* TO '$username'@'localhost'";
- $resultCreateUser = $this->execute($sqlCreateUser);
- if (!$resultCreateUser) {
- return false;
- }
- $resultGrantPrivileges = $this->execute($sqlGrantPrivileges);
- if (!$resultGrantPrivileges) {
- $this->execute("DROP USER '$username'@'localhost'");
- return false;
- }
- return true;
- }
- public function deleteUser($username) {
- $sql = "DROP USER IF EXISTS '$username'@'localhost'";
- $result = $this->conn->query($sql);
- return $result;
- }
- public function updateUserPrivileges($username, $database, $privileges) {
- $sql = "GRANT $privileges ON $database.* TO '$username'@'localhost'";
- $result = $this->conn->query($sql);
- return $result;
- }
- public function revokeUserPrivileges($username, $database) {
- $sql = "REVOKE ALL PRIVILEGES ON $database.* FROM '$username'@'localhost'";
- $result = $this->conn->query($sql);
- return $result;
- }
- public function createDatabase($databaseName) {
- $sql = "CREATE DATABASE IF NOT EXISTS $databaseName";
- return $this->execute($sql);
- }
- public function databaseExists($databaseName) {
- $result = $this->query("SHOW DATABASES LIKE '$databaseName'");
- return $result->num_rows > 0;
- }
- public function selectDatabase($databaseName) {
- if ($this->databaseExists($databaseName)) {
- $this->database = $databaseName;
- return $this->conn->select_db($databaseName);
- } else {
- return false;
- }
- }
- public function dropDatabase($databaseName) {
- $sql = "DROP DATABASE IF EXISTS $databaseName";
- return $this->execute($sql);
- }
- public function selectWithCount($table, $columns = "*", $where = "", $orderByColumn = null, $orderByDirection = 'ASC') {
- $sql = "SELECT SQL_CALC_FOUND_ROWS $columns FROM $table";
- if ($where != "") {
- $sql .= " WHERE $where";
- }
- if ($orderByColumn !== null) {
- $sql .= " ORDER BY $orderByColumn $orderByDirection";
- }
- $result = $this->query($sql);
- $data = $result->fetch_all(MYSQLI_ASSOC);
- // 获取总行数
- $countResult = $this->query("SELECT FOUND_ROWS() as totalRows");
- $totalCount = $countResult->fetch_assoc()['totalRows'];
- return ['count' => $totalCount, 'data' => $data];
- }
- public function insert($table, $data) {
- $columns = implode(", ", array_keys($data));
- $values = implode(", ", array_fill(0, count($data), '?'));
- $sql = "INSERT INTO $table ($columns) VALUES ($values)";
- $stmt = $this->conn->prepare($sql);
- $types = str_repeat('s', count($data));
- $stmt->bind_param($types, ...array_values($data));
- return $stmt->execute();
- }
- public function update($table, $data, $where) {
- $set = "";
- $types = "";
- foreach ($data as $key => $value) {
- $set .= "$key = ?, ";
- $types .= 's';
- }
- $set = rtrim($set, ", ");
- $sql = "UPDATE $table SET $set WHERE $where";
- $stmt = $this->conn->prepare($sql);
- $stmt->bind_param($types, ...array_values($data));
- return $stmt->execute();
- }
- public function delete($table, $where) {
- $sql = "DELETE FROM $table WHERE $where";
- return $this->execute($sql);
- }
- public function createTable($table, $columns, $tableOptions = '') {
- $sql = "CREATE TABLE IF NOT EXISTS $table (";
- foreach ($columns as $columnName => $columnDetails) {
- $sql .= "$columnName $columnDetails, ";
- }
- $sql = rtrim($sql, ", ");
- $sql .= ") $tableOptions"; // 添加表选项
- return $this->execute($sql);
- }
- public function tableExists($table) {
- $result = $this->query("SHOW TABLES LIKE '$table'");
- return $result->num_rows > 0;
- }
- public function addColumn($table, $column, $type, $comment = '') {
- $typeWithComment = ($comment !== '') ? "$type COMMENT '$comment'" : $type;
- $sql = "ALTER TABLE $table ADD $column $typeWithComment";
- return $this->execute($sql);
- }
- public function addColumn2($table, $column, $type, $autoIncrement = false, $startValue = null, $comment = '') {
- $typeWithComment = ($comment !== '') ? "$type COMMENT '$comment'" : $type;
- $sql = "ALTER TABLE $table ADD $column $typeWithComment";
- // 如果 $autoIncrement 为 true,则将该列设置为 AUTO_INCREMENT
- if ($autoIncrement) {
- $autoIncrementClause = " AUTO_INCREMENT";
- if ($startValue !== null) {
- $autoIncrementClause .= " AUTO_INCREMENT=$startValue";
- }
- $sql .= $autoIncrementClause;
- }
- $this->execute($sql);
-
- // 如果 $autoIncrement 为 true,则将该列设置为表的主键
- if ($autoIncrement) {
- $this->execute("ALTER TABLE $table MODIFY COLUMN $column $type AUTO_INCREMENT");
- $this->execute("ALTER TABLE $table ADD PRIMARY KEY ($column)");
- }
- }
- public function dropColumn($table, $column) {
- $sql = "ALTER TABLE $table DROP COLUMN $column";
- return $this->execute($sql);
- }
- public function getColumnInfo($table, $column) {
- $sql = "SHOW FULL COLUMNS FROM $table WHERE Field = '$column'";
- $result = $this->query($sql);
- if ($result->num_rows == 1) {
- $columnInfo = $result->fetch_assoc();
- return [
- 'Field' => $columnInfo['Field'], // 列名
- 'Type' => $columnInfo['Type'], // 数据类型
- 'Collation' => $columnInfo['Collation'], // 字符集
- 'Null' => $columnInfo['Null'], // 是否允许为空
- 'Key' => $columnInfo['Key'], // 是否是主键
- 'Default' => $columnInfo['Default'], // 默认值
- 'Extra' => $columnInfo['Extra'], // 额外信息
- 'Comment' => $columnInfo['Comment'] // 备注
- ];
- } else {
- return null; // 如果列不存在或查询失败,返回null
- }
- }
- public function columnExists($table, $column) {
- $result = $this->query("SHOW COLUMNS FROM $table LIKE '$column'");
- return $result->num_rows > 0;
- }
- public function paginate($table, $columns = "*", $where = "", $page = 1, $pageSize = 10, $orderByColumn = null, $orderByDirection = 'ASC') {
- $offset = ($page - 1) * $pageSize;
- $sql = "SELECT SQL_CALC_FOUND_ROWS $columns FROM $table";
- if ($where != "") {
- $sql .= " WHERE $where";
- }
- if ($orderByColumn !== null) {
- $sql .= " ORDER BY $orderByColumn $orderByDirection";
- }
- $sql .= " LIMIT $offset, $pageSize";
- $result = $this->query($sql);
- $data = $result->fetch_all(MYSQLI_ASSOC);
- $countResult = $this->query("SELECT FOUND_ROWS() as totalRows");
- $totalCount = $countResult->fetch_assoc()['totalRows'];
- $totalPages = ceil($totalCount / $pageSize);
- return ['count' => $totalCount, 'totalPages' => $totalPages, 'data' => $data];
- }
- public function selectWithCountAndJoin($table, $columns = "*", $joinTable, $joinCondition, $where = "", $orderByColumn = null, $orderByDirection = 'ASC') {
- $sql = "SELECT $columns FROM $table INNER JOIN $joinTable ON $joinCondition";
- if ($where != "") {
- $sql .= " WHERE $where";
- }
- if ($orderByColumn !== null) {
- $sql .= " ORDER BY $orderByColumn $orderByDirection";
- }
- $result = $this->query($sql);
- $rowCount = $result->num_rows;
- $data = $result->fetch_all(MYSQLI_ASSOC);
- return ['count' => $rowCount, 'data' => $data];
- }
- public function paginateWithJoin($table, $columns = "*", $joinTable, $joinCondition, $where = "", $page = 1, $pageSize = 10, $orderByColumn = null, $orderByDirection = 'ASC') {
- $offset = ($page - 1) * $pageSize;
- $sql = "SELECT $columns FROM $table INNER JOIN $joinTable ON $joinCondition";
- if ($where != "") {
- $sql .= " WHERE $where";
- }
- if ($orderByColumn !== null) {
- $sql .= " ORDER BY $orderByColumn $orderByDirection";
- }
- $sql .= " LIMIT $offset, $pageSize";
- $result = $this->query($sql);
- $rowCount = $result->num_rows;
- $totalPages = ceil($rowCount / $pageSize);
- $data = $result->fetch_all(MYSQLI_ASSOC);
- return ['count' => $rowCount, 'totalPages' => $totalPages, 'data' => $data];
- }
- public function tripleTableQueryWithPagination(
- $table,
- $columns = "*",
- $joinTable1,
- $joinCondition1,
- $joinTable2,
- $joinCondition2,
- $where = "",
- $page = 1,
- $pageSize = 10,
- $orderByColumn = null,
- $orderByDirection = 'ASC'
- ) {
- $offset = ($page - 1) * $pageSize;
- $sql = "SELECT $columns FROM $table
- INNER JOIN $joinTable1 ON $joinCondition1
- INNER JOIN $joinTable2 ON $joinCondition2";
- if ($where != "") {
- $sql .= " WHERE $where";
- }
- if ($orderByColumn !== null) {
- $sql .= " ORDER BY $orderByColumn $orderByDirection";
- }
- $sql .= " LIMIT $offset, $pageSize";
- $result = $this->query($sql);
- $rowCount = $result->num_rows;
- $totalPages = ceil($rowCount / $pageSize);
- $data = $result->fetch_all(MYSQLI_ASSOC);
- return ['count' => $rowCount, 'totalPages' => $totalPages, 'data' => $data];
- }
- public function tripleTableQuery(
- $table,
- $columns = "*",
- $joinTable1,
- $joinCondition1,
- $joinTable2,
- $joinCondition2,
- $where = "",
- $orderByColumn = null,
- $orderByDirection = 'ASC'
- ) {
- $sql = "SELECT $columns FROM $table
- INNER JOIN $joinTable1 ON $joinCondition1
- INNER JOIN $joinTable2 ON $joinCondition2";
- if ($where != "") {
- $sql .= " WHERE $where";
- }
- if ($orderByColumn !== null) {
- $sql .= " ORDER BY $orderByColumn $orderByDirection";
- }
- $result = $this->query($sql);
- $rowCount = $result->num_rows;
- $data = $result->fetch_all(MYSQLI_ASSOC);
- return ['count' => $rowCount, 'data' => $data];
- }
- public function update2($table, $data, $where) {
- foreach ($data as $key => $value) {
- if (is_string($value) && preg_match('/\[(.+?)\]/', $value, $matches)) {
- $parts = explode('.', $matches[1]);
- if (count($parts) >= 2) {
- list($sourceTable, $sourceColumn, $sourceWhere) = $parts;
- if ($this->tableExists($sourceTable)) {
- $sourceWhere = ($sourceWhere !== '') ? $sourceWhere : null;
- if ($this->columnExists($sourceTable, $sourceColumn)) {
- $sourceData = $this->selectWithCount($sourceTable, $sourceColumn, $sourceWhere);
- $replacement = isset($sourceData['data'][0][$sourceColumn]) ? $sourceData['data'][0][$sourceColumn] : null;
- $data[$key] = ($replacement !== null) ? $replacement : $matches[1];
- }
- }
- }
- }
- }
- $set = "";
- $types = "";
- foreach ($data as $key => $value) {
- $set .= "$key = ?, ";
- $types .= 's';
- }
- $set = rtrim($set, ", ");
- $sql = "UPDATE $table SET $set WHERE $where";
- $stmt = $this->conn->prepare($sql);
- $stmt->bind_param($types, ...array_values($data));
- return $stmt->execute();
- }
- public function closeConnection() {
- if ($this->conn !== null) {
- $this->conn->close();
- $this->conn = null;
- }
- }
-
- public function exportTablesToSQLFile($db, $sqlFilePath) {
- // 规范化文件路径
- $sqlFilePath = realpath($sqlFilePath);
- // 检查目标路径是否存在并可写
- if (!$sqlFilePath || !is_writable(dirname($sqlFilePath))) {
- // 路径不存在或不可写,记录日志或抛出异常
- return false;
- }
- // 打开文件,准备写入SQL
- $fp = fopen($sqlFilePath, 'w');
- if (!$fp) {
- // 文件打开失败,记录日志或抛出异常
- return false;
- }
- foreach ($db as $databaseData) {
- foreach ($databaseData as $dbName => $tables) {
- if ($tables === null) {
- // 导出数据库中的所有表及其所有字段
- $tables = $this->getAllTablesAndFields($dbName);
- }
- foreach ($tables as $tableName => $fields) {
- // 导出表结构
- fwrite($fp, $this->generateTableExportSQL($dbName, $tableName, $fields));
- // 导出表数据
- $result = $this->query("SELECT * FROM `$dbName`.`$tableName`");
- while ($row = $result->fetch_assoc()) {
- $columnNames = implode("`, `", array_keys($row));
- $columnValues = implode("', '", array_values($row));
- $sql = "INSERT INTO `$dbName`.`$tableName` (`$columnNames`) VALUES ('$columnValues');\n";
- fwrite($fp, $sql);
- }
- }
- }
- }
- // 关闭文件句柄
- fclose($fp);
- return true;
- }
- // 获取指定数据库中的所有表及其所有字段
- private function getAllTablesAndFields($dbName) {
- $tables = [];
- $result = $this->query("SHOW TABLES FROM `$dbName`");
- while ($row = $result->fetch_row()) {
- $tableName = $row[0];
- $tables[$tableName] = null; // 导出表的所有字段
- }
- return $tables;
- }
- private function generateTableExportSQL($table, $fields = null) {
- // 初始化SQL变量
- $sql = '';
- // 获取表结构
- $result = $this->query("SHOW COLUMNS FROM `$table`");
- $columns = [];
- while ($row = $result->fetch_assoc()) {
- $columns[$row['Field']] = $row['Type'];
- }
- // 构建CREATE TABLE语句
- $sql .= "DROP TABLE IF EXISTS `$table`;\n";
- $sql .= "CREATE TABLE `$table` (\n";
- // 选择需要导出的字段
- $selectedColumns = ($fields === null) ? $columns : array_intersect_key($columns, array_flip($fields));
- // 将字段添加到CREATE TABLE语句中
- $sql .= implode(",\n", array_map(function ($column, $type) {
- return " `$column` $type";
- }, array_keys($selectedColumns), array_values($selectedColumns)));
- $sql .= "\n);\n\n";
- // 如果没有选择字段,则无需继续导出数据
- if ($fields === null) {
- return $sql;
- }
- // 构建INSERT INTO语句并导出数据
- $result = $this->query("SELECT * FROM `$table`");
- while ($row = $result->fetch_assoc()) {
- $columnNames = implode("`, `", array_keys($row));
- $columnValues = implode("', '", array_values($row));
- $sql .= "INSERT INTO `$table` (`$columnNames`) VALUES ('$columnValues');\n";
- }
- $sql .= "\n";
- return $sql;
- }
- public function listTables($databaseName) {
- $sql = "SHOW TABLES FROM $databaseName";
- $result = $this->query($sql);
- $tables = [];
- if ($result) {
- while ($row = $result->fetch_row()) {
- $tables[] = $row[0];
- }
- }
- return $tables;
- }
- public function startTransaction() {
- $this->conn->begin_transaction();
- }
- public function commitTransaction() {
- $this->conn->commit();
- }
- public function rollbackTransaction() {
- $this->conn->rollback();
- }
- public function renameTable($oldTableName, $newTableName) {
- $sql = "ALTER TABLE `$oldTableName` RENAME TO `$newTableName`";
- return $this->execute($sql);
- }
- public function truncateTable($table) {
- $sql = "TRUNCATE TABLE `$table`";
- return $this->execute($sql);
- }
- public function getLastInsertId() {
- return $this->conn->insert_id;
- }
- public function addForeignKey($tableName, $foreignKeyName, $columnName, $referencedTable, $referencedColumn, $onDelete = 'RESTRICT', $onUpdate = 'RESTRICT') {
- $sql = "ALTER TABLE `$tableName` ADD CONSTRAINT `$foreignKeyName` FOREIGN KEY (`$columnName`) REFERENCES `$referencedTable`(`$referencedColumn`) ON DELETE $onDelete ON UPDATE $onUpdate";
- return $this->execute($sql);
- }
- public function dropForeignKey($tableName, $foreignKeyName) {
- $sql = "ALTER TABLE `$tableName` DROP FOREIGN KEY `$foreignKeyName`";
- return $this->execute($sql);
- }
- public function getForeignKeys($tableName) {
- $sql = "SHOW CREATE TABLE $tableName";
- $result = $this->query($sql);
- $row = $result->fetch_row();
- $createTableStatement = $row[1]; // 获取创建表的语句
- // 使用正则表达式匹配外键约束
- preg_match_all('/FOREIGN KEY \(`(.*?)`\) REFERENCES `(.*?)`\.`(.*?)` \(`(.*?)`\)/', $createTableStatement, $matches, PREG_SET_ORDER);
- $foreignKeys = [];
- foreach ($matches as $match) {
- $foreignKey = [
- 'column' => $match[1], // 外键列名
- 'referenced_table' => $match[2], // 参考表名
- 'referenced_column' => $match[4] // 参考列名
- ];
- $foreignKeys[] = $foreignKey;
- }
- return $foreignKeys;
- }
- public function getTableInfo($tableName) {
- $sql = "SHOW TABLE STATUS LIKE '$tableName'";
- $result = $this->query($sql);
-
- if ($result && $result->num_rows > 0) {
- $tableInfo = $result->fetch_assoc();
- return [
- 'Name' => $tableInfo['Name'], // 表名
- 'Engine' => $tableInfo['Engine'], // 存储引擎
- 'Auto_increment' => $tableInfo['Auto_increment'], // 自动递增值
- 'Row_format' => $tableInfo['Row_format'], // 行格式
- 'Create_time' => $tableInfo['Create_time'], // 创建时间
- 'Index_length' => $tableInfo['Index_length'], // 索引长度
- 'Data_length' => $tableInfo['Data_length'], // 数据长度
- 'Data_free' => $tableInfo['Data_free'], // 数据可用空间
- 'Collation' => $tableInfo['Collation'], // 排序规则
- 'Comment' => $tableInfo['Comment'] // 表注释
- ];
- } else {
- return null;
- }
- }
- public function getSupportedEngines() {
- $sql = "SHOW ENGINES";
- $result = $this->query($sql);
- $engines = [];
- while ($row = $result->fetch_assoc()) {
- $engines[] = $row['Engine'];
- }
- return $engines;
- }
- public function changeTableEngine($tableName, $newEngine) {
- $sql = "ALTER TABLE $tableName ENGINE = $newEngine";
- return $this->execute($sql);
- }
- public function createTrigger($triggerName, $tableName, $triggerTime, $triggerEvent, $triggerLogic) {
- $sql = "CREATE TRIGGER $triggerName $triggerTime $triggerEvent ON $tableName FOR EACH ROW $triggerLogic";
- return $this->execute($sql);
- }
- public function dropTrigger($triggerName) {
- $sql = "DROP TRIGGER IF EXISTS $triggerName";
- return $this->execute($sql);
- }
- public function selectForUpdate($table, $columns = "*", $where = "", $lock = false) {
- $sql = "SELECT $columns FROM $table";
- if ($where != "") {
- $sql .= " WHERE $where";
- }
- if ($lock) {
- $sql .= " FOR UPDATE";
- }
- return $this->query($sql);
- }
- }
- ?>
- <?
- /* 1. 数据库连接和操作
- __construct: 构造函数,用于创建数据库连接。
- connect: 建立数据库连接。
- closeConnection: 关闭数据库连接。
- startTransaction: 开始事务。
- commitTransaction: 提交事务。
- rollbackTransaction: 回滚事务。
- 2. 用户和权限管理
- createUser: 创建新用户并授予特定权限。
- deleteUser: 删除用户。
- updateUserPrivileges: 更新用户权限。
- revokeUserPrivileges: 撤销用户权限。
- 3. 数据库管理
- createDatabase: 创建数据库。
- databaseExists: 检查数据库是否存在。
- selectDatabase: 选择要操作的数据库。
- dropDatabase: 删除数据库。
- 4. 数据表管理
- createTable: 创建数据表。
- tableExists: 检查数据表是否存在。
- renameTable: 重命名数据表。
- dropTable: 删除数据表。
- 5. 数据操作
- query: 执行 SQL 查询。
- execute: 执行 SQL 语句。
- insert: 向表中插入数据。
- update: 更新表中的数据。
- delete: 删除表中的数据。
- 6. 数据查询
- selectWithCount: 查询数据并返回总行数。
- paginate: 分页查询数据。
- selectForUpdate: 执行带锁的查询。
- 7. 列操作
- addColumn: 向表中添加新列。
- dropColumn: 从表中删除列。
- getColumnInfo: 获取列的信息。
- columnExists: 检查列是否存在。
- 8. 外键管理
- addForeignKey: 添加外键约束。
- dropForeignKey: 删除外键约束。
- getForeignKeys: 获取表中的外键信息。
- 9. SQL 文件导出
- exportTablesToSQLFile: 将数据库结构和数据导出到 SQL 文件。
- 10. 表信息查询
- listTables: 列出指定数据库中的所有表名。
- getTableInfo: 获取指定表的信息。
- 11. 触发器管理
- createTrigger: 创建触发器。
- dropTrigger: 删除触发器。
- 12. 其他辅助方法
- getLastInsertId: 获取最后插入行的 ID。
- getSupportedEngines: 获取支持的存储引擎。
- changeTableEngine: 更改表的存储引擎。 */
- /*这个类的用法示例*/
- // 设置数据库连接参数
- $host = 'localhost'; // 主机名
- $username = 'your_username'; // 用户名
- $password = 'your_password'; // 密码
- $database = 'your_database'; // 数据库名称,可以传入null
- $port = 3306; // 端口号(可选,默认为3306)
- // 实例化 MySQLDatabase 类并连接到数据库
- $database = new MySQLDatabase($host, $username, $password, $database, $port);
- //________________________________________________________________________________________________________________________________________________________________________________________________________
- // 开始事务
- $database->startTransaction();
- // 提交事务
- $database->commitTransaction();
- // 发生异常,回滚事务
- $database->rollbackTransaction();
- //________________________________________________________________________________________________________________________________________________________________________________________________________
-
-
-
- $databaseName = 'your_new_database';// 要创建的数据库名称
- $result = $database->createDatabase($databaseName);// 调用 createDatabase 方法创建一个数据库
- // 检查结果并输出消息
- if ($result) {
- echo "数据库 $databaseName 创建成功。";
- } else {
- echo "创建数据库失败:" . $database->conn->error;
- }
- //________________________________________________________________________________________________________________________________________________________________________________________________________
- $databaseName = 'your_database';// 要检查的数据库名称
- $exists = $database->databaseExists($databaseName);// 调用 databaseExists 方法检查数据库是否存在
- // 检查结果并输出消息
- if ($exists) {
- echo "数据库 $databaseName 存在。";
- } else {
- echo "数据库 $databaseName 不存在。";
- }
- //________________________________________________________________________________________________________________________________________________________________________________________________________
- $databaseName = 'your_database';// 要选择的数据库名称
- $result = $database->selectDatabase($databaseName);
- if ($result) {
- echo "成功选择数据库 $databaseName 。";
- } else {
- echo "选择数据库 $databaseName 失败。";
- }
- //________________________________________________________________________________________________________________________________________________________________________________________________________
- $databaseName = 'your_database';// 要删除的数据库名称
- $result = $database->dropDatabase($databaseName);// 调用 dropDatabase 方法删除数据库
- // 检查结果并输出消息
- if ($result) {
- echo "数据库 $databaseName 删除成功。";
- } else {
- echo "删除数据库 $databaseName 失败:" . $database->conn->error;
- }
- //________________________________________________________________________________________________________________________________________________________________________________________________________
- // 调用 selectWithCount 方法执行查询,此方法不支持分页,一般用于查询一条数据
- $result = $database->selectWithCount(
- 'your_table', // 要查询的表名
- 'id, name', // 要查询的字段,用逗号分隔,* 表示所有字段
- 'age > 18', // 可选的查询条件
- 'name', // 可选的排序字段,可以是 null,表示不排序
- 'ASC' // 可选的排序顺序,可以是 'ASC' 或 'DESC'
- );
- // 返回:count:总行数,data:数据结果
- //________________________________________________________________________________________________________________________________________________________________________________________________________
- // 调用 insert 方法插入数据
- $inserted = $database->insert(
- 'your_table', // 要插入数据的表名
- array( // 要插入的数据,键是字段名,值是要插入的值
- 'name' => 'John',
- 'age' => 30,
- 'email' => 'john@example.com'
- )
- );
- // 检查插入结果并输出消息
- if ($inserted) {
- echo "数据插入成功。";
- } else {
- echo "数据插入失败:" . $database->conn->error;
- }
- //________________________________________________________________________________________________________________________________________________________________________________________________________
- // 调用 update 方法更新数据
- $updated = $database->update(
- 'your_table', // 要更新数据的表名
- array( // 要更新的数据,键是字段名,值是要更新的值
- 'name' => 'John Doe',
- 'age' => 35
- ),
- 'id = 1' // 更新条件,可以是任何有效的 SQL WHERE 子句,例如 id = 1 OR user = 123
- );
- // 检查更新结果并输出消息
- if ($updated) {
- echo "数据更新成功。";
- } else {
- echo "数据更新失败:" . $database->conn->error;
- }
- //________________________________________________________________________________________________________________________________________________________________________________________________________
- // 调用 update2 方法更新记录
- //这个整体语句的意思是,更新your_table表的column1,column2,column3字段
- //其中column3字段更新的值,是从user表中的info字段提取,且条件是author=3,这种操作一般是用在跨表更新,动态更新等场景
- $updated = $database->update2(
- 'your_table', // 要更新的表名
- [ // 更新的数据,键为列名,值为要更新的值
- 'column1' => 'value1',
- 'column2' => 'value2',
- 'column3' => '[user.info.author = 3]',// 此处使用了格式为 [sourceTable.sourceColumn.sourceWhere] 的特殊语法,表示从另一张表中获取数据进行更新,这样的特殊语法需要用大括号,如果你更新的参数中也有大括号,请使用update方法
- ],
- 'id = 1' // 更新条件,此处假设更新 id 为 1 的记录
- );
- // 检查更新结果并输出消息
- if ($updated) {
- echo "记录更新成功。";
- } else {
- echo "更新记录失败:" . $database->conn->error;
- }
- //________________________________________________________________________________________________________________________________________________________________________________________________________
- // 调用 delete 方法删除行数据
- $deleted = $database->delete(
- 'your_table', // 要删除数据的表名
- 'id = 1' // 删除条件,可以是任何有效的 SQL WHERE 子句
- );
- // 检查删除结果并输出消息
- if ($deleted) {
- echo "数据删除成功。";
- } else {
- echo "数据删除失败:" . $database->conn->error;
- }
- //________________________________________________________________________________________________________________________________________________________________________________________________________
- // 调用 createTable 方法创建表
- $created = $database->createTable(
- 'your_table', // 要创建的表名
- array( // 要创建的字段和其属性
- 'id' => 'INT AUTO_INCREMENT PRIMARY KEY', // id字段,自增主键
- 'name' => 'VARCHAR(255)',
- 'age' => 'INT',
- 'email' => 'VARCHAR(255)'
- ),
- 'ENGINE=InnoDB AUTO_INCREMENT=10000' // 表选项,设置自增起始值为10000,此参数可以省略留空
- );
- // 检查创建结果并输出消息
- if ($created) {
- echo "表 your_table 创建成功,并设置自增起始值为10000。";
- } else {
- echo "创建表 your_table 失败:" . $database->conn->error;
- }
- //________________________________________________________________________________________________________________________________________________________________________________________________________
- // 调用 tableExists 方法检查表是否存在
- if ($database->tableExists('your_table')) {
- echo "表 your_table 存在。";
- } else {
- echo "表 your_table 不存在。";
- }
- //________________________________________________________________________________________________________________________________________________________________________________________________________
- // 调用 addColumn 方法添加列
- $added = $database->addColumn(
- 'your_table', // 表名
- 'new_column', // 列名
- 'VARCHAR(255)' // 列类型
- );
- // 检查添加结果并输出消息
- if ($added) {
- echo "列 new_column 添加成功到表 your_table。";
- } else {
- echo "添加列 new_column 到表 your_table 失败:" . $database->conn->error;
- }
- //________________________________________________________________________________________________________________________________________________________________________________________________________
- // 调用 addColumn 方法添加列,指定备注
- $addedWithComment = $database->addColumn(
- 'your_table', // 表名
- 'new_column_with_comment', // 列名
- 'VARCHAR(255)', // 列类型
- '这是一个新列的备注' // 列备注,此参数是一个可选参数,可以留空不传入
- );
- // 检查添加结果并输出消息
- if ($addedWithComment) {
- echo "列 new_column_with_comment 添加成功到表 your_table,备注为:这是一个新列的备注。";
- } else {
- echo "添加列 new_column_with_comment 到表 your_table 失败:" . $database->conn->error;
- }
- //________________________________________________________________________________________________________________________________________________________________________________________________________
- // 创建普通列
- if ($database->addColumn2(
- 'your_table_name', // 表名
- 'new_column', // 列名
- 'INT', // 数据类型
- false, // 是否自增主键
- null, // 自增主键的起始值
- 'Your comment' // 列的注释
- )) {
- echo "普通列创建成功!\n";
- } else {
- echo "普通列创建失败!\n";
- }
- // 创建自增主键列,自增 id 从 1000 开始
- if ($database->addColumn2(
- 'your_table_name', // 表名
- 'new_id_column', // 列名
- 'INT', // 数据类型
- true, // 是否自增主键
- 1000, // 自增主键的起始值
- 'Your comment' // 列的注释
- )) {
- echo "自增主键列创建成功!\n";
- } else {
- echo "自增主键列创建失败!\n";
- }
- //________________________________________________________________________________________________________________________________________________________________________________________________________
- // 调用 columnExists 方法检查列是否存在
- if ($database->columnExists(
- 'your_table', // 要检查的表名
- 'your_column' // 要检查的列名
- )) {
- echo "表 your_table 中存在列 your_column。";
- } else {
- echo "表 your_table 中不存在列 your_column。";
- }
- //________________________________________________________________________________________________________________________________________________________________________________________________________
- // 删除表 your_table_name 中的列 column_name
- if ($database->dropColumn('your_table_name', 'column_name')) {
- echo "成功删除表 'your_table_name' 中的列 'column_name'。\n"; // 输出删除成功信息
- } else {
- echo "删除表 'your_table_name' 中的列 'column_name' 失败。\n"; // 输出删除失败信息
- }
- //________________________________________________________________________________________________________________________________________________________________________________________________________
- //获取列信息
- $columnInfo = $database->getColumnInfo('your_table_name', 'your_column_name');
- if ($columnInfo !== null) {
- echo "列信息如下:\n";
- echo "列名:" . $columnInfo['Field'] . "\n";
- echo "数据类型:" . $columnInfo['Type'] . "\n";
- echo "备注:" . $columnInfo['Comment'] . "\n";
- echo "是否是主键:" . ($columnInfo['Key'] === 'PRI' ? '是' : '否') . "\n";
- } else {
- echo "获取列信息失败。\n";
- }
- //________________________________________________________________________________________________________________________________________________________________________________________________________
- // 调用 paginate 方法进行分页查询
- $result = $database->paginate(
- 'your_table', // 表名
- '*', // 要查询的列,这里使用通配符表示查询所有列
- 'age > 18', // WHERE 条件,查询年龄大于18岁的记录
- 2, // 当前页码
- 10, // 每页显示的记录数
- 'name', // 按照姓名列排序
- 'ASC' // 排序方式,升序
- );
- /* 返回参数说明:
- * - count: 查询结果的总行数
- * - totalPages: 总页数
- * - data: 分页查询返回的数据结果
- */
- // 输出查询结果
- print_r($result);
- //________________________________________________________________________________________________________________________________________________________________________________________________________
- // 调用 selectWithCountAndJoin 方法进行联合查询,二联表查询不支持分页,一般用于查询一条数据
- $result = $database->selectWithCountAndJoin(
- 'your_table', // 主表名
- '*', // 要查询的列,这里使用通配符表示查询所有列
- 'join_table', // 联合查询的表名
- 'your_table.id = join_table.id', // 联合查询的条件
- 'age > 18', // WHERE 条件,查询年龄大于18岁的记录
- 'name', // 按照姓名列排序
- 'ASC' // 排序方式,升序
- );
- // 输出查询结果
- print_r($result);
- //________________________________________________________________________________________________________________________________________________________________________________________________________
- // 调用 tripleTableQuery 方法进行三表联合查询,此三表联查方法,不支持分页,一般用于查一条数据
- $result = $database->tripleTableQuery(
- 'table1', // 第一个表名
- '*', // 第一个表要查询的列,这里使用通配符表示查询所有列
- 'table2', // 第二个表名
- 'table1.id = table2.table1_id', // 第二个表与第一个表的联合条件
- 'table3', // 第三个表名
- 'table2.id = table3.table2_id', // 第三个表与第二个表的联合条件
- 'age > 18', // WHERE 条件,查询年龄大于18岁的记录
- 'name', // 按照姓名列排序
- 'ASC' // 排序方式,升序
- );
- // 输出查询结果
- print_r($result);
- //________________________________________________________________________________________________________________________________________________________________________________________________________
- // 调用 paginateWithJoin 方法进行联合查询的分页,二联表查询支持分页,一般用于查询多条数据
- $result = $database->paginateWithJoin(
- 'your_table', // 主表名
- '*', // 要查询的列,这里使用通配符表示查询所有列
- 'join_table', // 联合查询的表名
- 'your_table.id = join_table.id', // 联合查询的条件
- 'age > 18', // WHERE 条件,查询年龄大于18岁的记录
- 2, // 当前页码
- 10, // 每页显示的记录数
- 'name', // 按照姓名列排序
- 'ASC' // 排序方式,升序
- );
- // 输出查询结果
- print_r($result);
- //________________________________________________________________________________________________________________________________________________________________________________________________________
- // 调用 tripleTableQueryWithPagination 方法进行三表联合查询的分页,三联表查询支持分页,一般用于查询多条数据
- $result = $database->tripleTableQueryWithPagination(
- 'table1', // 第一个表名
- '*', // 第一个表要查询的列,这里使用通配符表示查询所有列
- 'table2', // 第二个表名
- 'table1.id = table2.table1_id', // 第二个表与第一个表的联合条件
- 'table3', // 第三个表名
- 'table2.id = table3.table2_id', // 第三个表与第二个表的联合条件
- 'age > 18', // WHERE 条件,查询年龄大于18岁的记录
- 2, // 当前页码
- 10, // 每页显示的记录数
- 'name', // 按照姓名列排序
- 'ASC' // 排序方式,升序
- );
- // 输出查询结果
- print_r($result);
- //________________________________________________________________________________________________________________________________________________________________________________________________________
- // 要创建的用户信息
- $username = 'new_user'; // 要创建的用户的用户名
- $password = 'new_password'; // 要创建的用户的密码
- $databaseName = 'my_database'; // 要绑定用户到的数据库
- $privileges = 'SELECT, INSERT, UPDATE, DELETE'; // 设置用户权限为查询、插入、更新、删除和删除表列
- // 创建用户并绑定到数据库,并设置指定的权限,此方法主要使用场景是多租库,多库,数据隔离,权限隔离,多层架构
- $result = $database->createUser($username, $password, $databaseName, $privileges);
- if ($result) {
- echo "用户创建成功并已绑定到数据库,并且具有指定的权限。";
- } else {
- echo "用户创建失败或绑定到数据库失败。";
- }
- //________________________________________________________________________________________________________________________________________________________________________________________________________
- // 调用 deleteUser 方法删除用户
- $result = $database->deleteUser('new_user');
- // 检查删除操作是否成功
- if ($result === true) {
- echo "用户 $username 已成功删除。";
- } else {
- echo "删除用户 $username 失败:" . $database->conn->error;
- }
- //________________________________________________________________________________________________________________________________________________________________________________________________________
- // 要修改权限的用户的用户名
- $username = 'testuser';
- // 要授予的权限,例如:SELECT, INSERT, UPDATE, DELETE
- $privileges = 'SELECT, INSERT';
- // 要授予权限的数据库名称
- $databaseName = 'test_database';
- // 调用 updateUserPrivileges 方法修改用户权限
- $result = $database->updateUserPrivileges($username, $databaseName, $privileges);
- // 检查修改操作是否成功
- if ($result === true) {
- echo "用户 $username 的权限已成功修改。";
- } else {
- echo "修改用户 $username 的权限失败:" . $database->conn->error;
- }
- //________________________________________________________________________________________________________________________________________________________________________________________________________
- // 要取消权限的用户的用户名
- $username = 'testuser';
- // 要取消权限的数据库名称
- $databaseName = 'test_database';
- // 调用 revokeUserPrivileges 方法取消用户权限
- $result = $database->revokeUserPrivileges($username, $databaseName);
- // 检查取消操作是否成功
- if ($result === true) {
- echo "用户 $username 对数据库 $databaseName 的权限已成功取消。";
- } else {
- echo "取消用户 $username 对数据库 $databaseName 的权限失败:" . $database->conn->error;
- }
- //________________________________________________________________________________________________________________________________________________________________________________________________________
- // 定义 SQL 查询语句
- $sql = "SELECT * FROM users WHERE age > 25";
- // 执行自定义SQL查询并获取结果集
- $result = $database->query($sql);
- // 检查是否有结果
- if ($result->num_rows > 0) {
- // 遍历结果集并输出数据
- while ($row = $result->fetch_assoc()) {
- echo "Name: " . $row['name'] . ", Age: " . $row['age'] . "<br>";
- }
- } else {
- echo "没有匹配的记录";
- }
- //________________________________________________________________________________________________________________________________________________________________________________________________________
- // 定义要导出的库、表和字段
- $db = [
- ['database_name1' => ['table1' => ['field1', 'field2'], 'table2' => null]],//导出database_name1库的table1表的field1和field2字段,table2表的全部字段
- ['database_name2' => null]// 导出database_name2库的所有表的所有字段
- ];
- // 指定导出的 SQL 文件位置
- $sqlFilePath = 'export_tables.sql';
- // 调用方法导出数据
- if ($database->exportTablesToSQLFile($db, $sqlFilePath)) {
- echo "导出成功!";
- } else {
- echo "导出失败,请检查日志或重试。";
- }
- //________________________________________________________________________________________________________________________________________________________________________________________________________
- //列出一个库下的所有表
- $databaseName = 'your_database_name';
- $tables = $database->listTables($databaseName);
- if (!empty($tables)) {
- echo "库 '$databaseName' 下的表列表:\n";
- foreach ($tables as $table) {
- echo "$table\n";
- }
- } else {
- echo "库 '$databaseName' 下没有表。\n";
- }
- //________________________________________________________________________________________________________________________________________________________________________________________________________
- // 定义要重命名的旧表名和新表名
- $oldTableName = 'old_table';
- $newTableName = 'new_table';
- // 调用renameTable方法重命名表
- $result = $database->renameTable($oldTableName, $newTableName);
- // 检查重命名是否成功
- if ($result) {
- echo "表重命名成功!";
- } else {
- echo "表重命名失败!";
- }
- //________________________________________________________________________________________________________________________________________________________________________________________________________
- // 定义要清空数据的表名
- $table = 'table_name';
- // 调用truncateTable方法清空表数据
- $result = $database->truncateTable($table);
- // 检查清空操作是否成功
- if ($result) {
- echo "表数据清空成功!";
- } else {
- echo "表数据清空失败!";
- }
- //________________________________________________________________________________________________________________________________________________________________________________________________________
- // 获取上一次插入的自增ID
- $lastInsertId = $database->getLastInsertId();
- // 输出自增ID
- echo "上一次插入的自增ID为: $lastInsertId";
- //________________________________________________________________________________________________________________________________________________________________________________________________________
- // 假设要向log表添加一个外键约束,关联到user表的id字段
- $result = $database->addForeignKey(
- 'log', // 表名
- 'fk_author_user_id', // 外键名
- 'author', // 列名
- 'user', // 引用表名
- 'id', // 引用列名
- 'CASCADE', // ON DELETE操作,参数见下方注释
- 'CASCADE' // ON UPDATE操作,参数见下方注释
- );
- // 检查外键约束是否添加成功
- if ($result) {
- echo "外键约束添加成功!";
- } else {
- echo "外键约束添加失败!";
- }
- /* ON DELETE 操作:
- CASCADE(级联删除): 当父表中的行被删除时,子表中的对应行也会被自动删除。
- RESTRICT(限制): 默认选项。如果在父表中存在与子表相关的行,则不允许删除父表中的行。删除操作会失败,并返回错误。
- SET NULL(设置为 NULL): 当父表中的行被删除时,子表中的对应列会被设置为 NULL。
- NO ACTION(无操作): 当父表中的行被删除时,不会对子表中的任何行执行任何操作。
- ON UPDATE 操作:
- CASCADE(级联更新): 当父表中的行被更新时,子表中的对应行也会被自动更新。
- RESTRICT(限制): 默认选项。如果在父表中存在与子表相关的行,则不允许更新父表中的行。更新操作会失败,并返回错误。
- SET NULL(设置为 NULL): 当父表中的行被更新时,子表中的对应列会被设置为 NULL。
- NO ACTION(无操作): 当父表中的行被更新时,不会对子表中的任何行执行任何操作。 */
- /* 常见的不支持外键约束的数据库引擎包括:
- MyISAM: MyISAM 是 MySQL 数据库的一种引擎,它不支持外键约束。
- Memory (Heap): Memory 或 Heap 引擎是 MySQL 的另一种引擎,它也不支持外键约束。
- CSV: CSV 引擎用于读写 CSV 文件,也不支持外键约束。
- ARCHIVE: ARCHIVE 引擎用于存档数据,同样不支持外键约束。
- 常见的支持外键约束的数据库引擎包括:
- InnoDB: InnoDB 是 MySQL 数据库的默认存储引擎,也是最常用的支持外键约束的引擎之一。
- PostgreSQL: PostgreSQL 是另一个流行的关系型数据库,它也支持外键约束。
- SQL Server: Microsoft SQL Server 支持外键约束,允许您在表之间建立关系。
- Oracle: Oracle 数据库也支持外键约束,允许您实现表之间的关系完整性。
- */
- //________________________________________________________________________________________________________________________________________________________________________________________________________
- // 假设要从log表中删除之前添加的外键约束
- $result = $database->dropForeignKey(
- 'log', // 表名
- 'fk_author_user_id' // 外键名
- );
- // 检查外键约束是否删除成功
- if ($result) {
- echo "外键约束删除成功!";
- } else {
- echo "外键约束删除失败!";
- }
- //________________________________________________________________________________________________________________________________________________________________________________________________________
- //获取表信息
- $tableInfo = $database->getTableInfo('table_name');
- if ($tableInfo !== null) {
- echo "表名: " . $tableInfo['Name'] . "\n";
- echo "存储引擎: " . $tableInfo['Engine'] . "\n";
- echo "自动递增值: " . $tableInfo['Auto_increment'] . "\n";
- echo "行格式: " . $tableInfo['Row_format'] . "\n";
- echo "创建时间: " . $tableInfo['Create_time'] . "\n";
- echo "索引长度: " . $tableInfo['Index_length'] . "\n";
- echo "数据长度: " . $tableInfo['Data_length'] . "\n";
- echo "数据可用空间: " . $tableInfo['Data_free'] . "\n";
- echo "排序规则: " . $tableInfo['Collation'] . "\n";
- echo "表注释: " . $tableInfo['Comment'] . "\n";
- } else {
- echo "未找到表或查询失败。";
- }
- //________________________________________________________________________________________________________________________________________________________________________________________________________
- $supportedEngines = $database->getSupportedEngines();
- // 输出支持的引擎列表
- echo "当前服务器支持的引擎列表:\n";
- foreach ($supportedEngines as $engine) {
- echo "- $engine\n";
- }
- //________________________________________________________________________________________________________________________________________________________________________________________________________
- // 更换表的引擎
- $tableName = 'my_table';//表
- $newEngine = 'InnoDB';//要更换的引擎
- $result = $database->changeTableEngine($tableName, $newEngine);
- // 检查操作结果
- if ($result) {
- echo "成功将表 $tableName 的引擎更换为 $newEngine\n";
- } else {
- echo "更换表引擎失败\n";
- }
- //________________________________________________________________________________________________________________________________________________________________________________________________________
- // 创建触发器示例
- $result = $database->createTrigger(
- 'update_salary_trigger', // 触发器名称
- 'user', // 表名
- 'AFTER', // 触发时间
- 'UPDATE', // 触发事件
- 'BEGIN
- DECLARE total_salary INT;
- SELECT SUM(money) INTO total_salary FROM user;
- UPDATE info SET new = total_salary WHERE id = 1;
- END' // 触发器逻辑
- );
- if ($result) {
- echo "触发器创建成功!";
- } else {
- echo "触发器创建失败!";
- }
- /* 触发时间参数可以填的值包括:
- BEFORE:表示触发器在触发事件之前执行。
- AFTER:表示触发器在触发事件之后执行。
- 触发事件参数可以选的值包括:
- INSERT:表示在执行插入操作时触发。
- UPDATE:表示在执行更新操作时触发。
- DELETE:表示在执行删除操作时触发。 */
- //________________________________________________________________________________________________________________________________________________________________________________________________________
- // 删除触发器示例
- $database->dropTrigger('触发器名称');
- //________________________________________________________________________________________________________________________________________________________________________________________________________
- // 开始事务
- $db->startTransaction();
- // 查询并锁定特定行
- $database->selectForUpdate('table', "*", "id=1",true);
- // 在此事务中进行其他操作,例如更新或删除
- // 提交事务
- $db->commitTransaction();
- //________________________________________________________________________________________________________________________________________________________________________________________________________
- // 调用 closeConnection 方法关闭数据库连接
- $database->closeConnection();
- // 确认连接是否已关闭,测试,这个判断在win环境下会报错,未知原因
- if ($database->conn === null) {
- echo "数据库连接已关闭。";
- } else {
- echo "关闭数据库连接失败。";
- }
- ?>
复制代码
|
|