mssql_bind出错问题

本文介绍使用PHP连接MSSQL Server 2005并调用存储过程时遇到的问题及解决办法。作者尝试调用一个计算特定年龄学生数量的存储过程,但在调试过程中遇到了错误,指出只有变量可以通过引用传递。

今天玩着没事,用php连接mssql server 2005的存储过程,出现小的错误

代码如下,

$host="localhost";
	$user='sa';
	$password='01211107';
	$dbname='book';
	$link=mssql_connect($host,$user,$password) or die('link failure');
	if($link){
		mssql_select_db('book');
	}
	$stmt=mssql_init('cheng',$link);
	mssql_bind($stmt,'@ager', 25 ,SQLINT1,false,false,3);
	$sp=mssql_execute($stmt);
	while($row=mssql_fetch_assoc($sp)){
		print_r($row);
	}

存储过程为:

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
ALTER procedure [dbo].[cheng]
@ager smallint
as
	begin 
		select count(*) as cou from student where age=@ager
	end

  

在xdebug调试下,提示

Fatal error: Only variables can be passed by reference in D:\php5\test.php on line 16

只有变量可以通过引用传递的意思

mssql_bind(),第三个参数必须是变量

<think>嗯,用户问的是ldap_simple_bind和ldap_bind的区别。这是个技术性很强的问题,得仔细梳理清楚。 从用户提供的引用材料来看,有几个关键点值得注意:引用[1]提到ldap_bind()在密码包含特殊字符时可能失败,引用[2]显示ldap_sasl_bind(SIMPLE)报错,引用[3]讨论了ldap_bind: Invalid credentials的解决方法,引用[4]则涉及SASL绑定配置。这些材料虽然不直接回答用户问题,但暗示了绑定机制的复杂性。 用户的核心疑问在于两个API的区别。需要明确的是: - ldap_simple_bind是专用于SIMPLE认证的同步操作 - ldap_bind是更通用的异步接口,支持多种认证机制 在技术实现上,ldap_simple_bind内部会调用ldap_bind,但前者是同步阻塞的。用户如果只是做简单密码验证,用ldap_simple_bind更方便;若需要SASL或异步操作,就必须用ldap_bind。 使用场景的差异也很关键:SIMPLE绑定适合内部系统或测试环境,而生产环境更推荐SASL。引用[4]提到的Kerberos映射就是SASL的典型应用。 用户可能还隐含想知道性能影响。引用[1]提到ldap_bind和ldap_search的耗时差异很小,这说明选择哪种绑定方式对性能影响不大,关键是根据安全需求选择。 最后生成的问题要覆盖用户可能延伸的疑问:特殊字符处理、SASL配置、错误排查等,这些都是实际使用中常见痛点。</think>以下是关于 `ldap_simple_bind` 与 `ldap_bind` 功能和使用场景的详细对比: --- ### **核心区别** | **特性** | **`ldap_simple_bind`** | **`ldap_bind`** | |-------------------|--------------------------------------------|-------------------------------------------| | **认证机制** | 仅支持 **SIMPLE 认证**(明文用户名/密码) | 支持 **SIMPLE/SASL/GSSAPI** 等多种认证 | | **同步性** | 同步操作(阻塞直到返回结果) | 支持同步或异步操作(通过参数控制) | | **功能范围** | 功能子集(仅处理简单绑定) | 功能超集(可扩展复杂认证场景) | | **安全性** | 低(明文传输敏感信息) | 高(支持加密协议如 SASL/Kerberos)[^4] | --- ### **使用场景对比** 1. **`ldap_simple_bind`** - **适用场景**: - 内部测试环境或受信任网络 - 快速原型验证(如示例代码调试) - 遗留系统兼容性要求 - **典型问题**: - 密码含特殊字符(如 `&`)时易失败[^1] - 明文传输导致安全风险 2. **`ldap_bind`** - **适用场景**: - 生产环境(需加密或第三方认证) - 集成 Kerberos/SAML 等企业级认证[^4] - 异步操作需求(避免阻塞主线程) - **典型配置**: ```c // SASL 认证示例 ldap_bind(ld, "uid=user,dc=example,dc=com", NULL, LDAP_AUTH_SASL); ``` --- ### **常见错误与解决** | **错误类型** | **原因** | **解决方案** | |------------------------------|-----------------------------------|-------------------------------------------| | `Invalid credentials (49)` | 密码错误或 DN 格式无效 | 检查 `slapd.conf` 中 `rootpw` 的配置[^3] | | `Can't contact LDAP (-1)` | 服务器未启动或防火墙拦截 | 验证服务状态及端口可访问性[^2] | | `SASL bind failure` | Kerberos 映射不匹配(如域名错误) | 确保 `/etc/krb5.conf` 与 DN 一致[^4] | --- ### **选择建议** - **优先 `ldap_bind`**: 需企业级安全(如 TLS 加密、SASL)或异步处理时使用。 - **谨慎用 `ldap_simple_bind`**: 仅限低风险环境,且需转义特殊字符(如 `&` → `\26`)[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值