找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 738|回复: 0

PHP调用SQLServer存储过程

[复制链接]
发表于 2011-10-10 08:25:27 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
PHP调用SQL Server存储过程   
<?php
$hostname = "tszzp";
$dbuser = "sa";
$dbpasswd = "";
$id = mssql_connect($hostname,$dbuser,$dbpasswd) or die("无法连接数据库服务器!");
//printf("%d<BR>\n", $id);
$db = mssql_select_db("stock",$id) or die("无法连接stock数据库!");
$stockcode=‘600600‘;
$id = 0;
$msg = 0;
//printf("%d<BR>\n", $db);
//$query = "exec sp_test @code=‘600028‘,@id=0,@msg=‘000000‘";
$query = "declare @result int, @id int, @msg varchar(20)\n";
$query.="exec @result=sp_test\n";
$query.="\"$stockcode\",\n";
$query.="@id output,\n";
$query.="@msg output;\n";
$query.="select @result result, @id id, @msg msg";
/*$query = "declare @result int, @id int, @msg varchar(20)\n";
$query.="exec @result=sp_test\n";
$query.="\"$stockcode\",\n";
$query.="@id output,\n";
$query.="@msg output;\n";
$query.="select @result result, @id id, @msg msg";
*///$query = "update test set stockname=‘2test‘ where stockcode=‘600028‘";
//$query = "insert into test(stockcode,stockname,id) values (‘600028‘,‘test‘,13)";
//$query = "select * from test where stockcode=‘600028‘";
//$query = "select 0 where 1=0 ";
$rresult = mssql_query($query) or die("无法执行SQL:$query");
$arr = mssql_fetch_array($rresult);
print $result;
print "<br>\n";
printf("%d, %d, %s<br>\n", $arr[result], $arr[id], $arr[msg]);
printf("%d, %s<br>\n", $id, $msg);
//$stock = mssql_fetch_array($result);
//$name = $stock[id];
//print $name;
//print "abc";
?>



这几天,在php项目中涉及用php调用sql server存储过程的问题,前几天采用的方法是传入的sql语句为exec 参数一,参数二...的形式,这样做有一个缺点就是不能在存储过程中带输出参数,带输出参数就解决不了了.当时的解决方案是在存储过程中把要输出的东西通过结果集返回来,然后再通过php进行处理.但是今天问题又来了,需要有一个根据区域,楼宇,房间,端口号,自动分配ip的存储过程,这个存储过程不但要在php中调用,还要在delphi的c/s程序中调用,为了通用性考虑,就必须用输出参数。于是下决心好好仔细研究一下php调存储过程。经过上网搜索资料和查php手册,加上自己的测试,终于实现了php调带参数的存储过程。具体过程如下:
       存储过程代码如下:
      create procedure test
       @user_name varchar(30),
       @password varchar(30),
       @info varchar(30) output
       as
       begin
           set @info = '用户名'+@user_name+'密码:'+@password
       end
      说明:上面是一个最简单的存储过程,该存储过程的作用就是把两个输入参数用指定的字符串连接起来,通过输出参数输出。
  $user_name = '龙之泪';      //声明一个变量,用做存储过程的输入参数
   $password = '123456';       //再声明一个变量,用做存储过程的另一个输入参数
   $info = '';                            //$info,用来接受从存储过程输出的参数值
   $host="192.168.0.1";         //定义数据库服务器
   $user="sa";                        //连接用户名
   $password="123456";        //连接密码
   $db="sample";                    //数据库名称
   $dblink=mssql_connect($host,$user,$password) or die("can't connect to mssql"); //连接数据库服务器
   mssql_select_db($db,$dblink)   or die("can't select sample");//选择数据库
   $sp = mssql_init("test");  //初始化一个存储过程
   //为存储过程添加一个参数,@user_name为参数名,$user_name为参数对应的php变量,SQLVARCHAR表明该参数类型为sql server的varchar类型,第一个false表示该参数不是输出参数,即该参数是输入参数,第二个false表示该参数不允许为null,最后的30表示该变量的长度为30
   mssql_bind($sp,"@user_name",$user_name,SQLVARCHAR,FALSE,FALSE,30);
   mssql_bind($sp,"@password",$password,SQLVARCHAR,FALSE,FALSE,30);
   mssql_bind($sp,"@info",$info,SQLVARCHAR,TRUE,FALSE,30); //为存储过程添加一个输出参数
   mssql_execute($sp); //执行该存储过程
   echo $info; //打印出从存储过程中返回的输出参数值


作者:weiweiok
转载请注明出处:http://hi.baidu.com/phpbuff/blog/item/08eb72e9df098935b90e2d6b.html

--------------------------------------------------------------------------------
语法
//创建存储过程对象
$sp对象 = mssql_init("存储过程名", $数据库连接);
//设置参数变量和返回值变量
//参数2:名称必须与sql server 里的变量名一致
//参数3:必须是一个变量
//参数4:数据类型需与sql server 里的变量类型一致,但标识符不同,对应表见附录
//参数5:如果是true表示是返回值,返回值可以有多个
$参数值 = "hello";
mssql_bind($sp对象, "@SQLSERVER参数名称", $参数值, 数据类型, false);
$返回值;
mssql_bind($sp对象, "@SQLSERVER返回值名称", $返回值, 数据类型, true);
//执行
if(!$rs = mssql_execute($sp对象, false)) {
    echo "执行失败";
} else {
    echo "执行成功,返回值:" . $返回值;
}

--------------------------------------------------------------------------------
【例一】php调用存储过程,传递参数,并接收返回值

SQL Server 存储过程:

USE [MY_DB]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[SP_login]
   @theUsername    nvarchar(20),
   @thePassword     nvarchar(32),
@theResault        tinyint OUTPUT
AS
BEGIN
    SET NOCOUNT ON;
    IF ( @theUsername = 'weiweiok' AND thePassword='123456')
         SET @theResault = 1
    ELSE
        SET @theResault = 0
END
PHP代码:

$theUsername = "weiweiok";
$thePassword = "123456";
$theResault;
$sp = mssql_init("SP_login", $数据库连接);
mssql_bind($sp, "@theUsername", $theUsername, SQLVARCHAR);
mssql_bind($sp, "@thePassword", $thePassword, SQLVARCHAR);
mssql_bind($sp, "@theResault", $theResault, SQLINT4, true);
if(!$rs = mssql_execute($sp, false)) {
    echo "执行失败";
}
echo "<p>返回值:" . $theResault . "</p>";

--------------------------------------------------------------------------------
【例二】php调用存储过程,返回记录集

SQL Server 存储过程:
USE [MY_DB]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[SP_read]
AS
BEGIN
    SET NOCOUNT ON;
    SELECT * FROM [dbo].[MY_user]
END
PHP代码:
$sp = mssql_init("SP_read", $数据库连接);
if(!$rs = mssql_execute($sp, false)) {
    echo "执行失败";
}
while ($r = mssql_fetch_array($rs)) {
     echo $r["id"]." --> ".$r["username"]."<br />";
}

--------------------------------------------------------------------------------
【附录1】SQL Server 与 PHP 变量类型标识符对照表
if(!defined('dbMSSQL_Types'))
{
    define('dbMSSqlTypes',1);
    $MSSQL_types[127] = SQLINT4; /* bigint*/
    $MSSQL_types[104] = SQLBIT;    /* bit*/
    $MSSQL_types[175] = SQLCHAR; /* char*/
    $MSSQL_types[56] = SQLINT4; /* int*/
    $MSSQL_types[52] = SQLINT2; /* smallint*/
    $MSSQL_types[35] = SQLTEXT; /* text*/
    $MSSQL_types[48] = SQLINT1; /* tinyint*/
    $MSSQL_types[167] = SQLVARCHAR; /* varchar*/
    $MSSQL_types[62] = SQLFLT8; /* float*/
    $MSSQL_types[173] = SQLVARCHAR; /* binary*/    // Adaptation
    $MSSQL_types[61] = SQLVARCHAR; /* datetime*/    // Adaptation
    $MSSQL_types[106] = SQLFLT8; /* decimal*/ // Adaptation
    $MSSQL_types[34] = SQLVARCHAR; /* image*/ // Adaptation
    $MSSQL_types[60] = SQLFLT8; /* money*/ // Adaptation
    $MSSQL_types[239] = SQLCHAR; /* nchar*/ // Adaptation
    $MSSQL_types[99] = SQLTEXT; /* ntext*/ // Adaptation
    $MSSQL_types[108] = SQLFLT8; /* numeric*/ // Adaptation
    $MSSQL_types[231] = SQLVARCHAR; /* nvarchar*/    // Adaptation
    $MSSQL_types[59] = SQLFLT8; /* real*/    // Adaptation
    $MSSQL_types[58] = SQLINT4; /* smalldatetime*/ // Adaptation
    $MSSQL_types[122] = SQLFLT8; /* smallmoney*/    // Adaptation
    $MSSQL_types[98] = SQLVARCHAR; /* sql_variant*/ // Adaptation
    $MSSQL_types[189] = SQLINT4; /* timestamp*/ // Adaptation
    $MSSQL_types[165] = SQLVARCHAR; /* varbinary*/ // Adaptation
}
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

返回顶部快速回复上一主题下一主题返回列表找客服手机访问
快速回复 返回顶部 返回列表