php语法学习6(mysql数据库:pdo)

  1. mysql数据库:web或者服务器数据库,当前很多服务器是通过php+mysql实现的。php5.0及以上推荐试用mysqli或者pdo进行数据库链接和增删改查,由于当前公司数据库是通过pdo,所以此篇文章重点放到pdo上面。
  2. 涉及到数据库的操作包括链接数据库,创建数据库,创建表,插入数据,查询数据,修改数据,删除数据,断开数据库连接。下面分为两部分整理php中mysql数据库的操作(以pdo为例)。
  3. 链接数据库(连接和断开链接),创建数据库,创建表
    • 连接数据库(链接和断开链接):
       <?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预处理语句并执行创建表结构
      
  4. 数据的增删改查。
    • 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;
        ?>
        
    • 数据查询
      • 数据查询

        • 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>';
          
                  ?>
          
      • 数据映射:即将取出来的数据库数据转换为对象,pdo提供两种方式:一是通过pdo设置获取数据的方式直接获取对应的对象,另外一种是pdo获取所有的数据在外面将其转换为对应的对象数组,此两种方式可以参考下面的文章。

参考文章:
mysql事务:详解
pdo查询数据并获取不同类型数据的方法

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,919评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,567评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,316评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,294评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,318评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,245评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,120评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,964评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,376评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,592评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,764评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,460评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,070评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,697评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,846评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,819评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,665评论 2 354

推荐阅读更多精彩内容