找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 42|回复: 0

[PHP] PHP操作数据库

[复制链接]

1883

主题

520

回帖

7366

积分

管理员

积分
7366
发表于 2024-6-13 18:06:28 | 显示全部楼层 |阅读模式
  1. <?php
  2. class MySQLDatabase {
  3.     private $host;
  4.     private $username;
  5.     private $password;
  6.     private $database;
  7.     private $port;
  8.     private $conn;

  9.     public function __construct($host, $username, $password, $database, $port = 3306) {
  10.         $this->host = "p:" . $host;
  11.         $this->username = $username;
  12.         $this->password = $password;
  13.         $this->database = $database;
  14.         $this->port = $port;
  15.         $this->connect();
  16.     }

  17.     private function connect() {
  18.         $this->conn = new mysqli($this->host, $this->username, $this->password, $this->database, $this->port);
  19.         if ($this->conn->connect_error) {
  20.             die("连接失败:" . $this->conn->connect_error);
  21.         }
  22.         $this->conn->set_charset("utf8mb4");
  23.     }
  24.     public function query($sql) {
  25.         return $this->conn->query($sql);
  26.     }
  27.     public function execute($sql) {
  28.         return $this->conn->query($sql);
  29.     }
  30.         public function createUser($username, $password, $database, $privileges = 'ALL PRIVILEGES') {
  31.         $sqlCreateUser = "CREATE USER '$username'@'localhost' IDENTIFIED BY '$password'";
  32.         $sqlGrantPrivileges = "GRANT $privileges ON `$database`.* TO '$username'@'localhost'";
  33.         $resultCreateUser = $this->execute($sqlCreateUser);
  34.         if (!$resultCreateUser) {
  35.             return false;
  36.         }
  37.         $resultGrantPrivileges = $this->execute($sqlGrantPrivileges);
  38.         if (!$resultGrantPrivileges) {
  39.             $this->execute("DROP USER '$username'@'localhost'");
  40.             return false;
  41.         }

  42.         return true;
  43.     }
  44.         public function deleteUser($username) {
  45.                 $sql = "DROP USER IF EXISTS '$username'@'localhost'";
  46.                 $result = $this->conn->query($sql);
  47.                 return $result;
  48.         }
  49.         public function updateUserPrivileges($username, $database, $privileges) {
  50.                 $sql = "GRANT $privileges ON $database.* TO '$username'@'localhost'";
  51.                 $result = $this->conn->query($sql);
  52.                 return $result;
  53.         }
  54.         public function revokeUserPrivileges($username, $database) {
  55.                 $sql = "REVOKE ALL PRIVILEGES ON $database.* FROM '$username'@'localhost'";
  56.                 $result = $this->conn->query($sql);
  57.                 return $result;
  58.         }

  59.         public function createDatabase($databaseName) {
  60.         $sql = "CREATE DATABASE IF NOT EXISTS $databaseName";
  61.         return $this->execute($sql);
  62.     }
  63.     public function databaseExists($databaseName) {
  64.         $result = $this->query("SHOW DATABASES LIKE '$databaseName'");
  65.         return $result->num_rows > 0;
  66.     }
  67.     public function selectDatabase($databaseName) {
  68.         if ($this->databaseExists($databaseName)) {
  69.             $this->database = $databaseName;
  70.             return $this->conn->select_db($databaseName);
  71.         } else {
  72.             return false;
  73.         }
  74.     }
  75.         public function dropDatabase($databaseName) {
  76.         $sql = "DROP DATABASE IF EXISTS $databaseName";
  77.         return $this->execute($sql);
  78.     }
  79.         public function selectWithCount($table, $columns = "*", $where = "", $orderByColumn = null, $orderByDirection = 'ASC') {
  80.         $sql = "SELECT SQL_CALC_FOUND_ROWS $columns FROM $table";
  81.         if ($where != "") {
  82.             $sql .= " WHERE $where";
  83.         }
  84.         if ($orderByColumn !== null) {
  85.             $sql .= " ORDER BY $orderByColumn $orderByDirection";
  86.         }
  87.         $result = $this->query($sql);
  88.         $data = $result->fetch_all(MYSQLI_ASSOC);

  89.         // 获取总行数
  90.         $countResult = $this->query("SELECT FOUND_ROWS() as totalRows");
  91.         $totalCount = $countResult->fetch_assoc()['totalRows'];

  92.         return ['count' => $totalCount, 'data' => $data];
  93.     }
  94.     public function insert($table, $data) {
  95.         $columns = implode(", ", array_keys($data));
  96.         $values = implode(", ", array_fill(0, count($data), '?'));

  97.         $sql = "INSERT INTO $table ($columns) VALUES ($values)";
  98.         $stmt = $this->conn->prepare($sql);

  99.         $types = str_repeat('s', count($data));
  100.         $stmt->bind_param($types, ...array_values($data));

  101.         return $stmt->execute();
  102.     }
  103.         public function update($table, $data, $where) {
  104.         $set = "";
  105.         $types = "";

  106.         foreach ($data as $key => $value) {
  107.             $set .= "$key = ?, ";
  108.             $types .= 's';
  109.         }
  110.         $set = rtrim($set, ", ");

  111.         $sql = "UPDATE $table SET $set WHERE $where";
  112.         $stmt = $this->conn->prepare($sql);

  113.         $stmt->bind_param($types, ...array_values($data));

  114.         return $stmt->execute();
  115.     }
  116.     public function delete($table, $where) {
  117.         $sql = "DELETE FROM $table WHERE $where";
  118.         return $this->execute($sql);
  119.     }
  120.     public function createTable($table, $columns, $tableOptions = '') {
  121.                 $sql = "CREATE TABLE IF NOT EXISTS $table (";
  122.                 foreach ($columns as $columnName => $columnDetails) {
  123.                         $sql .= "$columnName $columnDetails, ";
  124.                 }
  125.                 $sql = rtrim($sql, ", ");
  126.                 $sql .= ") $tableOptions"; // 添加表选项
  127.                 return $this->execute($sql);
  128.         }

  129.     public function tableExists($table) {
  130.         $result = $this->query("SHOW TABLES LIKE '$table'");
  131.         return $result->num_rows > 0;
  132.     }
  133.     public function addColumn($table, $column, $type, $comment = '') {
  134.                 $typeWithComment = ($comment !== '') ? "$type COMMENT '$comment'" : $type;
  135.                 $sql = "ALTER TABLE $table ADD $column $typeWithComment";
  136.                 return $this->execute($sql);
  137.         }
  138.         public function addColumn2($table, $column, $type, $autoIncrement = false, $startValue = null, $comment = '') {
  139.                 $typeWithComment = ($comment !== '') ? "$type COMMENT '$comment'" : $type;
  140.                 $sql = "ALTER TABLE $table ADD $column $typeWithComment";

  141.                 // 如果 $autoIncrement 为 true,则将该列设置为 AUTO_INCREMENT
  142.                 if ($autoIncrement) {
  143.                         $autoIncrementClause = " AUTO_INCREMENT";
  144.                         if ($startValue !== null) {
  145.                                 $autoIncrementClause .= " AUTO_INCREMENT=$startValue";
  146.                         }
  147.                         $sql .= $autoIncrementClause;
  148.                 }

  149.                 $this->execute($sql);
  150.                
  151.                 // 如果 $autoIncrement 为 true,则将该列设置为表的主键
  152.                 if ($autoIncrement) {
  153.                         $this->execute("ALTER TABLE $table MODIFY COLUMN $column $type AUTO_INCREMENT");
  154.                         $this->execute("ALTER TABLE $table ADD PRIMARY KEY ($column)");
  155.                 }
  156.         }
  157.         public function dropColumn($table, $column) {
  158.                 $sql = "ALTER TABLE $table DROP COLUMN $column";
  159.                 return $this->execute($sql);
  160.         }
  161.     public function getColumnInfo($table, $column) {
  162.         $sql = "SHOW FULL COLUMNS FROM $table WHERE Field = '$column'";
  163.         $result = $this->query($sql);

  164.         if ($result->num_rows == 1) {
  165.             $columnInfo = $result->fetch_assoc();
  166.             return [
  167.                 'Field' => $columnInfo['Field'],          // 列名
  168.                 'Type' => $columnInfo['Type'],            // 数据类型
  169.                 'Collation' => $columnInfo['Collation'],  // 字符集
  170.                 'Null' => $columnInfo['Null'],            // 是否允许为空
  171.                 'Key' => $columnInfo['Key'],              // 是否是主键
  172.                 'Default' => $columnInfo['Default'],      // 默认值
  173.                 'Extra' => $columnInfo['Extra'],          // 额外信息
  174.                 'Comment' => $columnInfo['Comment']       // 备注
  175.             ];
  176.         } else {
  177.             return null; // 如果列不存在或查询失败,返回null
  178.         }
  179.     }
  180.     public function columnExists($table, $column) {
  181.         $result = $this->query("SHOW COLUMNS FROM $table LIKE '$column'");
  182.         return $result->num_rows > 0;
  183.     }

  184.         public function paginate($table, $columns = "*", $where = "", $page = 1, $pageSize = 10, $orderByColumn = null, $orderByDirection = 'ASC') {
  185.         $offset = ($page - 1) * $pageSize;
  186.         $sql = "SELECT SQL_CALC_FOUND_ROWS $columns FROM $table";
  187.         if ($where != "") {
  188.             $sql .= " WHERE $where";
  189.         }
  190.         if ($orderByColumn !== null) {
  191.             $sql .= " ORDER BY $orderByColumn $orderByDirection";
  192.         }
  193.         $sql .= " LIMIT $offset, $pageSize";
  194.         $result = $this->query($sql);
  195.         $data = $result->fetch_all(MYSQLI_ASSOC);
  196.         $countResult = $this->query("SELECT FOUND_ROWS() as totalRows");
  197.         $totalCount = $countResult->fetch_assoc()['totalRows'];
  198.         $totalPages = ceil($totalCount / $pageSize);
  199.         return ['count' => $totalCount, 'totalPages' => $totalPages, 'data' => $data];
  200.     }
  201.         public function selectWithCountAndJoin($table, $columns = "*", $joinTable, $joinCondition, $where = "", $orderByColumn = null, $orderByDirection = 'ASC') {
  202.                 $sql = "SELECT $columns FROM $table INNER JOIN $joinTable ON $joinCondition";
  203.                 if ($where != "") {
  204.                         $sql .= " WHERE $where";
  205.                 }
  206.                 if ($orderByColumn !== null) {
  207.                         $sql .= " ORDER BY $orderByColumn $orderByDirection";
  208.                 }
  209.                 $result = $this->query($sql);
  210.                 $rowCount = $result->num_rows;
  211.                 $data = $result->fetch_all(MYSQLI_ASSOC);
  212.                 return ['count' => $rowCount, 'data' => $data];
  213.         }
  214.         public function paginateWithJoin($table, $columns = "*", $joinTable, $joinCondition, $where = "", $page = 1, $pageSize = 10, $orderByColumn = null, $orderByDirection = 'ASC') {
  215.                 $offset = ($page - 1) * $pageSize;
  216.                 $sql = "SELECT $columns FROM $table INNER JOIN $joinTable ON $joinCondition";
  217.                 if ($where != "") {
  218.                         $sql .= " WHERE $where";
  219.                 }
  220.                 if ($orderByColumn !== null) {
  221.                         $sql .= " ORDER BY $orderByColumn $orderByDirection";
  222.                 }
  223.                 $sql .= " LIMIT $offset, $pageSize";
  224.                 $result = $this->query($sql);
  225.                 $rowCount = $result->num_rows;
  226.                 $totalPages = ceil($rowCount / $pageSize);
  227.                 $data = $result->fetch_all(MYSQLI_ASSOC);
  228.                 return ['count' => $rowCount, 'totalPages' => $totalPages, 'data' => $data];
  229.         }
  230.     public function tripleTableQueryWithPagination(
  231.         $table,
  232.         $columns = "*",
  233.         $joinTable1,
  234.         $joinCondition1,
  235.         $joinTable2,
  236.         $joinCondition2,
  237.         $where = "",
  238.         $page = 1,
  239.         $pageSize = 10,
  240.         $orderByColumn = null,
  241.         $orderByDirection = 'ASC'
  242.     ) {
  243.         $offset = ($page - 1) * $pageSize;
  244.         $sql = "SELECT $columns FROM $table
  245.                 INNER JOIN $joinTable1 ON $joinCondition1
  246.                 INNER JOIN $joinTable2 ON $joinCondition2";
  247.         if ($where != "") {
  248.             $sql .= " WHERE $where";
  249.         }
  250.         if ($orderByColumn !== null) {
  251.             $sql .= " ORDER BY $orderByColumn $orderByDirection";
  252.         }
  253.         $sql .= " LIMIT $offset, $pageSize";
  254.         $result = $this->query($sql);
  255.         $rowCount = $result->num_rows;
  256.         $totalPages = ceil($rowCount / $pageSize);
  257.         $data = $result->fetch_all(MYSQLI_ASSOC);
  258.         return ['count' => $rowCount, 'totalPages' => $totalPages, 'data' => $data];
  259.     }
  260.     public function tripleTableQuery(
  261.         $table,
  262.         $columns = "*",
  263.         $joinTable1,
  264.         $joinCondition1,
  265.         $joinTable2,
  266.         $joinCondition2,
  267.         $where = "",
  268.         $orderByColumn = null,
  269.         $orderByDirection = 'ASC'
  270.     ) {
  271.         $sql = "SELECT $columns FROM $table
  272.                 INNER JOIN $joinTable1 ON $joinCondition1
  273.                 INNER JOIN $joinTable2 ON $joinCondition2";
  274.         if ($where != "") {
  275.             $sql .= " WHERE $where";
  276.         }
  277.         if ($orderByColumn !== null) {
  278.             $sql .= " ORDER BY $orderByColumn $orderByDirection";
  279.         }
  280.         $result = $this->query($sql);
  281.         $rowCount = $result->num_rows;
  282.         $data = $result->fetch_all(MYSQLI_ASSOC);
  283.         return ['count' => $rowCount, 'data' => $data];
  284.     }
  285.         public function update2($table, $data, $where) {
  286.                 foreach ($data as $key => $value) {
  287.                         if (is_string($value) && preg_match('/\[(.+?)\]/', $value, $matches)) {
  288.                                 $parts = explode('.', $matches[1]);
  289.                                 if (count($parts) >= 2) {
  290.                                         list($sourceTable, $sourceColumn, $sourceWhere) = $parts;
  291.                                         if ($this->tableExists($sourceTable)) {
  292.                                                 $sourceWhere = ($sourceWhere !== '') ? $sourceWhere : null;
  293.                                                 if ($this->columnExists($sourceTable, $sourceColumn)) {
  294.                                                         $sourceData = $this->selectWithCount($sourceTable, $sourceColumn, $sourceWhere);
  295.                                                         $replacement = isset($sourceData['data'][0][$sourceColumn]) ? $sourceData['data'][0][$sourceColumn] : null;
  296.                                                         $data[$key] = ($replacement !== null) ? $replacement : $matches[1];
  297.                                                 }
  298.                                         }
  299.                                 }
  300.                         }
  301.                 }
  302.                 $set = "";
  303.                 $types = "";
  304.                 foreach ($data as $key => $value) {
  305.                         $set .= "$key = ?, ";
  306.                         $types .= 's';
  307.                 }
  308.                 $set = rtrim($set, ", ");
  309.                 $sql = "UPDATE $table SET $set WHERE $where";
  310.                 $stmt = $this->conn->prepare($sql);
  311.                 $stmt->bind_param($types, ...array_values($data));
  312.                 return $stmt->execute();
  313.         }
  314.         public function closeConnection() {
  315.         if ($this->conn !== null) {
  316.             $this->conn->close();
  317.             $this->conn = null;
  318.         }
  319.     }
  320.        
  321.         public function exportTablesToSQLFile($db, $sqlFilePath) {
  322.                 // 规范化文件路径
  323.                 $sqlFilePath = realpath($sqlFilePath);

  324.                 // 检查目标路径是否存在并可写
  325.                 if (!$sqlFilePath || !is_writable(dirname($sqlFilePath))) {
  326.                         // 路径不存在或不可写,记录日志或抛出异常
  327.                         return false;
  328.                 }

  329.                 // 打开文件,准备写入SQL
  330.                 $fp = fopen($sqlFilePath, 'w');
  331.                 if (!$fp) {
  332.                         // 文件打开失败,记录日志或抛出异常
  333.                         return false;
  334.                 }

  335.                 foreach ($db as $databaseData) {
  336.                         foreach ($databaseData as $dbName => $tables) {
  337.                                 if ($tables === null) {
  338.                                         // 导出数据库中的所有表及其所有字段
  339.                                         $tables = $this->getAllTablesAndFields($dbName);
  340.                                 }

  341.                                 foreach ($tables as $tableName => $fields) {
  342.                                         // 导出表结构
  343.                                         fwrite($fp, $this->generateTableExportSQL($dbName, $tableName, $fields));

  344.                                         // 导出表数据
  345.                                         $result = $this->query("SELECT * FROM `$dbName`.`$tableName`");
  346.                                         while ($row = $result->fetch_assoc()) {
  347.                                                 $columnNames = implode("`, `", array_keys($row));
  348.                                                 $columnValues = implode("', '", array_values($row));
  349.                                                 $sql = "INSERT INTO `$dbName`.`$tableName` (`$columnNames`) VALUES ('$columnValues');\n";
  350.                                                 fwrite($fp, $sql);
  351.                                         }
  352.                                 }
  353.                         }
  354.                 }

  355.                 // 关闭文件句柄
  356.                 fclose($fp);
  357.                 return true;
  358.         }

  359.         // 获取指定数据库中的所有表及其所有字段
  360.         private function getAllTablesAndFields($dbName) {
  361.                 $tables = [];
  362.                 $result = $this->query("SHOW TABLES FROM `$dbName`");
  363.                 while ($row = $result->fetch_row()) {
  364.                         $tableName = $row[0];
  365.                         $tables[$tableName] = null; // 导出表的所有字段
  366.                 }
  367.                 return $tables;
  368.         }


  369.         private function generateTableExportSQL($table, $fields = null) {
  370.                 // 初始化SQL变量
  371.                 $sql = '';

  372.                 // 获取表结构
  373.                 $result = $this->query("SHOW COLUMNS FROM `$table`");
  374.                 $columns = [];
  375.                 while ($row = $result->fetch_assoc()) {
  376.                         $columns[$row['Field']] = $row['Type'];
  377.                 }

  378.                 // 构建CREATE TABLE语句
  379.                 $sql .= "DROP TABLE IF EXISTS `$table`;\n";
  380.                 $sql .= "CREATE TABLE `$table` (\n";

  381.                 // 选择需要导出的字段
  382.                 $selectedColumns = ($fields === null) ? $columns : array_intersect_key($columns, array_flip($fields));

  383.                 // 将字段添加到CREATE TABLE语句中
  384.                 $sql .= implode(",\n", array_map(function ($column, $type) {
  385.                         return "  `$column` $type";
  386.                 }, array_keys($selectedColumns), array_values($selectedColumns)));

  387.                 $sql .= "\n);\n\n";

  388.                 // 如果没有选择字段,则无需继续导出数据
  389.                 if ($fields === null) {
  390.                         return $sql;
  391.                 }

  392.                 // 构建INSERT INTO语句并导出数据
  393.                 $result = $this->query("SELECT * FROM `$table`");
  394.                 while ($row = $result->fetch_assoc()) {
  395.                         $columnNames = implode("`, `", array_keys($row));
  396.                         $columnValues = implode("', '", array_values($row));
  397.                         $sql .= "INSERT INTO `$table` (`$columnNames`) VALUES ('$columnValues');\n";
  398.                 }

  399.                 $sql .= "\n";

  400.                 return $sql;
  401.         }
  402.     public function listTables($databaseName) {
  403.         $sql = "SHOW TABLES FROM $databaseName";
  404.         $result = $this->query($sql);

  405.         $tables = [];
  406.         if ($result) {
  407.             while ($row = $result->fetch_row()) {
  408.                 $tables[] = $row[0];
  409.             }
  410.         }

  411.         return $tables;
  412.     }
  413.         public function startTransaction() {
  414.         $this->conn->begin_transaction();
  415.     }

  416.     public function commitTransaction() {
  417.         $this->conn->commit();
  418.     }

  419.     public function rollbackTransaction() {
  420.         $this->conn->rollback();
  421.     }
  422.         public function renameTable($oldTableName, $newTableName) {
  423.                 $sql = "ALTER TABLE `$oldTableName` RENAME TO `$newTableName`";
  424.                 return $this->execute($sql);
  425.         }
  426.         public function truncateTable($table) {
  427.                 $sql = "TRUNCATE TABLE `$table`";
  428.                 return $this->execute($sql);
  429.         }
  430.         public function getLastInsertId() {
  431.                 return $this->conn->insert_id;
  432.         }
  433.         public function addForeignKey($tableName, $foreignKeyName, $columnName, $referencedTable, $referencedColumn, $onDelete = 'RESTRICT', $onUpdate = 'RESTRICT') {
  434.                 $sql = "ALTER TABLE `$tableName` ADD CONSTRAINT `$foreignKeyName` FOREIGN KEY (`$columnName`) REFERENCES `$referencedTable`(`$referencedColumn`) ON DELETE $onDelete ON UPDATE $onUpdate";
  435.                 return $this->execute($sql);
  436.         }

  437.         public function dropForeignKey($tableName, $foreignKeyName) {
  438.                 $sql = "ALTER TABLE `$tableName` DROP FOREIGN KEY `$foreignKeyName`";
  439.                 return $this->execute($sql);
  440.         }
  441.         public function getForeignKeys($tableName) {
  442.                 $sql = "SHOW CREATE TABLE $tableName";
  443.                 $result = $this->query($sql);
  444.                 $row = $result->fetch_row();
  445.                 $createTableStatement = $row[1]; // 获取创建表的语句

  446.                 // 使用正则表达式匹配外键约束
  447.                 preg_match_all('/FOREIGN KEY \(`(.*?)`\) REFERENCES `(.*?)`\.`(.*?)` \(`(.*?)`\)/', $createTableStatement, $matches, PREG_SET_ORDER);

  448.                 $foreignKeys = [];
  449.                 foreach ($matches as $match) {
  450.                         $foreignKey = [
  451.                                 'column' => $match[1],       // 外键列名
  452.                                 'referenced_table' => $match[2], // 参考表名
  453.                                 'referenced_column' => $match[4] // 参考列名
  454.                         ];
  455.                         $foreignKeys[] = $foreignKey;
  456.                 }

  457.                 return $foreignKeys;
  458.         }
  459.         public function getTableInfo($tableName) {
  460.                 $sql = "SHOW TABLE STATUS LIKE '$tableName'";
  461.                 $result = $this->query($sql);
  462.    
  463.                 if ($result && $result->num_rows > 0) {
  464.                         $tableInfo = $result->fetch_assoc();
  465.                         return [
  466.                                 'Name' => $tableInfo['Name'],                     // 表名
  467.                                 'Engine' => $tableInfo['Engine'],                 // 存储引擎
  468.                                 'Auto_increment' => $tableInfo['Auto_increment'], // 自动递增值
  469.                                 'Row_format' => $tableInfo['Row_format'],         // 行格式
  470.                                 'Create_time' => $tableInfo['Create_time'],       // 创建时间
  471.                                 'Index_length' => $tableInfo['Index_length'],     // 索引长度
  472.                                 'Data_length' => $tableInfo['Data_length'],       // 数据长度
  473.                                 'Data_free' => $tableInfo['Data_free'],           // 数据可用空间
  474.                                 'Collation' => $tableInfo['Collation'],           // 排序规则
  475.                                 'Comment' => $tableInfo['Comment']                // 表注释
  476.                         ];
  477.                 } else {
  478.                         return null;
  479.                 }
  480.         }
  481.         public function getSupportedEngines() {
  482.                 $sql = "SHOW ENGINES";
  483.                 $result = $this->query($sql);

  484.                 $engines = [];
  485.                 while ($row = $result->fetch_assoc()) {
  486.                         $engines[] = $row['Engine'];
  487.                 }

  488.                 return $engines;
  489.         }
  490.         public function changeTableEngine($tableName, $newEngine) {
  491.                 $sql = "ALTER TABLE $tableName ENGINE = $newEngine";
  492.                 return $this->execute($sql);
  493.         }
  494.         public function createTrigger($triggerName, $tableName, $triggerTime, $triggerEvent, $triggerLogic) {
  495.         $sql = "CREATE TRIGGER $triggerName $triggerTime $triggerEvent ON $tableName FOR EACH ROW $triggerLogic";
  496.         return $this->execute($sql);
  497.     }
  498.         public function dropTrigger($triggerName) {
  499.         $sql = "DROP TRIGGER IF EXISTS $triggerName";
  500.         return $this->execute($sql);
  501.     }
  502.         public function selectForUpdate($table, $columns = "*", $where = "", $lock = false) {
  503.                 $sql = "SELECT $columns FROM $table";
  504.                 if ($where != "") {
  505.                         $sql .= " WHERE $where";
  506.                 }
  507.                 if ($lock) {
  508.                         $sql .= " FOR UPDATE";
  509.                 }

  510.                 return $this->query($sql);
  511.         }
  512. }
  513. ?>
  514. <?
  515. /* 1. 数据库连接和操作
  516. __construct: 构造函数,用于创建数据库连接。
  517. connect: 建立数据库连接。
  518. closeConnection: 关闭数据库连接。
  519. startTransaction: 开始事务。
  520. commitTransaction: 提交事务。
  521. rollbackTransaction: 回滚事务。
  522. 2. 用户和权限管理
  523. createUser: 创建新用户并授予特定权限。
  524. deleteUser: 删除用户。
  525. updateUserPrivileges: 更新用户权限。
  526. revokeUserPrivileges: 撤销用户权限。
  527. 3. 数据库管理
  528. createDatabase: 创建数据库。
  529. databaseExists: 检查数据库是否存在。
  530. selectDatabase: 选择要操作的数据库。
  531. dropDatabase: 删除数据库。
  532. 4. 数据表管理
  533. createTable: 创建数据表。
  534. tableExists: 检查数据表是否存在。
  535. renameTable: 重命名数据表。
  536. dropTable: 删除数据表。
  537. 5. 数据操作
  538. query: 执行 SQL 查询。
  539. execute: 执行 SQL 语句。
  540. insert: 向表中插入数据。
  541. update: 更新表中的数据。
  542. delete: 删除表中的数据。
  543. 6. 数据查询
  544. selectWithCount: 查询数据并返回总行数。
  545. paginate: 分页查询数据。
  546. selectForUpdate: 执行带锁的查询。
  547. 7. 列操作
  548. addColumn: 向表中添加新列。
  549. dropColumn: 从表中删除列。
  550. getColumnInfo: 获取列的信息。
  551. columnExists: 检查列是否存在。
  552. 8. 外键管理
  553. addForeignKey: 添加外键约束。
  554. dropForeignKey: 删除外键约束。
  555. getForeignKeys: 获取表中的外键信息。
  556. 9. SQL 文件导出
  557. exportTablesToSQLFile: 将数据库结构和数据导出到 SQL 文件。
  558. 10. 表信息查询
  559. listTables: 列出指定数据库中的所有表名。
  560. getTableInfo: 获取指定表的信息。
  561. 11. 触发器管理
  562. createTrigger: 创建触发器。
  563. dropTrigger: 删除触发器。
  564. 12. 其他辅助方法
  565. getLastInsertId: 获取最后插入行的 ID。
  566. getSupportedEngines: 获取支持的存储引擎。
  567. changeTableEngine: 更改表的存储引擎。 */
  568. /*这个类的用法示例*/

  569. // 设置数据库连接参数
  570. $host = 'localhost'; // 主机名
  571. $username = 'your_username'; // 用户名
  572. $password = 'your_password'; // 密码
  573. $database = 'your_database'; // 数据库名称,可以传入null
  574. $port = 3306; // 端口号(可选,默认为3306)
  575. // 实例化 MySQLDatabase 类并连接到数据库
  576. $database = new MySQLDatabase($host, $username, $password, $database, $port);
  577. //________________________________________________________________________________________________________________________________________________________________________________________________________
  578. // 开始事务
  579. $database->startTransaction();
  580. // 提交事务
  581. $database->commitTransaction();
  582. // 发生异常,回滚事务
  583. $database->rollbackTransaction();
  584. //________________________________________________________________________________________________________________________________________________________________________________________________________
  585.        
  586.        
  587.        
  588. $databaseName = 'your_new_database';// 要创建的数据库名称
  589. $result = $database->createDatabase($databaseName);// 调用 createDatabase 方法创建一个数据库
  590. // 检查结果并输出消息
  591. if ($result) {
  592.     echo "数据库 $databaseName 创建成功。";
  593. } else {
  594.     echo "创建数据库失败:" . $database->conn->error;
  595. }
  596. //________________________________________________________________________________________________________________________________________________________________________________________________________
  597. $databaseName = 'your_database';// 要检查的数据库名称
  598. $exists = $database->databaseExists($databaseName);// 调用 databaseExists 方法检查数据库是否存在
  599. // 检查结果并输出消息
  600. if ($exists) {
  601.     echo "数据库 $databaseName 存在。";
  602. } else {
  603.     echo "数据库 $databaseName 不存在。";
  604. }
  605. //________________________________________________________________________________________________________________________________________________________________________________________________________
  606. $databaseName = 'your_database';// 要选择的数据库名称
  607. $result = $database->selectDatabase($databaseName);
  608. if ($result) {
  609.     echo "成功选择数据库 $databaseName 。";
  610. } else {
  611.     echo "选择数据库 $databaseName 失败。";
  612. }
  613. //________________________________________________________________________________________________________________________________________________________________________________________________________
  614. $databaseName = 'your_database';// 要删除的数据库名称
  615. $result = $database->dropDatabase($databaseName);// 调用 dropDatabase 方法删除数据库
  616. // 检查结果并输出消息
  617. if ($result) {
  618.     echo "数据库 $databaseName 删除成功。";
  619. } else {
  620.     echo "删除数据库 $databaseName 失败:" . $database->conn->error;
  621. }
  622. //________________________________________________________________________________________________________________________________________________________________________________________________________

  623. // 调用 selectWithCount 方法执行查询,此方法不支持分页,一般用于查询一条数据
  624. $result = $database->selectWithCount(
  625.     'your_table',       // 要查询的表名
  626.     'id, name',         // 要查询的字段,用逗号分隔,* 表示所有字段
  627.     'age > 18',         // 可选的查询条件
  628.     'name',             // 可选的排序字段,可以是 null,表示不排序
  629.     'ASC'               // 可选的排序顺序,可以是 'ASC' 或 'DESC'
  630. );
  631. // 返回:count:总行数,data:数据结果

  632. //________________________________________________________________________________________________________________________________________________________________________________________________________

  633. // 调用 insert 方法插入数据
  634. $inserted = $database->insert(
  635.     'your_table',                       // 要插入数据的表名
  636.     array(                              // 要插入的数据,键是字段名,值是要插入的值
  637.         'name' => 'John',
  638.         'age' => 30,
  639.         'email' => 'john@example.com'
  640.     )
  641. );

  642. // 检查插入结果并输出消息
  643. if ($inserted) {
  644.     echo "数据插入成功。";
  645. } else {
  646.     echo "数据插入失败:" . $database->conn->error;
  647. }

  648. //________________________________________________________________________________________________________________________________________________________________________________________________________
  649. // 调用 update 方法更新数据
  650. $updated = $database->update(
  651.     'your_table',                       // 要更新数据的表名
  652.     array(                              // 要更新的数据,键是字段名,值是要更新的值
  653.         'name' => 'John Doe',
  654.         'age' => 35
  655.     ),
  656.     'id = 1'                            // 更新条件,可以是任何有效的 SQL WHERE 子句,例如 id = 1 OR user = 123
  657. );

  658. // 检查更新结果并输出消息
  659. if ($updated) {
  660.     echo "数据更新成功。";
  661. } else {
  662.     echo "数据更新失败:" . $database->conn->error;
  663. }
  664. //________________________________________________________________________________________________________________________________________________________________________________________________________
  665. // 调用 update2 方法更新记录
  666. //这个整体语句的意思是,更新your_table表的column1,column2,column3字段
  667. //其中column3字段更新的值,是从user表中的info字段提取,且条件是author=3,这种操作一般是用在跨表更新,动态更新等场景
  668. $updated = $database->update2(
  669.     'your_table',   // 要更新的表名
  670.     [               // 更新的数据,键为列名,值为要更新的值
  671.         'column1' => 'value1',
  672.         'column2' => 'value2',
  673.         'column3' => '[user.info.author = 3]',// 此处使用了格式为 [sourceTable.sourceColumn.sourceWhere] 的特殊语法,表示从另一张表中获取数据进行更新,这样的特殊语法需要用大括号,如果你更新的参数中也有大括号,请使用update方法
  674.     ],
  675.     'id = 1'       // 更新条件,此处假设更新 id 为 1 的记录
  676. );

  677. // 检查更新结果并输出消息
  678. if ($updated) {
  679.     echo "记录更新成功。";
  680. } else {
  681.     echo "更新记录失败:" . $database->conn->error;
  682. }
  683. //________________________________________________________________________________________________________________________________________________________________________________________________________

  684. // 调用 delete 方法删除行数据
  685. $deleted = $database->delete(
  686.     'your_table',   // 要删除数据的表名
  687.     'id = 1'        // 删除条件,可以是任何有效的 SQL WHERE 子句
  688. );

  689. // 检查删除结果并输出消息
  690. if ($deleted) {
  691.     echo "数据删除成功。";
  692. } else {
  693.     echo "数据删除失败:" . $database->conn->error;
  694. }

  695. //________________________________________________________________________________________________________________________________________________________________________________________________________
  696. // 调用 createTable 方法创建表
  697. $created = $database->createTable(
  698.     'your_table',   // 要创建的表名
  699.     array(          // 要创建的字段和其属性
  700.         'id' => 'INT AUTO_INCREMENT PRIMARY KEY', // id字段,自增主键
  701.         'name' => 'VARCHAR(255)',
  702.         'age' => 'INT',
  703.         'email' => 'VARCHAR(255)'
  704.     ),
  705.     'ENGINE=InnoDB AUTO_INCREMENT=10000' // 表选项,设置自增起始值为10000,此参数可以省略留空
  706. );

  707. // 检查创建结果并输出消息
  708. if ($created) {
  709.     echo "表 your_table 创建成功,并设置自增起始值为10000。";
  710. } else {
  711.     echo "创建表 your_table 失败:" . $database->conn->error;
  712. }
  713. //________________________________________________________________________________________________________________________________________________________________________________________________________
  714. // 调用 tableExists 方法检查表是否存在
  715. if ($database->tableExists('your_table')) {
  716.     echo "表 your_table 存在。";
  717. } else {
  718.     echo "表 your_table 不存在。";
  719. }
  720. //________________________________________________________________________________________________________________________________________________________________________________________________________
  721. // 调用 addColumn 方法添加列
  722. $added = $database->addColumn(
  723.     'your_table',           // 表名
  724.     'new_column',           // 列名
  725.     'VARCHAR(255)'          // 列类型
  726. );

  727. // 检查添加结果并输出消息
  728. if ($added) {
  729.     echo "列 new_column 添加成功到表 your_table。";
  730. } else {
  731.     echo "添加列 new_column 到表 your_table 失败:" . $database->conn->error;
  732. }
  733. //________________________________________________________________________________________________________________________________________________________________________________________________________
  734. // 调用 addColumn 方法添加列,指定备注
  735. $addedWithComment = $database->addColumn(
  736.     'your_table',                   // 表名
  737.     'new_column_with_comment',      // 列名
  738.     'VARCHAR(255)',                 // 列类型
  739.     '这是一个新列的备注'            // 列备注,此参数是一个可选参数,可以留空不传入
  740. );

  741. // 检查添加结果并输出消息
  742. if ($addedWithComment) {
  743.     echo "列 new_column_with_comment 添加成功到表 your_table,备注为:这是一个新列的备注。";
  744. } else {
  745.     echo "添加列 new_column_with_comment 到表 your_table 失败:" . $database->conn->error;
  746. }
  747. //________________________________________________________________________________________________________________________________________________________________________________________________________
  748. // 创建普通列
  749. if ($database->addColumn2(
  750.     'your_table_name', // 表名
  751.     'new_column',      // 列名
  752.     'INT',             // 数据类型
  753.     false,             // 是否自增主键
  754.     null,              // 自增主键的起始值
  755.     'Your comment'     // 列的注释
  756. )) {
  757.     echo "普通列创建成功!\n";
  758. } else {
  759.     echo "普通列创建失败!\n";
  760. }

  761. // 创建自增主键列,自增 id 从 1000 开始
  762. if ($database->addColumn2(
  763.     'your_table_name', // 表名
  764.     'new_id_column',   // 列名
  765.     'INT',             // 数据类型
  766.     true,              // 是否自增主键
  767.     1000,              // 自增主键的起始值
  768.     'Your comment'     // 列的注释
  769. )) {
  770.     echo "自增主键列创建成功!\n";
  771. } else {
  772.     echo "自增主键列创建失败!\n";
  773. }
  774. //________________________________________________________________________________________________________________________________________________________________________________________________________
  775. // 调用 columnExists 方法检查列是否存在
  776. if ($database->columnExists(
  777.     'your_table',   // 要检查的表名
  778.     'your_column'   // 要检查的列名
  779. )) {
  780.     echo "表 your_table 中存在列 your_column。";
  781. } else {
  782.     echo "表 your_table 中不存在列 your_column。";
  783. }
  784. //________________________________________________________________________________________________________________________________________________________________________________________________________
  785. // 删除表 your_table_name 中的列 column_name
  786. if ($database->dropColumn('your_table_name', 'column_name')) {
  787.     echo "成功删除表 'your_table_name' 中的列 'column_name'。\n"; // 输出删除成功信息
  788. } else {
  789.     echo "删除表 'your_table_name' 中的列 'column_name' 失败。\n"; // 输出删除失败信息
  790. }
  791. //________________________________________________________________________________________________________________________________________________________________________________________________________
  792. //获取列信息
  793. $columnInfo = $database->getColumnInfo('your_table_name', 'your_column_name');
  794. if ($columnInfo !== null) {
  795.     echo "列信息如下:\n";
  796.     echo "列名:" . $columnInfo['Field'] . "\n";
  797.     echo "数据类型:" . $columnInfo['Type'] . "\n";
  798.     echo "备注:" . $columnInfo['Comment'] . "\n";
  799.     echo "是否是主键:" . ($columnInfo['Key'] === 'PRI' ? '是' : '否') . "\n";
  800. } else {
  801.     echo "获取列信息失败。\n";
  802. }
  803. //________________________________________________________________________________________________________________________________________________________________________________________________________
  804. // 调用 paginate 方法进行分页查询
  805. $result = $database->paginate(
  806.     'your_table',       // 表名
  807.     '*',                // 要查询的列,这里使用通配符表示查询所有列
  808.     'age > 18',         // WHERE 条件,查询年龄大于18岁的记录
  809.     2,                  // 当前页码
  810.     10,                 // 每页显示的记录数
  811.     'name',             // 按照姓名列排序
  812.     'ASC'               // 排序方式,升序
  813. );
  814. /* 返回参数说明:
  815. * - count: 查询结果的总行数
  816. * - totalPages: 总页数
  817. * - data: 分页查询返回的数据结果
  818. */
  819. // 输出查询结果
  820. print_r($result);

  821. //________________________________________________________________________________________________________________________________________________________________________________________________________
  822. // 调用 selectWithCountAndJoin 方法进行联合查询,二联表查询不支持分页,一般用于查询一条数据
  823. $result = $database->selectWithCountAndJoin(
  824.     'your_table',       // 主表名
  825.     '*',                // 要查询的列,这里使用通配符表示查询所有列
  826.     'join_table',       // 联合查询的表名
  827.     'your_table.id = join_table.id',   // 联合查询的条件
  828.     'age > 18',         // WHERE 条件,查询年龄大于18岁的记录
  829.     'name',             // 按照姓名列排序
  830.     'ASC'               // 排序方式,升序
  831. );

  832. // 输出查询结果
  833. print_r($result);
  834. //________________________________________________________________________________________________________________________________________________________________________________________________________
  835. // 调用 tripleTableQuery 方法进行三表联合查询,此三表联查方法,不支持分页,一般用于查一条数据
  836. $result = $database->tripleTableQuery(
  837.     'table1',       // 第一个表名
  838.     '*',            // 第一个表要查询的列,这里使用通配符表示查询所有列
  839.     'table2',       // 第二个表名
  840.     'table1.id = table2.table1_id', // 第二个表与第一个表的联合条件
  841.     'table3',       // 第三个表名
  842.     'table2.id = table3.table2_id', // 第三个表与第二个表的联合条件
  843.     'age > 18',     // WHERE 条件,查询年龄大于18岁的记录
  844.     'name',         // 按照姓名列排序
  845.     'ASC'           // 排序方式,升序
  846. );

  847. // 输出查询结果
  848. print_r($result);
  849. //________________________________________________________________________________________________________________________________________________________________________________________________________
  850. // 调用 paginateWithJoin 方法进行联合查询的分页,二联表查询支持分页,一般用于查询多条数据
  851. $result = $database->paginateWithJoin(
  852.     'your_table',       // 主表名
  853.     '*',                // 要查询的列,这里使用通配符表示查询所有列
  854.     'join_table',       // 联合查询的表名
  855.     'your_table.id = join_table.id',   // 联合查询的条件
  856.     'age > 18',         // WHERE 条件,查询年龄大于18岁的记录
  857.     2,                  // 当前页码
  858.     10,                 // 每页显示的记录数
  859.     'name',             // 按照姓名列排序
  860.     'ASC'               // 排序方式,升序
  861. );

  862. // 输出查询结果
  863. print_r($result);
  864. //________________________________________________________________________________________________________________________________________________________________________________________________________
  865. // 调用 tripleTableQueryWithPagination 方法进行三表联合查询的分页,三联表查询支持分页,一般用于查询多条数据
  866. $result = $database->tripleTableQueryWithPagination(
  867.     'table1',       // 第一个表名
  868.     '*',            // 第一个表要查询的列,这里使用通配符表示查询所有列
  869.     'table2',       // 第二个表名
  870.     'table1.id = table2.table1_id', // 第二个表与第一个表的联合条件
  871.     'table3',       // 第三个表名
  872.     'table2.id = table3.table2_id', // 第三个表与第二个表的联合条件
  873.     'age > 18',     // WHERE 条件,查询年龄大于18岁的记录
  874.     2,              // 当前页码
  875.     10,             // 每页显示的记录数
  876.     'name',         // 按照姓名列排序
  877.     'ASC'           // 排序方式,升序
  878. );

  879. // 输出查询结果
  880. print_r($result);
  881. //________________________________________________________________________________________________________________________________________________________________________________________________________
  882. // 要创建的用户信息
  883. $username = 'new_user'; // 要创建的用户的用户名
  884. $password = 'new_password'; // 要创建的用户的密码
  885. $databaseName = 'my_database'; // 要绑定用户到的数据库
  886. $privileges = 'SELECT, INSERT, UPDATE, DELETE'; // 设置用户权限为查询、插入、更新、删除和删除表列

  887. // 创建用户并绑定到数据库,并设置指定的权限,此方法主要使用场景是多租库,多库,数据隔离,权限隔离,多层架构
  888. $result = $database->createUser($username, $password, $databaseName, $privileges);
  889. if ($result) {
  890.     echo "用户创建成功并已绑定到数据库,并且具有指定的权限。";
  891. } else {
  892.     echo "用户创建失败或绑定到数据库失败。";
  893. }
  894. //________________________________________________________________________________________________________________________________________________________________________________________________________
  895. // 调用 deleteUser 方法删除用户
  896. $result = $database->deleteUser('new_user');
  897. // 检查删除操作是否成功
  898. if ($result === true) {
  899.     echo "用户 $username 已成功删除。";
  900. } else {
  901.     echo "删除用户 $username 失败:" . $database->conn->error;
  902. }
  903. //________________________________________________________________________________________________________________________________________________________________________________________________________
  904. // 要修改权限的用户的用户名
  905. $username = 'testuser';
  906. // 要授予的权限,例如:SELECT, INSERT, UPDATE, DELETE
  907. $privileges = 'SELECT, INSERT';
  908. // 要授予权限的数据库名称
  909. $databaseName = 'test_database';
  910. // 调用 updateUserPrivileges 方法修改用户权限
  911. $result = $database->updateUserPrivileges($username, $databaseName, $privileges);
  912. // 检查修改操作是否成功
  913. if ($result === true) {
  914.     echo "用户 $username 的权限已成功修改。";
  915. } else {
  916.     echo "修改用户 $username 的权限失败:" . $database->conn->error;
  917. }
  918. //________________________________________________________________________________________________________________________________________________________________________________________________________
  919. // 要取消权限的用户的用户名
  920. $username = 'testuser';
  921. // 要取消权限的数据库名称
  922. $databaseName = 'test_database';
  923. // 调用 revokeUserPrivileges 方法取消用户权限
  924. $result = $database->revokeUserPrivileges($username, $databaseName);

  925. // 检查取消操作是否成功
  926. if ($result === true) {
  927.     echo "用户 $username 对数据库 $databaseName 的权限已成功取消。";
  928. } else {
  929.     echo "取消用户 $username 对数据库 $databaseName 的权限失败:" . $database->conn->error;
  930. }
  931. //________________________________________________________________________________________________________________________________________________________________________________________________________
  932. // 定义 SQL 查询语句
  933. $sql = "SELECT * FROM users WHERE age > 25";
  934. // 执行自定义SQL查询并获取结果集
  935. $result = $database->query($sql);
  936. // 检查是否有结果
  937. if ($result->num_rows > 0) {
  938.     // 遍历结果集并输出数据
  939.     while ($row = $result->fetch_assoc()) {
  940.         echo "Name: " . $row['name'] . ", Age: " . $row['age'] . "<br>";
  941.     }
  942. } else {
  943.     echo "没有匹配的记录";
  944. }

  945. //________________________________________________________________________________________________________________________________________________________________________________________________________
  946. // 定义要导出的库、表和字段
  947. $db = [
  948.     ['database_name1' => ['table1' => ['field1', 'field2'], 'table2' => null]],//导出database_name1库的table1表的field1和field2字段,table2表的全部字段
  949.     ['database_name2' => null]// 导出database_name2库的所有表的所有字段
  950. ];

  951. // 指定导出的 SQL 文件位置
  952. $sqlFilePath = 'export_tables.sql';

  953. // 调用方法导出数据
  954. if ($database->exportTablesToSQLFile($db, $sqlFilePath)) {
  955.     echo "导出成功!";
  956. } else {
  957.     echo "导出失败,请检查日志或重试。";
  958. }
  959. //________________________________________________________________________________________________________________________________________________________________________________________________________
  960. //列出一个库下的所有表
  961. $databaseName = 'your_database_name';
  962. $tables = $database->listTables($databaseName);

  963. if (!empty($tables)) {
  964.     echo "库 '$databaseName' 下的表列表:\n";
  965.     foreach ($tables as $table) {
  966.         echo "$table\n";
  967.     }
  968. } else {
  969.     echo "库 '$databaseName' 下没有表。\n";
  970. }

  971. //________________________________________________________________________________________________________________________________________________________________________________________________________
  972. // 定义要重命名的旧表名和新表名
  973. $oldTableName = 'old_table';
  974. $newTableName = 'new_table';

  975. // 调用renameTable方法重命名表
  976. $result = $database->renameTable($oldTableName, $newTableName);

  977. // 检查重命名是否成功
  978. if ($result) {
  979.     echo "表重命名成功!";
  980. } else {
  981.     echo "表重命名失败!";
  982. }
  983. //________________________________________________________________________________________________________________________________________________________________________________________________________
  984. // 定义要清空数据的表名
  985. $table = 'table_name';
  986. // 调用truncateTable方法清空表数据
  987. $result = $database->truncateTable($table);
  988. // 检查清空操作是否成功
  989. if ($result) {
  990.     echo "表数据清空成功!";
  991. } else {
  992.     echo "表数据清空失败!";
  993. }
  994. //________________________________________________________________________________________________________________________________________________________________________________________________________
  995. // 获取上一次插入的自增ID
  996. $lastInsertId = $database->getLastInsertId();
  997. // 输出自增ID
  998. echo "上一次插入的自增ID为: $lastInsertId";

  999. //________________________________________________________________________________________________________________________________________________________________________________________________________
  1000. // 假设要向log表添加一个外键约束,关联到user表的id字段
  1001. $result = $database->addForeignKey(
  1002.     'log',                      // 表名
  1003.     'fk_author_user_id',        // 外键名
  1004.     'author',                   // 列名
  1005.     'user',                     // 引用表名
  1006.     'id',                       // 引用列名
  1007.     'CASCADE',                  // ON DELETE操作,参数见下方注释
  1008.     'CASCADE'                   // ON UPDATE操作,参数见下方注释
  1009. );

  1010. // 检查外键约束是否添加成功
  1011. if ($result) {
  1012.     echo "外键约束添加成功!";
  1013. } else {
  1014.     echo "外键约束添加失败!";
  1015. }

  1016. /* ON DELETE 操作:
  1017. CASCADE(级联删除): 当父表中的行被删除时,子表中的对应行也会被自动删除。
  1018. RESTRICT(限制): 默认选项。如果在父表中存在与子表相关的行,则不允许删除父表中的行。删除操作会失败,并返回错误。
  1019. SET NULL(设置为 NULL): 当父表中的行被删除时,子表中的对应列会被设置为 NULL。
  1020. NO ACTION(无操作): 当父表中的行被删除时,不会对子表中的任何行执行任何操作。

  1021. ON UPDATE 操作:
  1022. CASCADE(级联更新): 当父表中的行被更新时,子表中的对应行也会被自动更新。
  1023. RESTRICT(限制): 默认选项。如果在父表中存在与子表相关的行,则不允许更新父表中的行。更新操作会失败,并返回错误。
  1024. SET NULL(设置为 NULL): 当父表中的行被更新时,子表中的对应列会被设置为 NULL。
  1025. NO ACTION(无操作): 当父表中的行被更新时,不会对子表中的任何行执行任何操作。 */
  1026. /* 常见的不支持外键约束的数据库引擎包括:
  1027. MyISAM: MyISAM 是 MySQL 数据库的一种引擎,它不支持外键约束。
  1028. Memory (Heap): Memory 或 Heap 引擎是 MySQL 的另一种引擎,它也不支持外键约束。
  1029. CSV: CSV 引擎用于读写 CSV 文件,也不支持外键约束。
  1030. ARCHIVE: ARCHIVE 引擎用于存档数据,同样不支持外键约束。

  1031. 常见的支持外键约束的数据库引擎包括:
  1032. InnoDB: InnoDB 是 MySQL 数据库的默认存储引擎,也是最常用的支持外键约束的引擎之一。
  1033. PostgreSQL: PostgreSQL 是另一个流行的关系型数据库,它也支持外键约束。
  1034. SQL Server: Microsoft SQL Server 支持外键约束,允许您在表之间建立关系。
  1035. Oracle: Oracle 数据库也支持外键约束,允许您实现表之间的关系完整性。
  1036. */
  1037. //________________________________________________________________________________________________________________________________________________________________________________________________________
  1038. // 假设要从log表中删除之前添加的外键约束
  1039. $result = $database->dropForeignKey(
  1040.     'log',                  // 表名
  1041.     'fk_author_user_id'    // 外键名
  1042. );

  1043. // 检查外键约束是否删除成功
  1044. if ($result) {
  1045.     echo "外键约束删除成功!";
  1046. } else {
  1047.     echo "外键约束删除失败!";
  1048. }
  1049. //________________________________________________________________________________________________________________________________________________________________________________________________________
  1050. //获取表信息
  1051. $tableInfo = $database->getTableInfo('table_name');

  1052. if ($tableInfo !== null) {
  1053.     echo "表名: " . $tableInfo['Name'] . "\n";
  1054.     echo "存储引擎: " . $tableInfo['Engine'] . "\n";
  1055.     echo "自动递增值: " . $tableInfo['Auto_increment'] . "\n";
  1056.     echo "行格式: " . $tableInfo['Row_format'] . "\n";
  1057.     echo "创建时间: " . $tableInfo['Create_time'] . "\n";
  1058.     echo "索引长度: " . $tableInfo['Index_length'] . "\n";
  1059.     echo "数据长度: " . $tableInfo['Data_length'] . "\n";
  1060.     echo "数据可用空间: " . $tableInfo['Data_free'] . "\n";
  1061.     echo "排序规则: " . $tableInfo['Collation'] . "\n";
  1062.     echo "表注释: " . $tableInfo['Comment'] . "\n";
  1063. } else {
  1064.     echo "未找到表或查询失败。";
  1065. }
  1066. //________________________________________________________________________________________________________________________________________________________________________________________________________
  1067. $supportedEngines = $database->getSupportedEngines();

  1068. // 输出支持的引擎列表
  1069. echo "当前服务器支持的引擎列表:\n";
  1070. foreach ($supportedEngines as $engine) {
  1071.     echo "- $engine\n";
  1072. }
  1073. //________________________________________________________________________________________________________________________________________________________________________________________________________
  1074. // 更换表的引擎
  1075. $tableName = 'my_table';//表
  1076. $newEngine = 'InnoDB';//要更换的引擎
  1077. $result = $database->changeTableEngine($tableName, $newEngine);

  1078. // 检查操作结果
  1079. if ($result) {
  1080.     echo "成功将表 $tableName 的引擎更换为 $newEngine\n";
  1081. } else {
  1082.     echo "更换表引擎失败\n";
  1083. }
  1084. //________________________________________________________________________________________________________________________________________________________________________________________________________
  1085. // 创建触发器示例
  1086. $result = $database->createTrigger(
  1087.     'update_salary_trigger',   // 触发器名称
  1088.     'user',                    // 表名
  1089.     'AFTER',                   // 触发时间
  1090.     'UPDATE',                  // 触发事件
  1091.     'BEGIN
  1092.         DECLARE total_salary INT;
  1093.         SELECT SUM(money) INTO total_salary FROM user;
  1094.         UPDATE info SET new = total_salary WHERE id = 1;
  1095.     END'                       // 触发器逻辑
  1096. );

  1097. if ($result) {
  1098.     echo "触发器创建成功!";
  1099. } else {
  1100.     echo "触发器创建失败!";
  1101. }
  1102. /* 触发时间参数可以填的值包括:

  1103. BEFORE:表示触发器在触发事件之前执行。
  1104. AFTER:表示触发器在触发事件之后执行。
  1105. 触发事件参数可以选的值包括:

  1106. INSERT:表示在执行插入操作时触发。
  1107. UPDATE:表示在执行更新操作时触发。
  1108. DELETE:表示在执行删除操作时触发。 */
  1109. //________________________________________________________________________________________________________________________________________________________________________________________________________
  1110. // 删除触发器示例
  1111. $database->dropTrigger('触发器名称');
  1112. //________________________________________________________________________________________________________________________________________________________________________________________________________
  1113. // 开始事务
  1114. $db->startTransaction();

  1115. // 查询并锁定特定行
  1116. $database->selectForUpdate('table', "*", "id=1",true);

  1117. // 在此事务中进行其他操作,例如更新或删除

  1118. // 提交事务
  1119. $db->commitTransaction();
  1120. //________________________________________________________________________________________________________________________________________________________________________________________________________
  1121. // 调用 closeConnection 方法关闭数据库连接
  1122. $database->closeConnection();

  1123. // 确认连接是否已关闭,测试,这个判断在win环境下会报错,未知原因
  1124. if ($database->conn === null) {
  1125.     echo "数据库连接已关闭。";
  1126. } else {
  1127.     echo "关闭数据库连接失败。";
  1128. }

  1129. ?>
复制代码


您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表