PHP 中三种数据库操作扩展

/ 0评 / 0

PHP通过安装相应的扩展驱动的方式实现数据库的操作,当前主流的数据库有MsSQL、MySQL、Sybase、Db2、Oracle、PostgreSQL、Access等,这些数据库PHP都能够安装扩展来支持,但是我们常用的却是MySQL,当今最流行的LAMP或者LNMP架构就是Linux、Apache/nginx、MySQL、PHP,所以我们也使用MySQL.

PHP中一个数据库可能有一个或者多个扩展,其中既有官方的,也有第三方提供的。像MySQL常用的扩展有原生的mysql库,也可以使用增强版的mysqli扩展,还可以使用PDO进行连接与操作。

原生mysql扩展进行数据库连接的方法:

              // 当我们了解了如何使用mysql_query进行数据查询以后,插入数据其实也是类似的
	$link = mysql_connect('127.0.0.1', 'root', '123456') or die('数据库连接失败');
	mysql_select_db('test');   //选择一个数据库

	mysql_query("set names 'utf8'");  //设置一下当前连接使用的字符编码,一般我们会使用utf8编码

	$sql = "insert into user(name, age, class) values('李四', 18, '高三一班')";
	mysql_query($sql); //执行插入语句

	echo "
"; $uid = mysql_insert_id(); echo $uid; echo "
"; mysql_close($link); // 查询数据分页 // 通过mysql的limit可以很容易的实现分页,limit m,n表示从m行后取n行数据,在PHP中我们需要构造m与n来实现获取某一页的所有数据。 // 假定当前页为$page,每页显示$n条数据,那么m为当前页前面所有的数据,既$m = ($page-1) * $n,在知道了翻页原理以后,那么我们很容易通过构造SQL语句在PHP中实现数据翻页。 $link = mysql_connect('127.0.0.1', 'root', '123456') or die('数据库连接失败'); mysql_select_db('test'); //选择一个数据库 mysql_query("set names 'utf8'"); // $page = 1; $pagesize = 10; $offset = ($page - 1) * $pagesize; $sql = "select * from user limit $offset, $pagesize"; $result = mysql_query($sql); //循环获取当前页的数据 $data = array(); while ($row = mysql_fetch_assoc($result)) { $data[] = $row; } var_dump($data); echo "
"; mysql_close($link); // 更新数据 // 数据的更新与删除相对比较简单,只需要构建好相应的sql语句,然后调用mysql_query执行就能完成相应的更新与删除操作。 $link = mysql_connect('127.0.0.1', 'root', '123456') or die('数据库连接失败'); mysql_select_db('test'); //选择一个数据库 mysql_query("set names 'utf8'"); // //limit 1 是为了优化数据库查询,只要查到了就不会再继续往下查了 $sql = "update user set name = '曹操' where id=10 limit 1"; if (mysql_query($sql)) { echo '更新成功
'; } mysql_close($link); // 删除数据 $link = mysql_connect('127.0.0.1', 'root', '123456') or die('数据库连接失败'); mysql_select_db('test'); //选择一个数据库 mysql_query("set names 'utf8'"); // $sql = "delete from user where id=1 limit 1"; if (mysql_query($sql)) { echo '删除成功
'; } mysql_close($link); // 对于删除与更新操作,可以通过mysql_affected_rows函数来获取更新过的数据行数,如果数据没有变化,则结果为0。 $link = mysql_connect('127.0.0.1', 'root', '123456') or die('数据库连接失败'); mysql_select_db('test'); //选择一个数据库 mysql_query("set names 'utf8'"); // $sql = "update user set name = '曹操' where id=4 limit 1"; if (mysql_query($sql)) { echo mysql_affected_rows() . '
'; } mysql_close($link);

然而不好意思,mysql扩展5.5以后就逐步被抛弃了,不过出现了mysqli扩展,看一下mysqli进行数据库连接的方法:

	//面向过程实现mysqli连接
	//1.连接
	$link = mysqli_connect('localhost','root','123456','test') or die('连接错误'  . mysqli_connect_errno() . ':' . mysqli_connect_error());

	//2.设置编码方式
	mysqli_set_charset($link,'UTF8');

	//3.执行SQL查询
	$sql = "INSERT user(name, age, class) VALUES('张三', 12, '高三三班');";
	$res = mysqli_query($link,$sql);

	if ($res){
	    echo mysqli_insert_id($link);
	    echo  '
'; echo 'AFFECTED ROWS:' . mysqli_affected_rows($link); }else{ echo 'ERROR:SS
'; echo mysqli_errno($link) . ':' . mysqli_error($link); } //关闭连接 mysqli_close($link); //也支持面向对象的操作 $mysqli = new mysqli('localhost','root','123456','test'); if ($mysqli->connect_errno){ die('连接错误:' . $mysqli->connect_error); } $mysqli->set_charset('utf8'); //执行SQL查询 //添加记录 //执行单条SQL语句,只能执行一条SQL语句 //$sql = "INSERT user(name, age, class) VALUES('king', '25', '高三五班')"; //$res=$mysqli->query($sql); $sql = "INSERT user(name, age, class) VALUES ('king1', '25', '高三五班'), ('king2', '25', '高三五班'), ('king3', '25', '高三五班'), ('king4', '25', '高三五班')"; $res=$mysqli->query($sql); if ($res){ //得到上一条插入操作产生的AUTO_INCREMENT的值 echo '恭喜注册成功,你是网站第' . $mysqli->insert_id . '位用户
'; //得到上一步操作产生的受影响记录条数 echo '有' . $mysqli->affected_rows . '记录被影响
'; }else{ //得到上一步操作产生的错误信息 echo 'ERROR' . $mysqli->errno . ':' . $mysqli->error; } /*** * affected_rows 的值有三种 * * 1.受影响记录的条数 * 2. -1 代表SQL语句有问题 * 3. 0 代表没有受影响记录的条数 * */ echo '
'; //更新记录,将表中的年龄+10 $sql="UPDATE user SET age=+10"; $res = $mysqli->query($sql); if ($res){ echo $mysqli->affected_rows . '条记录被更新
'; }else{ echo "ERROR " . $mysqli->errno . ':' . $mysqli->error; } echo '
'; //将表中id>6的用户删除掉 $sql="DELETE FROM user WHERE id>=6"; $res=$mysqli->query($sql); if ($res){ echo $mysqli->affected_rows . '条记录被删除'; }else{ echo "ERROR " . $mysqli->errno . ':' . $mysqli->error; } echo '
'; //查询表 $sql="SELECT id,name,age,class FROM user"; $mysqli_result=$mysqli->query($sql); if ($mysqli_result && $mysqli_result->num_rows > 0){ echo $mysqli_result->num_rows; //$rows=$mysqli_result->fetch_all(); //获取结果集中所有记录,默认返回的是二维的索引+索引形式 //$rows=$mysqli_result->fetch_all(MYSQLI_ASSOC); //$rows=$mysqli_result->fetch_all(MYSQLI_NUM); //$rows=$mysqli_result->fetch_all(MYSQLI_BOTH); //print_r($rows); $rows = array(); while ($row=$mysqli_result->fetch_assoc()){ print_r($row); echo '
'; $rows[] = $row; } //释放结果集 $mysqli_result->close();//有三种方法 }else{ echo '查询错误或者结果集中没有记录'; } $mysqli->close();

上面说的只是mysqli的一些单条SQL操作的方法,下面看一下一次多条SQL的操作

	$mysqli = new mysqli('localhost','root','123456','test');

	if ($mysqli->connect_errno){
	    die('连接错误:' . $mysqli->connect_error);
	}

	$mysqli->set_charset('utf8');


	$sql = "INSERT user(name, age, class) VALUES('king', '25', '高三五班');";
	$sql .= "UPDATE user SET age=100 WHERE id=4;";
	$sql .= "DELETE FROM user WHERE id=5;";
	//针对多条SQL语句的执行
	//$res=$mysqli->multi_query($sql); //只看第一条SQL结果,成功了就返回真,不管后面的执行结果,如果第一条失败了,后面的真也执行不到了

	//不过一般我们用这个是为了查询
	$sql = "SELECT id,name,age FROM user;";
	$sql .= "SELECT * FROM mysql.user;";
	$sql .= "SELECT CURRENT_USER();";
	$sql .= "SELECT NOW();";

	//user_result()/store_result() 将结果集中的第一个结果取出,后者效率要高
	//more_results() : 检测是否有更多的结果集
	//next_result() : 将结果集指针向下移动一位

	if($mysqli->multi_query($sql)){
	    do{
	        if ($mysqli_result=$mysqli->store_result()){
	            $rows[] = $mysqli_result->fetch_assoc();
	        }
	    }while($mysqli->more_results() && $mysqli->next_result());
	}else{
	    echo $mysqli->error;
	}

	print_r($rows);


	//使用预处理指令
	$sql = "INSERT user(name, age, class) VALUES(?,?,?)";
	//准备预处理语句
	$mysqli_stmt = $mysqli->prepare($sql);

	$name = 'king';
	$age = 12;
	$class = '高一五班';

	//绑定参数
	$mysqli_stmt->bind_param('sis',$name,$age,$class);

	//执行预处理语句
	if($mysqli_stmt->execute()){
	    echo $mysqli_stmt->insert_id;
	    echo '
'; }else{ $mysqli_stmt->error; } $mysqli_stmt->free_result(); //释放 $mysqli_stmt->close();//关闭 //预处理语句能够防止sql注入 //查询中使用预处理指令 $sql="SELECT id,name,age,class FROM user WHERE id=?"; $mysqli_stmt=$mysqli->prepare($sql); $id=4; $mysqli_stmt->bind_param('i',$id); if ($mysqli_stmt->execute()){ //bind_result()绑定结果集中的值到变量 $mysqli_stmt->bind_result($id,$name,$age,$class); while ($mysqli_stmt->fetch()){ echo '编号:'. $id .'
'; echo '用户名:'. $name .'
'; echo '年龄:'. $age .'
'; echo '班级:'. $class .'
'; echo '
'; } } $mysqli_stmt->free_result(); //释放 $mysqli_stmt->close();//关闭 //实现事物处理,这里提到的是转账的简单处理 //先关闭自动提交 $mysqli->autocommit(FALSE); $sql = '第一个操作'; $res=$mysqli->query($sql); $res_affect=$mysqli->affected_rows; $sql1 = '第二个操作'; $res1=$mysqli->query($sql1); $res1_affect=$mysqli->affected_rows; if ($res && $res_affect > 0 && $res1 && $res1 > 0){ $mysqli->commit(); echo '转账成功
'; $mysqli->autocommit(TRUE); }else{ $mysqli->rollback(); //事物回滚 echo '转账失败
'; } $mysqli->close();

下面看一下另一种新的操作库,叫PDO

try{
	    $pdo = new PDO('mysql:host=localhost;dbname=test','root','123456');
	    //exec():执行一条sql语句并返回其受影响的记录的条数,如果没有受影响的条数,返回0
	    //exec对于select没有作用
	    $sql = <<exec($sql);   //主要用于增删改

	    if ($res === false){
	        echo $pdo->errorCode();
	        echo '
'; $errInfo = $pdo->errorInfo(); var_dump($errInfo); } //query() 执行一条sql语句,返回PDOStatement对象 $sql = 'select * from user'; $stmt=$pdo->query($sql); //主要用于查询 //var_dump($stmt); foreach ($stmt as $row){ print_r($row); } echo '
'; //另一种常用查询,预处理语句 //prepare() 准备要执行的sql,返回PDOStatement对象 //execute() 执行一条预处理语句 $stmt=$pdo->prepare($sql); var_dump($stmt); echo "
"; $res = $stmt->execute(); var_dump($res); echo "
"; //得到结果集中的一条记录 $row = $stmt->fetch(); print_r($row); echo "
"; //可以设置模式 // $stmt->setFetchMode(PDO::FETCH_ASSOC); $all = $stmt->fetchAll(PDO::FETCH_ASSOC); print_r($all); //得到数据库连接属性 setAttribute() //设置数据库连接属性 getAttribute() $username = 'admin'; $password = '123456'; //PDOStatement对象的使用 //quote()防止sql注入,rowCount()查询出的条数 // $pdo->quote($username); //预处理占位 $sql = "SELECT * FROM admin WHERE username=? and password =?"; $stmt = $pdo->prepare($sql); //可以这样 $stmt ->execute(array($username,$password)); echo $stmt->rowCount(); echo "
"; $username = 'root'; $password = '123456'; //绑定参数 $sql = "INSERT admin(username,password) VALUES (:username,:password)"; $stmt = $pdo->prepare($sql); $stmt -> bindParam(":username",$username); $stmt -> bindParam("password",$password); $stmt -> execute(); $username = 'rooter'; $password = '123456'; //绑定参数 $sql = "INSERT admin(username,password) VALUES (?,?)"; $stmt = $pdo->prepare($sql); $stmt -> bindParam(1,$username); $stmt -> bindParam(2,$password); $stmt -> execute(); //将值绑定到参数 $username = 'rooters'; $password = '123456'; //绑定参数 $sql = "INSERT admin(username,password) VALUES (?,?)"; $stmt = $pdo->prepare($sql); $stmt -> bindValue(1,$username); $stmt -> bindValue(2,$password); $stmt -> execute(); //绑定多个值 $sql = "SELECT username,password FROM admin"; $stmt = $pdo->prepare($sql); $stmt->execute(); echo '结果集中的列数' . $stmt->columnCount(); echo '
'; //测试用的 print_r($stmt->getColumnMeta(0)); echo "
"; $stmt->bindColumn(1,$username); $stmt->bindColumn(2,$password); while ($stmt->fetch(PDO::FETCH_BOUND)) { echo "用户名:" . $username . "密码:" . $password . "
"; } echo "
"; //fetchColumn() 从结果集中的下一行返回单独地一列 //nextRowset() 取出下一个结果集 }catch(PDOException $e){ echo $e->getMessage(); }

代码请查看 http://git.oschina.net/zcb1603999/LearningPHP

评论已关闭。