《MySQL基础教程》笔记8

Web  2023年12月3日 am8:08发布12个月前更新 城堡大人
135 0 0

前言

主要是介绍PHP脚本操作MySQL

根据《MySQL基础教程-西泽梦路》学习,简单的做一下笔记。

记录于此,方便自己回忆。

正文

PDO

什么是PDO

PDO是PHP 5.1.0及更高版本中定义的标准数据库连接机制,其目的是更方便地利用数据库。PDO是用于管理数据库的“类”(class),通过其“对象”(object)来操作数据库。

PDO的用法
new PDO(数据源名称,数据库用户名,数据库密码);

数据源名称格式

驱动名称:host=主机名;dbname=数据库名

驱动名称有如下几种

 数据库种类          驱动名称
 MySQL               mysql
 PostgreSQL          pgsql
 Oracle              oci
 SQL                  sqlsrv

我这里是MySQL数据,也就用mysql

<?php
    //数据库类型 :mysql
    //数据库名   :daohang
    //用户名     : root
    //密码       : rootroot
    $conn = new PDO("mysql:host=localhost;dbname=daohang", "root", "rootroot");
?>

比较流行的写法,单独抽出来写,方便维护。(就是代码有点长)

<?php
  //数据库类型
  $dbtype = 'mysql';
  //服务器地址:127.0.0.1 或localhost
  $servername ='localhost';
  //数据库名
  $dbname = 'daohang';
  //用户名
  $username = 'root';
  //登入密码
  $password = 'rootroot';
  //字符集[可选]
  $charset ='utf8';
  //数据源
  $dsn = "$dbtype:host=$servername;dbname=$dbname;charset=$charset";
  try {
    $conn = new PDO($dsn,$username,$password);
  } catch (PDOException $e) {
    echo "Connection failed: " . $e->getMessage();
  }
?>
query()
# 1
PDO对象->query("执行语句");
# 2
PDO对象->query('执行语句');

其实就是我们之前学的mysql语句放入上面即可。

创建数据库

判断是否存在数据,如果不存在就创建

//创建数据库daohang
$status = $conn->query('create database if not exists daohang;');
//创建成功或已经存在也是有返回值的!
if($status){
    print("good!<br>");
}else {
    print("bad!<br>");
}

如果不加[if not exists]时,如果存在数据库daohang,会崩溃

Fatal error: Uncaught PDOException: SQLSTATE[HY000]: General error: 1007 Can't create database 'daohang'; database exists in 
创建表
//创建表tb8
$status = $conn->query('create table if not exists tb8 (empid varchar(10), name varchar(30), age int)');
//创建成功或已经存在也是有返回值的!
if($status){
    print("good!<br>");
}else {
    print("bad!<br>");
}

如果不加[if not exists]时,如果存在表tb8,会崩溃

Fatal error: Uncaught PDOException: SQLSTATE[42S01]: Base table or view already exists: 1050 Table 'tb8' already exists in
插入数据
//插入1条
$conn->query('insert into tb8 (empid,name,age) values("A111", "笔友城堡",1)');
//插入2条
$conn->query('insert into tb8 (empid,name,age) values("A222", "笔友城堡2",2),("A333", "笔友城堡3",3)');
//缺省列名写法
$conn->query('insert into tb8 values("A444", "笔友城堡4",4)');
查询数据
//查询所有数据
$re = $conn->query('select * from tb8');

虽然获取打蜡返回值re,但re是PDOStatement对象,不能直接打印,而是需要PDOStatement中方法进行获取。

要获取查询的数据,需要使用fetch()方法,也就是接下来介绍的。

fetch()
PDOStatement对象->fetch();

通过fetch()获取的是数据数组,也就是一行中的数据。每个数组中存放了列个数相关的内容。

如果没有行可读取就会返回FALSE。

因此,为了遍历所有数据。

//查询
$re = $conn->query('select * from tb8');
while( $result = $re->fetch()){
  echo "<br>";
  //tb8中的列名个数
  //按照顺序分别为[empid,name,age]
  print($result[0]);
  print($result[1]);
  print($result[2]);
}
try catch

异常捕获

try{
  存在异常的语句;
}catch(异常名称 接收异常的变量){
	输出异常情况
}

比如在创建PDO

try {
  //创建连接
  $conn = new PDO($dsn,$username,$password);
} catch (PDOException $e) {
  echo "Connection failed: " . $e->getMessage();
}
setAttribute()

从上面可以知道,但PHP与My SQL连接失败时会发生异常。

但是,连接到My SQL时生成的PDO对象默认设置为连接后即使发生错误也不进行异常处理。

比如

# 此处去掉了if not exists
$status = $conn->query('create database daohang;');

因为数据库已经存在,但这里有重新创建了,本应该出现

Fatal error: Uncaught PDOException: SQLSTATE[HY000]: General error: 1007 Can't create database 'daohang'; database exists in ...

但没有,只是$status为空。

为看到MySQL出现的异常情况,需要setAttribute()改变一些属性。

//设置PDO为异常模式
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

设置后,出现语法错误或重复创建等异常都会提示。

Post

介绍一下通过POST传数据已经获取数据

index.html
<p>
  <form method="POST" action="simple_insert.php">
  <div>
    输入姓名<input type="text" name="name">
  </div>
  <div>输入消息<input type="text" name="message" size=150></div>
    <input type="submit" value="发送消息">
  </form>
</p>
simple_insert.php
# 这里只是主要获取name和message内容
<?php
	$name    = $_POST["name"];
	$message = $_POST["message"];
?>

参考文章

  1. 《MySQL基础教程-西泽梦路》

  2. PHP PDO 连接操作数据库

 历史上的今天

  1. 2019: 吴念真:饱了别人,瘦了自己(0条评论)
  2. 2018: git创建分支和提交分支(0条评论)
版权声明 1、 本站名称: 笔友城堡
2、 本站网址: https://www.biumall.com/
3、 本站部分文章来源于网络,仅供学习与参考,如有侵权,请留言

暂无评论

暂无评论...

随机推荐

Android触摸事件简单分析

这篇文章以前写的,后来博客清空重新开始了。最近看到,因此摘抄于此,以便查阅。在开始分析之前,大家可以先记几个结论,这样便于理解。  结论1:事件一定是先到达父控件上。  结论2:事件简单来说可以分为三种:Down事件、Move事件、Up事件。PS:(1) 为了让读者看得更清晰,在代码中只打...

Android图片旋转+倒影

前言根据前面两篇文章,这里进行组合也就是倒影+旋转,顺便加上了倒影渐变。效果如图。正文直接上代码<!-- layout_height= 倒影高度+分割线高度+图片高度,否则显示不全 -->​<com.biumall.reflectview.view.Rotat...

编译Apk出现:Duplicate class android.support.v4.app.INotificationSideChannel found

前言编译老项目Apk时,到我这就一个app的源码,导入工程后出现如下提示:Duplicate class android.support.v4.app.INotificationSideChannel found in modules core-1.1.0-runtime (androidx....

Notification使用

前言简单记录一下Notification的使用,这里设计简单Notification和自定义View的Notification的使用。记录于此,方便自己查阅和学习。正文简单Notification由于高版本需要添加NotificationChannel,下面就进行了一定的适配。pr...

LocalServices和SystemService等简介

前言在上次简单介绍SystemServer(《SystenServer的启动之一》)时,里面涉及几个比较重要的类SystemServiceManager,SystemService和LocalServices,因此今天就单独介绍一下。正文涉及文件frameworks\base\servic...

舒婷:人心的法则

为一朵花而死去是值得的冷漠的车轮粗暴的靴底使春天的彩虹在所有眸子里黯然失色既不能阻挡又无处诉说那么,为抗议而死去是值得的 为一句话而沉默是值得的远胜于大潮雪崩似地跌落这句话被嘴唇紧紧封锁汲取一生全部诚实与勇气这句话,不能说那么,为不背叛而沉默是值得的...