- mysql数据库:web或者服务器数据库,当前很多服务器是通过php+mysql实现的。php5.0及以上推荐试用mysqli或者pdo进行数据库链接和增删改查,由于当前公司数据库是通过pdo,所以此篇文章重点放到pdo上面。
- 涉及到数据库的操作包括链接数据库,创建数据库,创建表,插入数据,查询数据,修改数据,删除数据,断开数据库连接。下面分为两部分整理php中mysql数据库的操作(以pdo为例)。
- 链接数据库(连接和断开链接),创建数据库,创建表
- 连接数据库(链接和断开链接):
<?php $host = '127.0.0.1'; // 数据库服务器地址 $db = 'testdb'; // 数据库名 $user = 'username'; // 数据库用户名 $pass = 'password'; // 数据库密码 $charset = 'utf8mb4'; // 字符集 $dsn = "mysql:host=$host;dbname=$db;charset=$charset"; $options = [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, PDO::ATTR_EMULATE_PREPARES => false, ]; try { $pdo = new PDO($dsn, $user, $pass, $options); echo "连接成功"; } catch (\PDOException $e) { throw new \PDOException($e->getMessage()); } ?> //在这段代码中,我们设置了数据库的主机地址、数据库名、用户名、密码和字符集。然后,我们使用这些信息构建了一个DSN //(Data Source Name),这是PDO用来建立连接的信息。接下来,我们设置了几个PDO属性,其中最重要的是将错误模式设置为 //异常,这样当遇到错误时,PDO会抛出一个异常,而不是返回一个错误编码。最后,我们尝试使用提供的信息创建一个 //新的PDO实例。如果连接成功,我们输出一个连接成功的消息,如果连接失败,我们捕获异常并重新抛出,以便进行错误处理。 //断开连接:$pdo = null;
- 创建数据库:请注意,通常不推荐通过应用程序代码来创建数据库,因为这不是应用程序的常规功能。数据库通常由数据库管理员或在服务器初始化期间创建。上述代码只是为了演示如何通过PDO检查并创建数据库,实际应用中请根据实际情况处理权限和创建逻辑。即数据库的创建是通过mysql管理工具创建,尽可能不要通过代码去创建,下面提供了pdo 校验当前库是否存在,不存在则可以执行创建数据库命令创建数据库。
<?php $host = '127.0.0.1'; // MySQL服务器地址 $dbname = 'my_database'; // 要创建的数据库名 $user = 'username'; // MySQL用户名 $password = 'password'; // MySQL密码 try { // 创建PDO实例连接到MySQL服务器 $pdo = new PDO("mysql:host=$host;charset=utf8", $user, $password); // 设置错误模式为异常 $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // 查询所有数据库,检查目标数据库是否存在 $stmt = $pdo->query("SHOW DATABASES"); $databases = $stmt->fetchAll(PDO::FETCH_COLUMN); if (!in_array($dbname, $databases)) { // 如果数据库不存在,创建数据库 $pdo->exec("CREATE DATABASE `$dbname`"); echo "数据库创建成功: $dbname"; } else { echo "数据库已存在: $dbname"; } } catch (PDOException $e) { echo '数据库连接失败: ' . $e->getMessage(); } ?>
- 创建表结构:
<?php $host = '127.0.0.1'; // 数据库服务器地址 $db = 'testdb'; // 数据库名 $user = 'username'; // 数据库用户名 $pass = 'password'; // 数据库密码 $charset = 'utf8mb4'; // 字符集 $dsn = "mysql:host=$host;dbname=$db;charset=$charset"; $options = [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, PDO::ATTR_EMULATE_PREPARES => false, ]; try { $pdo = new PDO($dsn, $user, $pass, $options); echo "连接成功"; // 创建表的SQL语句 $sql = "CREATE TABLE IF NOT EXISTS example_table ( id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY, firstname VARCHAR(30) NOT NULL, lastname VARCHAR(30) NOT NULL, email VARCHAR(50), reg_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP )"; // 预处理并执行SQL语句 $stmt = $pdo->prepare($sql); $stmt->execute(); echo "Table created successfully."; } catch (\PDOException $e) { throw new \PDOException($e->getMessage()); } ?> //连接数据库 创建表的sql语句 使用pdo预处理语句并执行创建表结构
- 连接数据库(链接和断开链接):
- 数据的增删改查。
- pdo的预处理:在代码中提前写好对应的sql语句,将语句交由pdo预处理,不需要外面传递sql语句,接受外面参数直接执行即可。
- 防止sql注入,直接执行sql语句且sql语句外面传入可能会出现大量脏数据或者数据直接被删除(谁知道外面会写入什么SQL语句),预处理可以避免这一点。
- 可以批量执行sql语句,提升效率,特别是插入,更新,删除有时操作可能多条。
- 绑定参数减少了服务器带宽,你只需要发送查询的参数,而不是整个语句
<?php $servername = "localhost"; $username = "username"; $password = "password"; $dbname = "myDBPDO"; try { $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password); // 设置 PDO 错误模式为异常 $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // 预处理 SQL 并绑定参数 $stmt = $conn->prepare("INSERT INTO MyGuests (firstname, lastname, email) VALUES (:firstname, :lastname, :email)"); $stmt->bindParam(':firstname', $firstname); $stmt->bindParam(':lastname', $lastname); $stmt->bindParam(':email', $email); // 插入行 $firstname = "John"; $lastname = "Doe"; $email = "john@example.com"; $stmt->execute(); // 插入其他行 $firstname = "Mary"; $lastname = "Moe"; $email = "mary@example.com"; $stmt->execute(); // 插入其他行 $firstname = "Julie"; $lastname = "Dooley"; $email = "julie@example.com"; $stmt->execute(); echo "新记录插入成功"; } catch(PDOException $e) { echo "Error: " . $e->getMessage(); } $conn = null; ?>
- mysql语言支持事务:事务:MySQL中的事务是一种机制,用于确保数据库操作的一致性、完整性和隔离性。
- 事务是针对数据库的数据的多项操作,要么执行,要么回滚不执行,所以很容易理解一致性和完整性。
- 隔离性是针对多个事务之间的执行,多个事务之间的执行是互相隔离的,并不会互相影响。
- 事务通过以下SQL语句进行管理:
* 开启事务:START TRANSACTION;
* 提交事务:COMMIT;
* 回滚事务:ROLLBACK;
``` -- 开启事务 START TRANSACTION; -- 执行多个操作,例如更新和插入 UPDATE my_table SET balance = balance - 100 WHERE id = 1; INSERT INTO my_log (event) VALUES ('Transaction completed'); -- 如果没有错误,提交事务 COMMIT; -- 如果在事务过程中遇到错误,可以回滚所有操作 -- ROLLBACK; //事务的事例: <?php $servername = "localhost"; $username = "username"; $password = "password"; $dbname = "myDBPDO"; try { $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password); // set the PDO error mode to exception $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // 开始事务 $conn->beginTransaction(); // SQL 语句 $conn->exec("INSERT INTO MyGuests (firstname, lastname, email) VALUES ('John', 'Doe', 'john@example.com')"); $conn->exec("INSERT INTO MyGuests (firstname, lastname, email) VALUES ('Mary', 'Moe', 'mary@example.com')"); $conn->exec("INSERT INTO MyGuests (firstname, lastname, email) VALUES ('Julie', 'Dooley', 'julie@example.com')"); // 提交事务 $conn->commit(); echo "新记录插入成功"; } catch(PDOException $e) { // 如果执行失败回滚 $conn->rollback(); echo $sql . "<br>" . $e->getMessage(); } $conn = null; ?> ```
- 数据插入(单条插入和批量插入)/更新/删除
- 数据的三种操作,甚至包括下面的数据查询在php和pdo中基本一致,包括下面三种方法进行操作:
- 直接执行sql语句(通常针对单条语句)
<?php $servername = "localhost"; $username = "username"; $password = "password"; $dbname = "myDBPDO"; try { $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password); // 设置 PDO 错误模式,用于抛出异常 $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); //"UPDATE Persons SET Age=36 WHERE FirstName='Peter' AND LastName='Griffin'" // "DELETE FROM Persons WHERE LastName='Griffin'" $sql = "INSERT INTO MyGuests (firstname, lastname, email) VALUES ('John', 'Doe', 'john@example.com')"; // 使用 exec() ,没有结果返回 $conn->exec($sql); echo "新记录插入成功"; } catch(PDOException $e) { echo $sql . "<br>" . $e->getMessage(); } $conn = null; ?>
- 通过pdo的预处理进行多条语句的操作
<?php $host = 'localhost'; $db = 'your_database'; $user = 'your_username'; $pass = 'your_password'; $charset = 'utf8mb4'; // 设置DSN(Data Source Name) $dsn = "mysql:host=$host;dbname=$db;charset=$charset"; $options = [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, PDO::ATTR_EMULATE_PREPARES => false, ]; try { // 创建PDO实例 $pdo = new PDO($dsn, $user, $pass, $options); // 使用预处理语句插入多条数据 $stmt = $conn->prepare("INSERT INTO users (name, email) VALUES (:name, :email)"); // 检查预处理语句是否准备成功 if ($stmt) { // 绑定参数并执行插入操作 $name = "Jane Doe"; $email = "jane@example.com"; $stmt->execute(['name' => $name, 'email' => $email]); // 绑定其他数据并再次执行插入操作 $name = "Alice Smith"; $email = "alice@example.com"; $stmt->execute(['name' => $name, 'email' => $email]); echo "Records inserted successfully"; // 关闭预处理语句 $stmt = null; } else { echo "Error preparing statement"; } // 关闭连接 $conn = null; // 准备更新语句 $sql = "UPDATE your_table SET column1 = :value1, column2 = :value2 WHERE id = :id"; // 准备并绑定参数 $stmt = $pdo->prepare($sql); $stmt->bindParam(':value1', $value1, PDO::PARAM_STR); $stmt->bindParam(':value2', $value2, PDO::PARAM_STR); $stmt->bindParam(':id', $id, PDO::PARAM_INT); // 给参数赋值 $value1 = 'new_value1'; $value2 = 'new_value2'; $id = 1; // 假设我们要更新ID为1的记录 // 执行更新 $stmt->execute(); echo "更新成功"; // 准备删除的SQL语句 $sql = "DELETE FROM your_table WHERE id = :id"; // 准备并绑定参数 $stmt = $pdo->prepare($sql); $stmt->bindParam(':id', $id); // 设置需要删除的数据的ID $id = 123; // 假设你想删除ID为123的记录 // 执行删除操作 $stmt->execute(); echo "数据删除成功"; //执行查询操作 $sql = 'SELECT * FROM your_table WHERE your_column = :your_value'; $stmt = $pdo->prepare($sql); $stmt->bindParam(':your_value', $yourValue, PDO::PARAM_STR); $yourValue = 'some_value'; // 设置参数值 $stmt->execute(); // 获取所有结果 此外pdo还提供了其他的数据获取方式可以参考下面的参考文章 $results = $stmt->fetchAll(PDO::FETCH_ASSOC); //获取所有的数据 // 遍历结果并输出 foreach ($results as $row) { echo $row['your_column_name'] . "<br>"; } //获取数据成功 } catch (\PDOException $e) { throw new \PDOException($e->getMessage(), (int)$e->getCode()); }
- 通过pdo事务语句进行多条语句的操作(要么全执行要么全回滚)
//事务的事例 <?php $servername = "localhost"; $username = "username"; $password = "password"; $dbname = "myDBPDO"; try { $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password); // set the PDO error mode to exception $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // 开始事务 $conn->beginTransaction(); // SQL 语句 $conn->exec("INSERT INTO MyGuests (firstname, lastname, email) VALUES ('John', 'Doe', 'john@example.com')"); $conn->exec("INSERT INTO MyGuests (firstname, lastname, email) VALUES ('Mary', 'Moe', 'mary@example.com')"); $conn->exec("INSERT INTO MyGuests (firstname, lastname, email) VALUES ('Julie', 'Dooley', 'julie@example.com')"); // 提交事务 $conn->commit(); echo "新记录插入成功"; } catch(PDOException $e) { // 如果执行失败回滚 $conn->rollback(); echo $sql . "<br>" . $e->getMessage(); } $conn = null; ?>
- 直接执行sql语句(通常针对单条语句)
- 数据的三种操作,甚至包括下面的数据查询在php和pdo中基本一致,包括下面三种方法进行操作:
- 数据查询
-
数据查询
- php的pdo数据查询在上面介绍的预处理命令上还有一种方式就是通过pdo的query函数去处理
<?php $servername = "localhost"; $username = "root"; $password = "133"; $dbname='myweb'; $pdo= new PDO("mysql:host=$servername;dbname=$dbname", $username, $password); $pdo->exec('set names utf8'); $sql="select * from user"; $smt=$pdo->query($sql); $rows=$smt->fetchAll(PDO::FETCH_ASSOC); echo '<pre>'; print_r($rows); echo '</pre>'; ?>
- php的pdo数据查询在上面介绍的预处理命令上还有一种方式就是通过pdo的query函数去处理
数据映射:即将取出来的数据库数据转换为对象,pdo提供两种方式:一是通过pdo设置获取数据的方式直接获取对应的对象,另外一种是pdo获取所有的数据在外面将其转换为对应的对象数组,此两种方式可以参考下面的文章。
-
- pdo的预处理:在代码中提前写好对应的sql语句,将语句交由pdo预处理,不需要外面传递sql语句,接受外面参数直接执行即可。
php语法学习6(mysql数据库:pdo)
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 在帝国CMS文章模型(news)的newstext字段默认是“内容存文本”的模式,但是有时候我们刚建站时出于某种原...