PHP的mysql数据库操作类php

/ / 2024-11-06   阅读:2559
PHP的mysql数据库操作类...

数据库操作类包含

1.数据库连接和操作

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: 更改表的存储引擎。


上面只列举了一些主要的方法,当然,它还支持联表,三联表查询,支持分页,提供了多种改数据的方法,支持特殊语法,新值从数据库直接获取

这些方法在源码中,都提供了示例和详细的备注,一般的数据库类只提供了增删改查,而这个类提供了更为丰富的功能,能够执行更多复杂的数据库操作


当你开发了一个PHP程序,再也不用去自己手动构造数据库了,使用这个类,你需要的功能,它基本都有了


代码部分:

<?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 "关闭数据库连接失败。";
}


?>


我要评论

昵称:
验证码:

最新评论

共0条 共0页 10条/页 首页 上一页 下一页 尾页
意见反馈