PHP的mysql数据库操作类php
数据库操作类包含
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 "关闭数据库连接失败。"; } ?>
我要评论