php数据库(mysql)编程基础

来源:互联网 发布:js 调用id为变量的div 编辑:程序博客网 时间:2024/06/12 01:14

u Php数据库编程

php有三种方式操作mysql数据库

① Mysql扩展库

② Mysqli扩展库

③ Pdo

Mysql扩展库和mysql数据库的区别(库就是一些函数)

1Mysql数据库用于存放数据的

DBMS(数据库管理系统)

2、mysql数据库的三层结构示意图

3、Mysql扩展库是一堆函数,是用于对mysql数据库的操作。

实例连接数据库及对数据库数据输出

<?php

header("Content-type:text/html;charset=utf-8");

$link=@mysql_connect("localhost","root","");  //连接数据库

    if($link){

echo "数据库连接成功</br>";

}else{

echo "数据库连接失败</br>";

}

@mysql_select_db("db_logistics",$link);  //$link最好是写上,选择指定的数据库

@mysql_query("set names utf8");         //编码设定  utf-8  中间不要使用“—”

$sql="select * from tb_car_log";       //sql语句

$res=mysql_query($sql);                //执行语句获得数据 res结果集(可以表示是一张表)

//$res mysql的资源类型

while($fetch=mysql_fetch_array($res)){  //数据循环输出(一次取出数据)$fetch就是一个数组

//print_r($fetch);

echo "</br>";

//echo "$fetch[0]--$fetch[1]";   //取出数据的方式一

foreach($fetch as $key=>$val){   //foreach方式取出数据二 

echo "$val--";

}

echo "</br>";

}

//释放资源

@mysql_free_result($res);

@mysql_close($link);   //可以没有,建议写上

?>

细节:

1、使用完$res后要释放资源  mysql_free_result($res);

2、关闭数据库(可以有可以没有,建议使用) mysql_close($link)

   mysql数据库的关闭不会立即执行,phpmysql数据库会自动过段时间关闭

3、mysql_fetch_row 是取出下一条数据,  mysql_fetch_array()是他的扩展类

4、从$res获取行数据时,处理mysql_fetch_row$res)还有三种方式

分别是:

mysql_fetch_row($res);   返回索引数组(推荐使用)

mysql_fetch_assoc($res);  返回关联数组

mysql_fetch_array($res);  返回索引数组和关联数组(两套,建议不要使用,占用内存  太大)

mysql_fetch_object($res);  把一行数据当做对象返回

Mysql_query();执行sql语句时

dml语句(数据操作语言  update  insert alter)返回bool

dql语句(select) 返回结果集

Mysql数据库的dml操作

<?php

header("Content-type:text/html;charset=utf-8");

$link=@mysql_connect("localhost","root","");  //连接数据库

    if($link){

echo "数据库连接成功</br>";

}else{

echo "数据库连接失败</br>";

}

@mysql_select_db("db_logistics",$link);  //$link最好是写上,选择指定的数据库

@mysql_query("set names utf8");         //编码设定  utf-8  中间不要使用“—”

$sql="select * from tb_car_log";       //sql语句

$res=mysql_query($sql);                //执行语句获得数据 res结果集(可以表示是一张表)

while($fetch=mysql_fetch_array($res)){  //数据循环输出(一次取出数据)$fetch就是一个数组

//print_r($fetch);

echo "</br>";

//echo "$fetch[0]--$fetch[1]";   //取出数据的方式一

foreach($fetch as $key=>$val){   //foreach方式取出数据二 

echo "$val--";

}

echo "</br>";

}

//释放资源

@mysql_free_result($res);

@mysql_close($link);   //可以没有,建议写上

?>

从上面可以看出  ,代码的复用率很低,通常我们会编写一个对于数据库的操作类,封装成一个工具类,SqlHelper.class.php(名字自取);

<?php

class SqlHelper{

public $conn;

public $host="localhost";

public $user="root";

public $pwd="";

public $db_name="spdb1";

 //构造函数

function __construct(){          

$this->conn=mysql_connect($this->host,$this->user,$this->pwd);

if(!$this->conn){

echo "数据库连接失败".mysql_error();

}

mysql_select_db($this->db_name,$this->conn);

mysql_query("set names utf8");

}

//完成dql语句(select)

public function execute_dql($sql){

$res=mysql_query($sql) or die (mysql_error());

return $res;

}

//完成dml数据(update insert delete

public function execute_dml($sql){

$res=mysql_query($sql,$this->conn);

//echo mysql_insert_id($link);   //显示最新的id

if(!$res){

return 0;  //表示失败

}else{

if(mysql_affected_rows($res)>0){

return 1; //表示成功

}else{

return 2; //表示没有对行影响

}

}

}

}

?>

Mysql数据库扩展库mysqli

Mysqli扩展库存在两个版本:即“面向对象版”和“面向过程版”

Mysql扩展库和mysqli扩展库的差别:

1、两者都是可以操作mysql的扩展库;

2、Mysqli是对mysql的改进版;

3、Mysqli扩展库比起mysql来更稳定,执行效率更高;

**Mysqli库的面向过程使用和mysql库的使用方法相同,基本的方法相同

**面向对象的方法使用相同。

Mysqli的快速入门

1、面向对象的风格

配置php.ini启用mysqli的扩展库  (方法中不适用参数)

extension=php_mysqli.dll

*******************实例***********************

<?php

//mysqli操作数据库(面向对象)

//创建mysqli对象

header("Content-type:text/html;charset=utf-8");

$mysqli=new MySQLi("localhost","root","","db_logistics");

if($mysqli->connect_error){

die("连接失败".$mysqli->connect_error);

}else{

echo "连接成功</br>";

}

//操作数据库

$sql="select * from tb_car_log";

$res=$mysqli->query($sql);   //结果集

//die($res);

//处理结果

while($row=$res->fetch_row()){

foreach($row as $key => $val){

echo "$val";

}

echo "</br>";

}

//关闭资源

$res->free();   //释放资源

$mysqli->close();  //关闭连接

?>

**************实例*******************

2、面向过程的风格

********************************   (方法中使用参数)

<?php

//面向过程

header("Content-type:text/html;charset=utf-8");

$link=mysqli_connect("localhost","root","","db_logistics");

if(mysqli_connect_error($link)){    //或者!$mysqli

die("连接失败");

}else{

echo "连接成功</br>";

}

$sql="select * from tb_car_log";

$res=mysqli_query($link,$sql);

//var_dump($res);

while($row=mysqli_fetch_row($res)){

foreach($row as $key =>$val){

echo "$val";

}

echo "</br>";

}

mysqli_free_result($res);

mysqli_close($link);

?>

*****************************

**mysqlsql 语句特别说明:

如果操作字段的类型是string 我们要使用‘’包括。

字段类型是 数值型 ,则可以用‘’包括,也可以不用。

Mysqli工具类 SqlTool.class.php

<?php

//mysqli的使用

class SqlTool{

private $link;

private static $host="localhost";  //静态的节省资源

private static $user="root";

private static $pwd="";

private static $db=”test_mysql”;

public function __construct(){

//完成初始化

$this->mysqli=new MySQLi(self::$host,self::$user,self::$pwd,self::$db);

if($this->mysqli->connect_error){

die("连接失败".$this->mysqli->connect_error);

}

//使用utf-8格式使用数据库

$this->mysqli->query("set names utf8");

}

//select语句使用

public function execute_dql($sql){

$res=$this->mysqli->query($sql) or die ("操作失败".$this->mysqli->error);

return $res;

}

//update insert delete语句使用

public function execute_dml($sql){

$res=$this->mysqli->query($sql) or die ("操作失败".$this->mysqli->error);

if(!$res){

return 0; //失败

}else {

if($this->mysqli->affected_rows>0){

return 1;  //成功

}else{

return 2;  //无行数收到影响

}

}

}

}

?>

Mysqli的增强----批量执行sql语句

批量执行dml语句

<?php

header("Content-type:text/html;charset=utf-8");

$mysqli=new MySQLi("localhost","root","","word");

if($mysqli->connect_error){

die(connect_error);

}

$sqls="insert into word (enword,chword) values ('www','万维网')";

$sqls.="insert into word (enword,chword) values ('http','超文本协议')";

$sqls.="insert into word (enword,chword) values ('text','文本文档')";

//$sql.="update";

//$sql.="delete";

$res=$mysqli->multi_query($sqls);

if(!$res){

die("添加失败");

}else{

echo "添加成功";

}

$mysql->free();

$mysql->close();

?>

***批量执行dml语句时可以批量使用dml语句,但是最好不要使用select语句。

$sqls=”sql1语句 ; sql2语句 ; sql3语句”;

Mysqli:multi_query($sqls);

批量执行dql语句

一次性返回多个就结果集

<?php

header("Content-type:text/html;charset=utf-8");

$mysqli=new MySQLi("localhost","root","","word");

if(mysqli_connect_error()){

echo "连接失败".mysqli_connect_error();

}

$mysqli->query("set names utf8");

//批量dql语句

$sqls="select * from word;";

$sqls.="select * from students";

//取得结果集

$res=$mysqli->multi_query($sqls);

if($res){

do{

$result=$mysqli->store_result();

//取出结果集中的一组数据(一个数组)

while($row=$result->fetch_row()){

foreach($row as $key => $val){

echo "---$val";

}

echo "</br>";

}

//释放结果集

$result->free();

if(!$mysqli->more_results()){   //没有结果集后直接跳出

break;

}

echo "</br>*********新的结果集</br>";

}while($mysqli->next_result());

}

//关闭资源

$mysqli->close();

?>

Mysql事务规范

<?php 

header("Content-type:text/html;charset=utf-8");

$mysqli=new MySQLi("localhost","root","","word");

if(mysqli_connect_error()){

echo "连接失败".mysqli_connect_error();

}

$mysqli->query("set names utf8");

$sql1="update account set blance=blance-2 where id=1";

$sql2="update account2 set blance=blance+2 where id=2";

$db1=$mysqli->query($sql1) or die($mysqli->error);

$db2=$mysqli->query($sql2) or die($mysqli->error);

if(!$db1 || !$db2){

echo "转账失败";

}else{

echo "转账成功";

}

?>

此代码执行失败,只执行第一个sql语句。在一些地方是错误的。

**事务

事务是用来保证数据的一致性,由一组相关的dml语句组成,该组的dml语句要么全部成功,要么远不失败。如:网上转账就是典型的要使用事务来处理的,来保证数据的一致性。

<?php 

header("Content-type:text/html;charset=utf-8");

$mysqli=new MySQLi("localhost","root","","word");

if(mysqli_connect_error()){

echo "连接失败".mysqli_connect_error();

}

//将提交设为假【事务一旦提交,就不能回滚】

$mysqli->autocommit(false);

//相当于在此做了一个保存点;会把当前情况记录下来

$mysqli->query("set names utf8");

$sql1="update account set blance=blance-2 where id=1";

$sql2="update account2 set blance=blance+2 where id=2";

$db1=$mysqli->query($sql1);

$db2=$mysqli->query($sql2);

if(!$db1 || !$db2){

echo "转账失败".$mysqli->error;

$mysqli->rollback();  //回滚

}else{

echo "转账成功";

$mysqli->commit();   //一旦提交就不能再回滚

}

$mysqli->close();

?>

Mysql 控制台操作,使用事务操作。

1Start transaction;  //开启事务   不做保存点是有一个默认的保存点 。

2Savepoint a;      //设置保存点

3Drop table **;     //数据操纵

4Rollback to a;      /回滚a  其他保存点丢失

如果没有问题就提交commit

有问题就回滚。Rollback to a

事务的特点(ACID):原子性,一致性,隔离性,持久性。

Mysqli扩展库的预处理技术    mysqli stmt

想数据库中添加100条数据,如何添加

1、for 循环循环100次,添加数据。

2、使用批量添加

$sqls=”insert ***;”;

$sqls.=”insert ***;”;

。。。。

$mysqli->multi_query($sqls);

3、使用预编译技术,该方案还可以防止sql注入攻击

<?php

$mysqli=new mysqli("localhost","root","","word");

if (mysqli_connect_error()) {

die(mysqli_connect_error());

}

$sql="select enword from word where id>?";

$stmt=$mysqli->prepare($sql);  //预处理定义

$id=2;  //设定值

//绑定参数

$stmt->bind_param("i",$id); 

//绑定结果集

$stmt->bind_result($en_word);  

$stmt->execute();   //执行语句

 

while ($stmt->fetch()) {

echo "</br>----".$en_word;   //输出结果

}

$stmt->free_result();  //关闭结果集

$stmt->close();        //关闭连接

$mysqli->close();      //关闭数据库连接

?>

dml

<?php
$mysqli = new mysqli('localhost''my_user''my_password''world');

/* check connection */
if (mysqli_connect_errno()) {
 printf("Connect failed: %s\n"mysqli_connect_error());
 exit();
}
//预编译对象
$stmt $mysqli->prepare("INSERT INTO CountryLanguage VALUES (?, ?, ?, ?)");
//绑定

$stmt->bind_param('sssd'$code$language$official$percent);

$code 'DEU';
$language 'Bavarian';
$official "F";
$percent 11.2;

/* execute prepared statement */
$stmt->execute();            //执行  返回bool

printf("%d Row inserted.\n"$stmt->affected_rows);

/* close statement and connection */
$stmt->close();

/* Clean up table CountryLanguage */
$mysqli->query("DELETE FROM CountryLanguage WHERE Language='Bavarian'");
printf("%d Row deleted.\n"$mysqli->affected_rows);

/* close connection */
$mysqli->close();
?> 

Dql语句执行

<?php
$mysqli = new mysqli("localhost""my_user""my_password""world");

/* check connection */
if (mysqli_connect_errno()) {
 printf("Connect failed: %s\n"mysqli_connect_error());
 exit();
}

$query "SELECT Name, CountryCode FROM City ORDER by ID DESC LIMIT 150,5";

if ($stmt $mysqli->prepare($query)) {

 /* execute statement */
 $stmt->execute();                    //执行

 /* bind result variables */
 $stmt->bind_result($name$code);   //对应查询的字段

 /* fetch values */
 while ($stmt->fetch()) {
 printf ("%s (%s)\n"$name$code);
 }


$stmt->free_result();       //释放资源
 /* close statement */
 $stmt->close();          //关闭预编译
}

/* close connection */
$mysqli->close();         //关闭连接
?>

**sql语句执行原则的

Php发送sql语句,mysql编译命令,执行处理

预编译可以防止sql(结构化查询语句)注入攻击

使用万能密码

Select * from user1 where name=’ls’ and password=’aa’ or ‘1=1’;

If(查到){

Header(“admin.php”);

}else{

Header(“login.php”);

}

数据库注入 解决方式:

1、使用预编译

2、改变验证数据库用户逻辑

Select password from user1 where name=’ls’ ;

If(从数据库查询的密码==用户输入的密码){

Header***);

}else{

Header***);

}

其他使用语句:

<?php

header("Content-type:text/html;charset=utf-8");

function ShowTable($table_name){

$mysqli=new mysqli("localhost","root","","word");

if(mysqli_connect_error()){

die("连接失败".mysqli_connect_error());

}

$mysqli->query("set names utf8");

$sql="select * from $table_name";

$res=$mysqli->query($sql);

//显示行数和列数 

echo "公用列数".$res->field_count."行数".$res->num_rows;

//取出表头

echo "<table border=1><tr>";

while ($filed=$res->fetch_field()){

echo "<th>{$filed->name}</th>";

}

echo "</tr>";

//循环取出数据

while ($row=$res->fetch_row()){

echo "<tr>";

foreach ($row as $val){

echo "<td>$val</td>";

}

echo "</tr>";

}

echo "</table>";

$res->free();

$mysqli->close();

}

ShowTable("user");

?>

Pdo 数据库抽象层(兼容数据库,方便项目换数据库)