php存储例程、存储过程进阶学习
什么是存储例程?
存储例程是存储在数据库教程服务器中的一组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
下面我们要讲到二种用户登录方法一种是利用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>";
}
}
}
?>
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>";
}}
}
}
?>
定义和用法
header() 函数向客户端发送原始的 HTTP 报头。
认识到一点很重要,即必须在任何实际的输出被发送之前调用 header() 函数(在 PHP 4 以及更高的版本中,您可以使用输出缓存来解决此问题):
<html>
<?php教程
// 结果出错
// 在调用 header() 之前已存在输出
header('Location: http://www.111cn.net/');
?>语法
header(string,replace,http_response_code)参数 描述
string 必需。规定要发送的报头字符串。
replace 可选。指示该报头是否替换之前的报头,或添加第二个报头。
默认是 true(替换)。false(允许相同类型的多个报头)。
http_response_code 可选。把 HTTP 响应代码强制为指定的值。(PHP 4 以及更高版本可用)
1.定义header()头部输出格式
header("Content-type:application/vnd.ms-excel"); //定义输出的文件类型
header(“content-Disposition:filename=downloaded.pdf”); //定义输出的文件名,也就是设置一个下载类型,下载的时候对文件从新命名
<?php
header("Content-type:application/vnd.ms-excel");
header("content-Disposition:filename=downloaded.pdf ");echo"1t 2t 3n"; //其中 t 是空白 ,n是回车 (编码规范 不能直接输出)
echo"1t 2t 3n";
echo"1t 2t 3n";
?>
这时候就可以打开这个php文件,就会提示下载。
也可以以table表格的方式输出;
<?php
header("Content-type:application/vnd.ms-excel ");
header("content-Disposition:filename=downloaded.pdf");
?>
<table>
<tr>
<td>t00</td><td>t01</td><td>t02</td>
</tr>
<tr>
<td>t10</td><td>t11</td><td>t12</td>
</tr>
<tr>
<td>t20</td><td>t21</td><td>t22</td>
</tr>
</table>
CSV的写入操作:
fputcsv()的使用可参考.
$fp = fopen('f:/file.csv', 'w');
fputcsv($fp,array('aaa','bbb','cccc'));
fputcsv($fp,array('mmm','yyy','haha')); //fputcsv()可以用数组循环的方式进行实现
fclose($fp);
mysql教程_real_escape_string() 函数转义 SQL 语句中使用的字符串中的特殊字符。
下列字符受影响:
x00
n
r
'
"
x1a
如果成功,则该函数返回被转义的字符串。如果失败,则返回 false。
语法
mysql_real_escape_string(string,connection)参数 描述
string 必需。规定要转义的字符串。
connection 可选。规定 MySQL 连接。如果未规定,则使用上一个连接。
实例
<?php教程
function opendatabase ($host,$user,$pass) {
try {
if ($db = mysql_connect ($host,$user,$pass)){
return $db;
} else {
throw new exception ("Sorry, could not connect to mysql.");
}
} catch (exception $e) {
echo $e->getmessage ();
}
}
function selectdb ($whichdb, $db){
try {
if (!mysql_select_db ($whichdb,$db)){
throw new exception ("Sorry, database could not be opened.");
}
} catch (exception $e) {
echo $e->getmessage();
}
}
function closedatabase ($db){
mysql_close ($db);
}
$db = opendatabase ("localhost","root","");
selectdb ("mydatabase",$db);
$_POST['user'] = "myname";
$_POST['pass'] = "mypassword";
function validatelogin ($user,$pass){
mysql_real_escape_string ($user);
mysql_real_escape_string ($pass);
$thequery = "SELECT * FROM userlogin WHERE username='$user' AND password='$pass'";
if ($aquery = mysql_query ($thequery)){
if (mysql_num_rows ($aquery) > 0){
return true;
} else {
return false;
}
} else {
echo mysql_error();
}
}
if (validatelogin ($_POST['user'],$_POST['pass'])){
echo "You have successfully logged in.";
} else {
echo "Sorry, you have an incorrect username and/or password.";
}
closedatabase ($db);
?>
相关文章
- Create Procedure AtoC @ChangeMoney Money as Set Nocount ON Declare @String1 char(20) Declare @String2 char(30) ...2016-11-25
- 这篇文章主要介绍了Vue基于localStorage存储信息代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-11-16
- 存储过程在数据库的应用中我们用到的非常的多了,下面我们来看一篇关于PHP操作MSSQL存储过程修改用户密码的例子,具体的如下所示。 mssql2008 存储过程 下面可以直接...2016-11-25
- 这篇文章主要介绍了PyTorch一小时掌握之迁移学习篇,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-09-08
- 具体详情请看下文小编给大家带来的知识点。同编写程序类似,存储过程中也有对应的条件判断,功能类似于if、switch。在MySql里面对应的是IF和CASE1、IF判断IF判断的格式是这样的:IF expression THEN commands [ELSEIF ex...2015-10-21
- 本文章来给大家详细介绍在php中如何来调用执行mysql存储过程然后返回由存储过程返回的值了,有需要了解的同学可进入参考。 。调用存储过程的方法。 a。如果存储过...2016-11-25
- 参考:http://stackoverflow.com/questions/412341/how-should-i-store-guid-in-mysql-tables通常用UUID做唯一标识,需要在数据库中进行存储。UUID的格式 复制代码 代码如下: String string = UUID.randomUUID().toStrin...2015-03-15
- 这篇文章主要介绍了C#调用存储过程的方法,结合实例形式详细分析了各种常用的存储过程调用方法,包括带返回值、参数输入输出等,需要的朋友可以参考下...2020-06-25
- 这绝对是一套值得分享和大家收藏的Bootstrap学习教程,完整的知识体系,系统的学习资料,帮助大家开启Bootstrap学习之旅,享受Bootstrap带给大家的奇妙乐趣...2016-05-14
- 复制代码 代码如下:call PROCEDURE_split('分享,代码,片段',',');select * from splittable;复制代码 代码如下:drop PROCEDURE if exists procedure_split;CREATE PROCEDURE `procedure_split`( inputstring varc...2014-05-31
- 当下最流行的前端开发框架Bootstrap,可大大简化网站开发过程,从而深受广大开发者的喜欢,你如果也喜欢Bootstrap前端开发框架,不要错过这次旅行...2016-05-05
- 这篇文章主要介绍了JS变量存储深拷贝和浅拷贝,想深入了解JS的同学,可以参考下...2021-05-04
- 这篇文章主要介绍了学习 Vue.js 遇到的那些坑,帮助大家更好的理解和使用vue框架,感兴趣的朋友可以了解下...2021-02-04
- 这篇文章主要介绍了是如何进行机器学习的模型的训练,全文逻辑清晰,简单易懂,如果您正在学习机器学习那么可以参考下,说不定会有不一样的收货...2021-04-16
- c#调用存储过程实现登录界面详解...2020-06-25
- 本文主要介绍了每一个独立的JS文件或者不同的控制器如何实现数据的共享与交互的方法。具有一定的参考价值,下面跟着小编一起来看下吧...2017-01-23
- 这篇文章主要介绍了C#获取存储过程返回值的方法,大家参考使用吧...2020-06-25
- 这篇文章主要为大家详细介绍了C++实现数据文件存储与加载,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-04-25
- 这篇文章主要介绍了Java Spring动态生成Mysql存储过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-06-04
- 这篇文章主要介绍了分布式文档存储数据库之MongoDB备份与恢复,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2020-12-08