这篇教程对初学者会有帮助的,我们讲了数据库教程连接并且利用mysql教程_query,mysql_num_rows,mysql_fetch_row三个函数把记录读取并输出。
<html>
<head>
<title>Selecting Data</title>
</head>
<body>
<?php教程
$user = "root";
$pass = "";
$db = "mydatabase";
$link = mysql_connect( "localhost", $user, $pass );
if ( ! $link ) {
die( "Couldn't connect to MySQL: ".mysql_error() );
}mysql_select_db( $db, $link ) or die ( "Couldn't open $db: ".mysql_error() );
$result = mysql_query( "SELECT * FROM domains where sex='F'" );
$num_rows = mysql_num_rows( $result );print "<p>$num_rows www.111cn.net women have added data to the table</p>n";
print "<table>";
while ( $a_row = mysql_fetch_row( $result ) ) {
print "<tr>";
foreach ( $a_row as $field ) {
print "<td>".strips教程lashes($field)."</td>";
}
print "</tr>";
}
print "</table>";
mysql_close( $link );
?>
</body>
</html>
下面我们用Mysql数据库教程来存储用户的身份。我们需要从数据库中提取每个帐号的用户名和密码以便与$PHP_AUTH_USER和$PHP_AUTH_PW变量进行比较,判断用户的真实性。
首先,在MySql中建立一个存放用户信息的数据库
数据库名为XinXiKu ,表名为user;表定义如下:
View Code 1 create table user(
2 ID INT(4) NOT NULL AUTO_INCREMENT,
3 name VARCHAR(8) NOT NULL,
4 password CHAR(8) NOT NULL,
5 PRIMARY KEY(ID)
6 )
说明:
1、ID为一个序列号,不为零而且自动递增,为主键;
2、name为用户名,不能为空;
3、password为用户密码,不能为空;
以下是用户验证文件login.php教程
View Code 1 //判断用户名是否设置
2 if(!isset($PHP_AUTH_USER))
3 {
4 header("WWW-Authenticate:Basic realm="身份验证功能"");
5 header("HTTP/1.0 401 Unauthorized");
6 echo "身份验证失败,您无权共享网络资源!";
7 exit();
8 }
9 /*连接数据库*/
10 $db=mysql教程_connect("localhost","root","");
11 //选择数据库
12 mysql_select_db("XinXiKu",$db);
13 //查询用户是否存在
14 $result=mysql_query("SELECT * FROM user where name='$PHP_AUTH_USER' and password='$PHP_AUTH_PW'",$db);
15 if ($myrow = mysql_fetch_row($result))
16 {
17 //以下为身份验证成功后的相关操作
18 ...
19 }
20 else
21 {
22 //身份验证不成功,提示用户重新输入
23 header("WWW-Authenticate:Basic realm="身份验证功能"");
24 header("HTTP/1.0 401 Unauthorized");
25 echo "身份验证失败,您无权共享网络资源!";
26 exit();
27 }
28 ?>
程序说明:
在程序中,首先检查变量$PHP_AUTH_USER是否已经设置。如果没有设置,说明需要验证,脚本发出HTTP 401错误号头标,告诉客户端的浏览器需要进行身份验证,由客户端的浏览器弹出一个身份验证窗口,提示用户输入用户名和密码,输入完成后,连接数据库,查询该用用户名及密码是否正确,如果正确,允许登录进行相关操作,如果不正确,继续要求用户输入用户名和密码。
函数说明:
1、isset():用于确定某个变量是否已被赋值。根据变量值是否存在,返回true或false
2、header():用于发送特定的HTTP标头。注意,使用header()函数时,一定要在任何产生实际输出的HTML或PHP代码前面调用该函数。
3、mysql_connect():打开 MySQL 服务器连接。
4、mysql_db_query():送查询字符串 (query) 到 MySQL 数据库。
5、mysql_fetch_row():返回单列的各字段。
二、用session实现服务器验证
对于需要身份验证的页面,使用apache服务器验证是最好不过的了。但是,apache服务器验证的界面不够友好。而且,cgi模式的php,iis下的php,都不能使用apache服务器验证。这样,我们可以利用session在不同页面间保存用户身份,达到身份验证的目的。
在后端我们同样利用上面的Mysql数据库存放用户信息。
我们先编写一个用户登录界面,文件名为login.php,代码职下:
View Code 1 <form action="login1.php">
2 用户名:<input type="text" name="name"><br>
3 口 令:<input type="text" name="pass"><br>
4 <input type="submit" value="登录">
5 </form>login1.php处理提交的表单,代码如下:
View Code 1 $db=mysql_connect("localhost","root","");
2 mysql_select_db("XinXiKu",$db);
3 $result=mysql_query("SELECT * FROM user where name='$name' and password='$pass'",$db);
4 if ($myrow = mysql_fetch_row($result))
5 {
6 //注册用户
7 session_start();
8 session_register("user");
9 $user=$myrow["user"];
10 // 身份验证成功,进行相关操作
11 ...
12 }
13 else
14 {
15 echo"身份验证失败,您无权共享网络资源!";
16 }
17 ?>
这里需要说明的是,用户可以使用在后续的操作中用**http://domainname/next.php?user=用户名 **来绕过身份验证。所以,后续的操作应先检查变量是否注册:已注册,则进行相应操作,否则视为非法登录。相关代码如下:
View Code 1 session_start();
2 if (!session_is_registered("user"))
3 {
4 echo "身份验证失败,属于非法登录!";
5 }
6 else
7 {
8 //成功登录进行相关操作
9 ...
10 }
11 ?>
下面我们要讲到二种用户登录方法一种是利用window验证加数据库教程密码验证实现登录,后者是利用cookie记录用户信息进行登录,有需要的朋友可以试下。
<?php教程
function authenticate_user() {
header('WWW-Authenticate: Basic realm="Secret Stash"');
header("HTTP/1.0 401 Unauthorized");
exit;
}if (! isset($_SERVER['PHP_AUTH_USER'])) {
authenticate_user();
} else {
mysql教程_pconnect("localhost","authenticator","secret") or die("Can't connect to database server!");
mysql_select_db("java2s") or die("Can't select authentication database!");$query = "SELECT username, ps教程wd FROM user WHERE username='$_SERVER[PHP_AUTH_USER]' AND pswd=MD5('$_SERVER[PHP_AUTH_PW]')";
$result = mysql_query($query);
// If nothing was found, reprompt the user for the login www.111cn.net information.
if (mysql_num_rows($result) == 0) {
authenticate_user();
}
}
?>
利用cookie登录方法
<html>
<head>
<title>Enter Password</title>
</head>
<body>
<form name="forml" method="POST" action="CookieBasedPasswordLogin.php">
<table>
<tr>
<td colspan="2" >
<div align="center"><b>Please Specify the Password</b></div>
</td>
</tr>
<tr>>
<td>
<div align="right">Customer ID</div>
</td>
<td>
<input type="text" name="username">
</td>
</tr>
<tr>
<td>
<div align="right">Password</div>
</td>
<td>
<input type="password" name="password">
</td>
</tr>
<tr>
<td colspan="2">
<center>
<input type="submit" name="Submit" value="Login">
</center>
</td>
</tr>
</table>
</form>
</body>
</html>
<!-- CookieBasedPasswordLogin.php
<?php
$now = getdate();
$storetime= $now["weekday"] . " " . $now["month"] ." " . $now["year"] ;
$storetime.=" Time : ";if ($now["hours"] < 10) {
$storetime.= "0" . $now["hours"];
} else {
$storetime.= $now["hours"];
}
$storetime.= ":";
if ($now["minutes"]<10) {
$storetime.= "0" . $now["minutes"];
} else {
$storetime.= $now["minutes"];
}
$storetime.= ": ";
if ($now["seconds"] <10) {
$storetime.= "0" . $now["seconds"];
} else {
$storetime.= $now["seconds"];
}
if (isset($data)) {
$counter=++$data[l];
setcookie("data[0]",$storetime,time() + (60*60*24));
setcookie("data[l]", $counter,time() + (60*60*24)); setcookie("data[2]",$username,time() + (60*60*24));
echo "<b><center>Hi " . $data[2] . " ! !</center></b><br>n";
echo "<b><center>Last Login Time :" .$data[0] . "</center></b><br>n";
echo "<b><center>Current Date :" .$storetime. "</center></b><br>n";
echo "<b><center>Page View Count :" . $data[l]. "</center></b><br>n";
echo "<b><center>You have successfully logged in!</center></b>";
echo ("<b><contor>You can access this area without entering a password for the next 24 hours!</center></b>");
} else {
if (isset($username) && isset($password)) {
if ($password=="superpass") {
$counter=0;
setcookie("data[0]",$storetime,time() + (60*60*24));
setcookie("data[l]",$counter,time() + (60*60*24));
setcookie("data[2]",$username,time() + (60*60*24));
$url="Location: cookieimp.php";
header($url);
}else{
echo "<hl><center>INVALID PASSWORD!!!</center></hl>";
}
}
}
?>
什么是存储例程?
存储例程是存储在数据库教程服务器中的一组sql语句,通过在查询中调用一个指定的名称来执
行这些sql语句命令。
为什么要使用存储过程?
我们都知道应用程序分为两种,一种是基于web,一种是基于桌面,他们都和数据库进行交
互来完成数据的存取工作。假设现在有一种应用程序包含了这两种,现在要修改其中的一个
查询sql语句,那么我们可能要同时修改他们中对应的查询sql语句,当我们的应用程序很庞
大很复杂的时候问题就出现这,不易维护!另外把sql查询语句放在我们的web程序或桌面中
很容易遭到sql注入的破坏。而存储例程正好可以帮我们解决这些问题。
存储过程(stored procedure)、存储例程(store routine)、存储函数区别
Mysql存储例程实际包含了存储过程和存储函数,它们被统称为存储例程。
其中存储过程主要完成在获取记录或插入记录或更新记录或删除记录,即完成select
insert delete update等的工作。而存储函数只完成查询的工作,可接受输入参数并返回一
个结果。
创建存储过程、存储函数
create procedure 存储过程名(参数)
存储过程体
create function 存储函数名(参数)
存储函数体
假设现在有一个数据库omcmc中的表db_info 表结构如下:
SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for db_news
-- ----------------------------
DROP TABLE IF EXISTS `db_news`;
CREATE TABLE `db_news` (
`id` int(10) NOT NULL auto_increment,
`title` varchar(200) NOT NULL,
`editor` varchar(20) default NULL,
`origin` varchar(20) default NULL,
`tags` varchar(200) default NULL,
`content` text NOT NULL,
`hits` int(10) default '0',
`ip` varchar(15) NOT NULL,
`time` int(10) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=latin1;-- ----------------------------
-- Records
-- ----------------------------
INSERT INTO `db_news` VALUES ('1', First App', 'xqbar.com', 'xqbar.com', 'omcmc','detail。。', '100', '127.0.0.1', '1215051225');
使用上面的表我们创建一个简单的存储过程
create procedure select_news()
select title,hits from db_news;
在终端运行并调用
从上面的截图我们看到如何调用我们的存储过程
调用存储过程
call 存储过程名();
以上我们创建了一个简单的存储过程,当然我们的应用程序不可能使用这么简单的存储过程
,我们需要的是能给存储过程传递参数,以返回给我们所需要的结果数据。下面就了解下存
储过程的参数。
存储过程的参数
通常存储过程接受用户的参数,返回结果给调用用户。
mysql教程规定对于存储过程的参数要求其每个参数都必须声明其参数名,数据类型以及该参数是
输入参数还是用于返回信息还是两者兼有,对于存储函数php教程只支持输入参数。
声明参数时规定要使用关键字IN,OUT,INOUT。
其中:
IN:用于输入参数
OUT:用于返回参数
INOUT:用于向存储过程传递参数值,如果该值改变则返回
另外规定对于声名为OUT,INOUT的参数当我们调用存储过程时需要在参数名前加@,以确保参
数在过程外调用,下面我们修改上面的存储过程以传递信息编号给存储过程select_news,返
回对应的信息标题给我们查看。
drop procedure if exists select_news;
create procedure select_news(IN id int,OUT title varchar(200))
select db_news.title from db_news where db_news.id=id;在终端运行并调用
注意调用格式
call select_news(1,@title);
其中1是我们要传入的信息编号,title是要返回的对应信息编号标题,由于是OUT所以再调用时要在其前加@在过程外调用。(见下例)
drop procedure if exists getNum;
create procedure getNum(OUT num int)
select 100 into num;call getNum(@num);
select @num;
截图:
php存储例程、存储过程进阶学习之二
接着上篇文章,再调用有返回值时上个例子我们可以使用以下的方法调用存储过程:
select @返回参数;
我们现在使用这个方法来调用上面我们创建的select_news,来看看
有人会疑问为什么返回的title是null,而不是像call select_news(1,@title)一样返回的是
我们数据库编号对应的数据First App,这是由于我们的存储过程体并没有给title返回参数返
回值。
下面我们来看看存储函数
仍然以db_news表为例说明,不过我们在这个存储函数中我们加入其他一些关于存储例程的知
识来引入我们这次要谈及的学习对象。
drop function if exists count_news;
delimiter //
create function count_news(hits int) returns int
comment '根据传入的点击次数统计超过此点击数的信息数目'
begin
declare total_news int;
declare hits_num int default 0;
if hits>=0 then
set hits_num=hits;
select count(id) into total_news from db_news where db_news.hits>hits_num;
else
set total_news=0;
end if;
return total_news;
end;
//
delimiter ;
在上面的存储函数中我们使用到了存储例程变量的声明、设置其值、判断语句、存储函数特
有的返回值类型及存储例程如何描述(comment).
与存储过程返回参数不同的是存储函数在定义时没用直接声明哪个变量是返回参数,而只是
使用了returns声明了返回参数所属的数据类型,返回参数是在函数体中使用return返回要返
回的数据变量的形式来表示的。这就需要注意的是:
存储函数只支持输入参数,并且输入参数前没有IN或INOUT.
返回上面的存储函数,我们来解释下代码含义:
drop function if exists count_news;
如果存在存储函数count_news则删除该存储函数,与存储过程一样我们可以使用下面的语句
删除存储过程或函数
drop procedure|function [if exists] 存储过程名|存储函数名;
delimiter //
使用delimiter更改mysql默认使用分号(;)使用新的结束符号来结束当前语句,使用
delimiter后原先默认的分号(;)结束语句符号不再起作用,直到重新恢复声明结束符后。
create function count_news(hits int) returns int
注意存储函数的参数只有输入参数并且前不再声明IN或INOUT,返回只需声明要返回的数据类
型
comment '根据传入的点击次数统计超过此点击数的信息数目'
使用comment 来描述该存储过程或存储函数的功能信息。使用格式为 comment '描述字符串
'
begin
使用begin限定一个处理模块
declare total_news int;
声明变量 格式 declare 变量名 数据类型 [default 默认值]
declare hits_num int default 0;
声明变量 格式 declare 变量名 数据类型 [default 默认值]
if hits>=0 then
set hits_num=hits;
使用set 给变量赋值
select count(id) into total_news from db_news where db_news.hits>hits_num;
sql语句可以使用into给变量赋值
else
set total_news=0;
end if;
上面是一个判断语句,注意格式为if-else-end if 或者 if –else if-else-end if
注意分号(;)
return total_news;
使用return 返回存储函数要返回的值,注意该值只能是一个值。
end;
//
delimiter ;
综合一下我们上面的概念知识:
1. 存储函数的参数与存储过程有何不同。
2. 在存储例程中如何更改mysql的默认结束符号。
3. 在存储例程中如何描述功能信息。
4. 声明、设置变量。
5. begin-end语句块。
6. 条件判断if-else if-else-end if 或if-else-end if 或者if-end if
php教程 批量删除MySql数据库教程中相同前缀的表
<form id="form1" name="form1" method="post" action="<?php echo $PHP_SELF; ?>?
action=kill">
<table width="425" border="0" align="center">
<tr>
<td height="46" colspan="2" align="center"><p>批量删除MySQL数据库相同前缀的数据表 by <a href="http://www.111cn.net" target="_blank">sudu8</a></p></td>
</tr>
<tr>
<td width="103">ip地址</td>
<td width="306" height="26"><label>
<input name="ip" type="text" id="ip" value="localhost" />
</label></td>
</tr>
<tr>
<td height="25">数据库账号</td>
<td height="26"><label>
<input type="text" name="user" id="user" />
</label></td>
</tr>
<tr>
<td>数据库密码</td>
<td height="26"><label>
<input type="text" name="pass" id="pass" />
</label></td>
</tr>
<tr>
<td>数据库</td>
<td height="26"><label>
<input type="text" name="db" id="db" />
</label></td>
</tr>
<tr>
<td>要删除的前缀</td>
<td height="26"> <label>
<input type="text" name="qz" id="qz" />
</label>( 例如:bbs_ )</td>
</tr>
<tr>
<td height="67" colspan="2" align="center"> <label>
<input type="submit" name="tijiao" id="tijiao" value="开始删除" />
</label></td>
</tr>
</table>
</form>
<?phpif(@$_GET["action"]=="kill"){
if (empty($_POST['ip']))
echo "您没有填写IP地址";
echo "<br>";
if (empty($_POST['user']))
echo "您没有填写用户名";
echo "<br>";
if (empty($_POST['pass']))
echo "您没有填写密码";
echo "<br>";
if (empty($_POST['db']))
echo "您没有填写数据库";
echo "<br>";
if (empty($_POST['qz']))
echo "您没有填写前缀";
echo "<br>";
$ip=$_POST['ip'];
$user=$_POST['user'];
$pass=$_POST['pass'];
$db=$_POST['db'];
$qz=$_POST['qz'];
$conn=mysql教程_connect($ip,$user,$pass);
if (!$conn){
die ("数据库连接出错! www.111cn.net ");
}
mysql_connect($ip,$user,$pass);mysql_select_db($db);
$rs=mysql_query('show tables');
while($arr=mysql_fetch_array($rs)){
$TF=strpos($arr[0],$qz);
if($TF===0){
$FT=mysql_query("drop table $arr[0]");
if($FT){
echo "$arr[0] 删除成功!<br>";
}}
}
}
?>