14 使用MySQL数据库
PHP中与MySQL相关的常用函数
1、int mysql_affected_rows ( [resource $link_identifier] ), 取得前一次 MySQL 操作所影响的记录行数,返回最近一次与 link_identifier 关联的 INSERT,UPDATE 或 DELETE 查询所影响的记录行数。
2、关闭MySQL连接 :bool mysql_close ( [resource $link_identifier] ) 关闭指定的连接标识所关联的到 MySQL 服务器的非持久连接。如果没有指定 link_identifier,则关闭上一个打开的连接。
3、打开一个到MySQL服务器的连接 :resource mysql_connect ( [string $server [, string $username [, string $password [, bool $new_link [, int $client_flags]]]]] ), 打开或重复使用一个到 MySQL 服务器的连接。server:MySQL 服务器。username:用户名。password:密码。默认值是空密码。new_link: ,client_flags:参数。
4、新建一个MySQL数据库 : bool mysql_create_db ( string $database name [, resource $link_identifier] ) 尝试在指定的连接标识所关联的服务器上建立一个新数据库。 database_name:要创建的数据库名。 link_identifier:MySQL 的连接标识符。
5、移动内部结果的指针 :bool mysql_data_seek ( resource $result, int $row_number ) 将指定的结果标识所关联的 MySQL 结果内部的行指针移动到指定的行号。result:返回类型为 resource 的结果集。该结果集从 mysql_query() 的调用中得到。row_number:想要设定的新的结果集指针的行数。
6、取得结果数据 :string mysql_db_name ( resource $result, int $row [, mixed $field] ) 取得 mysql_list_dbs() 调用所返回的数据库名。 result:mysql_list_dbs() 调用所返回的结果指针。 row:结果集中的行号。 field:字段名。
7、发送一条MySQL查询 :resource mysql_db_query ( string $database, string $query [, resource $ link_identifier ] ) 根据查询结果返回一个MySQL结果资源号,出错时返回FALSE。本函数会对 INSERT/UPDATE/DELETE 查询返回 TRUE/FALSE 来指示成功或失败。
8、丢弃(删除)一个MySQL数据库 : bool mysql_drop_db ( string $database_name [, resource $ link_identifier ] ) 尝试丢弃(删除)指定连接标识所关联的服务器上的一整个数据库。如果成功则返回 TRUE,失败则返回 FALSE。 不提倡使用此函数。最好用mysql_query()提交一条 SQL DROP DATABASE 语句来替代。
9、int mysql_errno ( [resource $link_identifier] ),如果没有出错则返回 0(零)。
10、string mysql_error ( [resource $link_identifier] ), 返回上一个 MySQL 函数的错误文本,如果没有出错则返回 ''(空字符串)。
11、string mysql_escape_string ( string $unescaped_string ), 本函数将unescaped_string转义,使之可以安全用于mysql_query()。并不转义 % 和 _。
12、array mysql_fetch_array ( resource $result [, int $ result_type ] ),返回根据从结果集取得的行生成的数组,如果没有更多行则返回 FALSE。 mysql_fetch_array() 是 mysql_fetch_row() 的扩展版本。
13、 ……
对数据库操作
1、连接MySQL数据库 :mysql_connect()
< ? php $ link = mysql_connect ( 'localhost' , 'mysql_user' , 'mysql_password' ) ; 或者:$ link = mysql_connect ( $ db_host , $ db_user , $ db_pass ) or die ( "不能连接到服务器" . mysql_error ( ) ) ; ? >
2、显示可用数据库 :mysql_list_dbs()
< ? php $ db_list = mysql_list_dbs ( $ link ) ; while ( $ db = mysql_fetch_object ( $ db_list ) ) //通过循环遍历返回的结果集 { echo $ db - > Database; //显示数据库名,注意大小写 echo ""
; } ? >
object mysql_fetch_object ( resource $result ),
返回根据所取得的行生成的对象,如果没有更多行则返回 FALSE。
3、在服务器上创建新的数据库 :mysql_create_db()
< ? php mysql_create_db ( "database1" , $ link ) ; 已废弃! 最好使用mysql_query( ) 发送SQL语句创建:
$ sql = "CREATE DATABASE data2" ; //创建数据库的SQL语句 mysql_query ( $ sql , $ link ) ; //发送SQL语句 ? >
4、在选定数据库里创建表 :
< ? php mysql_select_db ( $ db_name , $ link ) ; //选择相应的数据库,这里选择test库 //下面的$sql就为创建表的SQL语句 $ sql = "create table test1(id int(5) not null auto_increment primary key, name varchar(12) not null, mail varchar(30) not null, phone varchar(14) not null, address varchar(30) not null)" ; if ( mysql_query ( $ sql , $ link ) ) //发送SQL语句执行创建表的操作 ? >
注意:1)在一对圆括号里列出完整的字段清单。2)字段名间用逗号隔开,逗号后要加一个空格。3)最后一个字段名不用逗号。4)所有的SQL语句以分号“;”结束。 $table_list=mysql_list_tables($db_name,$link),显示库中所有的表,已废弃! 可以使用mysql_query()发送SQL语句“show tables”来显示所有表。 改为:$table_list=mysql_query(“show tables”,$link)。
5、删除已经存在的库和表 删除库有两种方法:一是通过mysql_drop_db()函数,另一种是通过mysql_query()发送SQL语句:drop database database_name。 删除表只能通过mysql_query()发送SQL语句:drop table table_name。
< ? php $ sql = "drop table test1" ; //删除表的sql语句 mysql_query ( $ sql , $ link ) //执行SQL语句 $ sql = "drop database data2" ; //删除数据库的sql语句 mysql_query ( $ sql , $ link ) //执行SQL语句 ? >
对MySQL表进行操作
1、执行INSERT INTO语句插入记录 insert into table_name(field1,field2,…) values(values1,values2…)
< ? php //以下SQL语句为插入记录操作 $ sql = "insert into test1(name, mail, phone, address) values('张三', 'zhangsan@homail.com', '1234567', '某省某市某区某街')" ; mysql_query ( $ sql ) ; //执行SQL语句 $ sql = "select * from test1" ; //先执行SQL语句显示所有记录 $ result = mysql_query ( $ sql , $ link ) ; //使用mysql_query()发送SQL请求 while ( $ row = mysql_fetch_array ( $ result ) ) //遍历SQL语句执行结果把值赋给数组 { echo ""; echo " ". $ row [ id] . " "; //显示ID echo " ". $ row [ name] . " "; //显示姓名 echo " ". $ row [ mail ] . " "; //显示邮箱 echo " ". $ row [ phone] . " "; //显示电话 echo " ". $ row [ address] . " "; //显示地址 echo " " ; } ? >
array mysql_fetch_array (),返回根据从结果集取得的行生成的数组,如果没有更多行则返回 FALSE。
2、执行SELECT查询 浏览表中的所有记录:select * from tablename;
使用表单扩展添加记录 : 前台:
< script language = "javascript" > function Juge( theForm) { if ( theForm. name . value = = "" ) { alert( "请输入姓名!" ) ; theForm. name . focus( ) ; return ( false) ; } < form action = "14-12.php" method = "post" onsubmit = "return Juge(this)" > < tr > < td > 输入姓名:< / td > < td > < input name = "name" type = "text" > < / td > < / tr >
后台处理:14-12.php
< ? php /*获取表单输入,并去掉HTML格式。表单采用post方式传递数据,用post来获取输入*/ $ name = htmlspecialchars ( $ _POST [ 'name' ] ) ; //获取姓名 $ mail = htmlspecialchars ( $ _POST [ 'mail' ] ) ; //获取邮箱 $ phone = htmlspecialchars ( $ _POST [ 'phone' ] ) ; //获取电话 $ address = htmlspecialchars ( $ _POST [ 'address' ] ) ; //获取地址 $ myconn = mysql_connect ( "$db_host" , "$db_user" , "$db_pass" ) ; //连接服务器 mysql_select_db ( "$db_name" , $ myconn ) ; //选择操作库 $ strSql = "insert into $table_name(name, mail, phone, address) values ('$name', '$mail', '$phone', '$address')" ; //对表进行插入操作 mysql_query ( $ strSql , $ myconn ) or die ( "插入时出错" . mysql_error ( ) ) ; //发送SQL请求 ? >
3、执行UPDATE语句更新记录 update table_name set field1=“value1”,field2=“value2” where where_definition 例:
< ? php $ sql = "update test1 set name='王五', mail='wangwu@tom.com', phone='3456789', address='上海市高新开发区' where name=‘张三’" ; //创建更新记录SQL语句 mysql_query ( $ sql , $ link ) ; //发送SQL请求 ? >
使用表单扩展更改记录功能 : 在echo "
".$row[address]." "; 后加一句:
echo "
修改 ";
14-15.php
< form action = "14-16.php" method = "post" onsubmit = "return Juge(this)" > < ? php mysql_select_db ( data2, $ link ) ; //选择相应的数据库 $ sql = "select * from test1 where id=$_GET[id]" ; //只显示请求ID号的内容 $ result = mysql_query ( $ sql ) ; $ row = mysql_fetch_array ( $ result ) ; //把结果赋值给数组 ? > < td > 输入姓名:< / td > < td > < input name = "name" type = "text" value = "" > < / td >
14-16.php
< ? php $ strSql = "update $table_name set name='$name', mail='$mail', phone='$phone', address='$address' where id=$id" ; //对表进行修改操作 mysql_query ( $ strSql , $ myconn ) or die ( "插入时出错" . mysql_error ( ) ) ; //发送SQL请求 ? >
4、执行DELETE语句删除记录
< ? php delete from table_name where field1= “value1”$ sql = "delete from test1 where id=1" ; //创建更新记录SQL语句 mysql_query ( $ sql , $ link ) ; //发送SQL请求 ? >
5、执行ALTER TABLE语句改变表的结构
< ? php alter table table_name add column field_name1 date , add column field_name2 time…;$ sql = "alter table test1 add column mob_phone varchar(11),add column birthday varchar(8)" ; mysql_query ( $ sql ) ; //执行添加字段的SQL语句 $ sql = "alter table test1 drop mail" ; mysql_query ( $ sql ) ; //执行删除字段的SQL语句 mysql_list_fields ( ) , 返回指定表的所有字段。已过时,使用SQL语名:$ result = mysql_query ( "show columns from test1" ) ; ? >
对MySQL表的高级查询
1、使用WHERE子句 :select * from test1 where ic<10 select * from test1 where name=‘张三’。可用操作符:“=”“<”“>”“not”等 使用LIKE模糊查询:select * from table_name where field_name like value 通配符“%”指代0个或多个、“_”指代任一个单个字符。 select * from table_name where address like “%北京%”,地址中包含北京的。
2、使用LIMIT子句对结果进行分页显示 select field_name from table_name limit 10,参数10为最大返回数目。 或 select field_name from table_name limit 2,3,第一个参数2指定要返回的第一行的偏移量,第二个指定返回行的最大数目。初始行的偏移量为0。 $sql="select * from test1 limit 3";
3、使用ORDER BY对查询结果进行排序 select field_name from table_name order by field_name desc desc为降序,asc为升序,默认按照升序。 例:$sql="select * from test1 order by id desc"; 多重排序:多次使用ORDER BY子句 select field_name from table_name order by field_name, order by field_name2 先对查询结果按field_name排序,如果多个记录的field_name字段相同,这时再按field_name2进行排序。
MySQL数据库实例:学生档案管理
15 用PHP实现人机交互
表单元素的组成: 1、TEXT(文本输入框) 2、PASSWORD(密码输入框) 基本同TEXT,输入以*号显示 3、BUTTON(普通按钮) 4、RADIO(单选按钮) 通常以一组出现,具有相同的NAME属性和不同的VALUE属性。checked为初始选中。 5、CHECKBOX(复选框) 6、SELECT(列表框)1 2 3 SIZE为1时表现为下拉菜单,SIZE大于1时表现为列表框形式。 7、TEXTAREA(文本域) 8、SUBMIT(提交按钮) 9、RESET(重置按钮) 10、HIDDEN(隐藏域)
在普通WEB页中插入表单 前台与后台的纽带:ACTION=URLPOST与GET的区别 GET方式提交的表单,数据被附加到URL上作为URL的一部分发送到服务器,POST方式则是将表单中的信息作为一个数据块发送到服务器。 处理表单提交的数据 如果register_globals = On,用户提交的变量可以当作全局变量直接使用,如$username, $password。但这样存在安全隐患。后来默认为Off。 引用方法:$_POST[USERNAME]、$_POST[password] $_GET[USERNAME]、$_ GET[password]
在PHP的URL上加入参数 :15-3.php?username=RBT&sex=男&age=22 用$_GET[username]、$_GET[sex]等处理。
pathinfo — 返回文件路径的信息
16 计数器程序
简单文本计数器 :
< ? php $ c_file = "counter.txt" ; //文件名赋值给变量 if ( ! file_exists ( $ c_file ) ) //如果文件不存在的操作 { $ myfile = fopen ( $ c_file , "w" ) ; //创建文件 fwrite ( $ myfile , "0" ) ; //置入“0” fclose ( $ myfile ) ; //关闭文件 } $ t_num = file ( $ c_file ) ; //把文件内容读入变量 $ t_num [ 0] + + ; //文件内容自增1 echo "欢迎!您是本站第" . $ t_num [ 0] . "位访客!" ; //显示文件内容 $ myfile = fopen ( $ c_file , "w" ) ; //打开文件 fwrite ( $ myfile , $ t_num [ 0] ) ; //写入新内容 fclose ( $ myfile ) ; //关闭文件 ? >
图形化计数器
< ? php $ c_file = "counter.txt" ; //文件名赋值给变量 if ( ! file_exists ( $ c_file ) ) //如果文件不存在的操作 { $ myfile = fopen ( $ c_file , "w" ) ; //创建文件 fwrite ( $ myfile , "0" ) ; //置入“0” fclose ( $ myfile ) ; //关闭文件 } $ t_num = file ( $ c_file ) ; //把文件内容读入变量 $ t_num [ 0] + + ; //原始数据自增1 $ myfile = fopen ( $ c_file , "w" ) ; //写入方式打开文件 fwrite ( $ myfile , $ t_num [ 0] ) ; //写入新数值 fclose ( $ myfile ) ; //关闭文件 echo "欢迎!您是本站第" ; //显示内容头部 $ myfile = fopen ( $ c_file , "r" ) ; //以只读方式打开文件 while ( ! feof ( $ myfile ) ) //循环读出文件内容 { $ num = fgetc ( $ myfile ) ; //当前指针处字符赋值给变量 if ( $ num!==FALSE ) //如果数值存在执行操作 { echo ". $ num . ".gif>" ; //显示相应图片 } } fclose ( $ myfile ) ; //关闭文件 echo "位访客!" ; //显示内容尾部 ? >
string fgetc ( resource $handle ), 返回一个包含有一个字符的字符串,该字符从 handle 指向的文件中得到。碰到 EOF 则返回 FALSE。 文件指针必须有效,并且必须指向一个由 fopen() 或 fsockopen() 成功打开(但还没有被 fclose() 关闭)的文件。 警告:本函数可能返回布尔值 FALSE,但也可能返回一个与 FALSE 等值的非布尔值,例如 0 或者 ""。请参阅布尔类型章节以获取更多信息。应使用 === 运算符来测试本函数的返回值。
加入“防恶意刷新功能”
< ? php $ c_file = "counter.txt" ; //文件名赋值给变量 if ( ! file_exists ( $ c_file ) ) //如果文件不存在的操作 { $ myfile = fopen ( $ c_file , "w" ) ; //创建文件 fwrite ( $ myfile , "0" ) ; //置入“0” fclose ( $ myfile ) ; //关闭文件 } $ t_num = file ( $ c_file ) ; //把文件内容读入变量 if ( $ _COOKIE [ "date" ] ! = "date(Y年m月d日)" ) //判断COOKIE内容与当前日期是否一致 { $ t_num [ 0] + + ; //原始数据自增1 $ myfile = fopen ( $ c_file , "w" ) ; //写入方式打开文件 fwrite ( $ myfile , $ t_num [ 0] ) ; //写入新数值 fclose ( $ myfile ) ; //关闭文件 //重新将当前日期写入COOKIE并设定COOKIE的有效期为24小时 setcookie ( "date" , "date(Y年m月d日)" , time ( ) + 60* 60* 24) ; } ? >
多用户计数器
创建counter表
< ? php $ myconn = mysql_connect ( "localhost" , "root" , "rbt0328" ) ; //连接到服务器 mysql_select_db ( data2, $ myconn ) ; //连接到test库 $ query = "create table counter (id int(5) not null auto_increment primary key, username varchar(20) not null, count int(5) not null)" ; //创建counter表语句 mysql_query ( $ query ) ; //执行语句 mysql_close ( $ myconn ) ; //关闭对数据库的连接 echo "你已经成功创建数据表" ; //创建成功提示 ? >
核心文件:
document. write( "if($_GET[" username"]) { $username=$_GET[" username"]; $myconn=mysql_connect(" localhost"," root"," rbt0328"); //连接到服务器 mysql_select_db(data2,$myconn); //连接到test库 $sqlstr=" select * from counter where username= '$username' "; //查询用户名语句 $result=mysql_query($sqlstr) or die(mysql_error()); //执行查询语句 $num=mysql_num_rows($result); //查询结果保存到变量 if($num==0) //如果结果为0执行操作 { $sqlstr=" insert into counter ( username) values ( '$username' ) ";//插入记录语句 mysql_query($sqlstr) or die(mysql_error()); //执行语句 } $sqlstr=" select count from counter where username= '$username' ";//重新查询 $result=mysql_query($sqlstr) or die(mysql_error()); //执行查询语句 $count=mysql_fetch_array($result); //结果保存到变量 $count[0]++; //自增1 echo $count[0]; //显示新结果 $sqlstr=" update counter set count = count + 1 where username= '$username' ";//更新数据 $result=mysql_query($sqlstr) or die(mysql_error()); //执行更新语句 mysql_close($myconn); //关闭数据库连接 } else echo " 用户名不能为空"; ?> 位访问者" ) ;
运行时在WEB页插入脚本 :
< script language = "javascript" src = "" > < / script >
多用户,防刷新??