1.11 PHP之数据库操作

1.PHP支持哪些数据库?

PHP通过安装相应的扩展来实现数据库操作,现代应用程序的设计离不开数据库的应用,当前主流的数据库有MySQL,MsSQL,Sybase,Db2,Oracle,PostgreSQL,Access等,这些数据库PHP都能够安装扩展来支持,一般情况下常说的LAMP架构指的是:Linux、Apache、Mysql、PHP,因此Mysql数据库在PHP中的应用非常广泛,我们会在本章中简单的了解Mysql的操作方法。

<?php    
    if (function_exists('mysql_connect')) {        
        echo 'Mysql扩展已经安装';    
    }
?>

2.数据库扩展

PHP中一个数据库可能有一个或者多个扩展,其中既有官方的,也有第三方提供的。像Mysql常用的扩展有原生的mysql库,也可以使用增强版的mysqli扩展,还可以使用PDO进行连接与操作。不同的扩展提供基本相近的操作方法,不同的是可能具备一些新特性,以及操作性能可能会有所不同。
参考资料:PHP的数据库扩展之MySQL,mysqli和PDO

  1. mysql扩展进行数据库连接的方法:
$link = mysql_connect('mysql_host', 'mysql_user', 'mysql_password');
  1. mysqli扩展:
$link = mysqli_connect('mysql_host', 'mysql_user', 'mysql_password');
  1. PDO扩展:
$dsn = 'mysql:dbname=testdb;host=127.0.0.1';    
$user = 'dbuser';    
$password = 'dbpass';    
$dbh = new PDO($dsn, $user, $password);

示例代码:

<?php    
    $link = mysql_connect('127.0.0.1', 'code1', '') or die('数据库连接失败');    
    mysql_select_db('code1');    
    mysql_query("set names 'utf8'");    
    $result = mysql_query('select * from user limit 2');    
    $row = mysql_fetch_assoc($result);    
    print_r($row);

注:以下示例代码均以 mysqli扩展 为准.

3.连接数据库

PHP要对数据库进行操作,首先要做的是与数据库建立连接,通常我们使用 mysqli_connect 函数进行数据库连接,该函数需要指定数据库的地址, 用户名, 密码等信息。

mysqli_connect ([ string $host = ini_get("mysqli.default_host") [, string $username = ini_get("mysqli.default_user") [, string $passwd = ini_get("mysqli.default_pw") [, string$dbname = "" [, int $port = ini_get("mysqli.default_port") [, string $socket = ini_get("mysqli.default_socket") ]]]]]] )

PHP连接数据库的方式类似于直接在命令行下进行连接,类似:mysql -ucode1 -p,当连接成功以后,我们需要选择一个操作的数据库,通过mysql_select_db函数(为向下兼容仍然可以使用 mysql_selectdb(), 但反对这样做; 直接用mysqli_connect设置即可)来选择数据库。
通常我们会先设置一下当前连接使用的字符编码,一般的我们会使用utf8编码。

$host = 'localhost';
$user = 'user';    
$pass = 'password';    
$db = 'db'
$link = mysql_connect($host, $user, $pass, $db);
mysqli_query($link, "set names 'utf8'");

通过上面的步骤,我们就与数据库建立了连接,可以进行数据操作了。

4.执行MySQl查询

在数据库建立连接以后就可以进行查询,采用mysqli_query加sql语句的形式向数据库发送查询指令。

$res = mysql_query('select * from user limit 1');

对于查询类的语句会返回一个资源句柄(resource),可以通过该资源获取查询结果集中的数据。

$row = mysql_fetch_array($res);    
var_dump($row);

默认的,PHP使用最近的数据库连接执行查询,但如果存在多个连接的情况,则可以通过参数指令从那个连接中进行查询。

$link1 = mysql_connect('127.0.0.1', 'code1', '');    
$link2 = mysql_connect('127.0.0.1', 'code1', '', true); //开启一个新的连接    
$res = mysql_query('select * from user limit 1', $link1); //从第一个连接中查询数据

5.插入新数据到MySQl中

当我们了解了如何使用mysql_query进行数据查询以后,那么类似的,插入数据其实也是通过执行一个sql语句来实现,例如:

$sql = "insert into user(name, age, class) values('李四', 18, '高三一班')";    
mysql_query($sql); //执行插入语句通常数据都是存储在变量或者数组中,因此sql语句需要先进行字符串拼接得到。    
$name = '李四';    
$age = 18;    
$class = '高三一班';    
$sql = "insert into user(name, age, class) values('$name', '$age', '$class')";    
mysql_query($sql); //执行插入语句在mysql中,执行插入语句以后,可以得到自增的主键id,通过PHP的**mysql_ insert_id**函数可以获取该id。    
$uid = mysql_insert_id();这个id的作用非常大,通常可以用来判断是否插入成功,或者作为关联ID进行其他的数据操作。

示例代码:

<?php    
    //连接数据库    
    mysql_connect('127.0.0.1', 'code1','');    
    mysql_select_db('code1');    
    mysql_query("set names 'utf8'");    
    //已知的数据变量有    
    $name = '李四';    
    $age = 18;    
    $class = '高三一班';    
    //在这里进行数据查询    
    $sql ="insert into user(name, age, class) values('$name','$age','$class`)";    
    mysql_query($sql);    
    echo mysql_insert_id();

6.取得数据查询结果

通过前面的章节,我们发现PHP操作数据库跟MySql客户端上操作极为相似,先进行连接,然后执行sql语句,再然后获取我们想要的结果集。PHP有多个函数可以获取数据集中的一行数据,最常用的是mysql_fetch_array,可以通过设定参数来更改行数据的下标,默认的会包含数字索引的下标以及字段名的关联索引下标。

$sql = "select * from user limit 1";   
$result = mysql_query($sql);    
$row = mysql_fetch_array($result);

可以通过设定参数MYSQL_NUM只获取数字索引数组,等同于mysql_fetch_row函数,如果设定参数为MYSQL_ASSOC则只获取关联索引数组,等同于mysql_fetch_assoc函数。

$row = mysql_fetch_row($result);    
$row = mysql_fetch_array($result, MYSQL_NUM); //这两个方法获取的数据是一样的    
$row = mysql_fetch_assoc($result);    
$row = mysql_fetch_array($result, MYSQL_ASSOC);如果要获取数据集中的所有数据,我们通过循环来遍历整个结果集。    
$data = array();    
while ($row = mysql_fetch_array($result)) {        
    $data[] = $row;    
}

7.查询分页数据

上一节中,我们了解到通过循环可以获取一个查询的所有数据,在实际应用中,我们并不希望一次性获取数据表中的所有数据,那样性能会非常的低,因此会使用翻页功能,每页仅显示10条或者20条数据。通过mysql的limit可以很容易的实现分页,limit m,n表示从m行后取n行数据,在PHP中我们需要构造m与n来实现获取某一页的所有数据。假定当前页为$page,每页显示$n条数据,那么m为当前页前面所有的数据,既$m = ($page-1) * $n,在知道了翻页原理以后,那么我们很容易通过构造SQL语句在PHP中实现数据翻页。

$page = 2;    
$n = 2;    
$m = ($page - 1) * $n;    
$sql = "select * from user limit $m, $n";    
$result = mysql_query($sql);    //循环获取当前页的数据    
$data = array();    
while ($row = mysql_fetch_assoc($result)) {        
    $data[] = $row;    
}

在上面的例子中,我们使用了$m与$n变量来表示偏移量与每页数据条数,但我们推荐使用更有意义的变量名来表示,比如$pagesize, $start, $offset等,这样更容易理解,有助于团队协作开发。

8.更新与删除数据

数据的更新与删除相对比较简单,只需要构建好相应的sql语句,然后调用mysql_query执行就能完成相应的更新与删除操作。

$sql = "update user set name = '曹操' where id=2 limit 1";    
if (mysql_query($sql)) {        
    echo '更新成功';    
}

同样的删除可以使用类似以下的代码:

$sql = "delete from user where id=2 limit 1";    
if (mysql_query($sql)) {          
    echo '删除成功';    
} 
对于删除与更新操作,可以通过**mysql_affected_rows**函数来获取更新过的数据行数,如果数据没有变化,则结果为0。    

$sql = "update user set name = '曹操' where id=2 limit 1";
if (mysql_query($sql)) {
echo mysql_affected_rows();
}
示例代码:

<?php    
    //连接数据库    
    mysql_connect('127.0.0.1', 'code1','');    
    mysql_select_db('code1');    
    mysql_query("set names 'utf8'");    
    //预设数据以便进行更新操作    
    mysql_query("insert into user(name, age, class) values('王二', 19, '高三五班')");    
    $id = mysql_insert_id();    //在这里更新id为$id的行的名字为李白    
    $sql = "update user set name = '李白' where id = $id limit 1";    
    mysql_query($sql);    //输出更新数据条数    
    echo '数据更新行数:'.mysql_affected_rows();    
    mysql_query("delete from user where id='$id'");

9.关闭MySQL连接

当数据库操作完成以后,可以使用mysql_close关闭数据库连接,默认的,当PHP执行完毕以后,会自动的关闭数据库连接。 mysql_close();虽然PHP会自动关闭数据库连接,一般情况下已经满足需求,但是在对性能要求比较高的情况下,可以在进行完数据库操作之后尽快关闭数据库连接,以节省资源,提高性能。在存在多个数据库连接的情况下,可以设定连接资源参数来关闭指定的数据库连接。 $link = mysql_connect($host, $user, $pass); mysql_close($link);

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

推荐阅读更多精彩内容