sqlsrv_execute 错误与 PHP 错误和存储过程
sqlsrv_execute Errors With PHP Errors and Stored Procedures
我正在努力将我们的数据从使用内联 SQL 迁移到使用存储过程。当我的代码 运行 出现如下错误时,我遇到了麻烦:
Warning: sqlsrv_execute() expects parameter 1 to be resource, bool given in ajax_functions1.live.php on line 285
Warning: sqlsrv_fetch_array() expects parameter 1 to be resource, bool given in ajax_functions1.live.php on line 296
下面是代码的摘录:
function db_add_user($email, $provider, $subuid,$data){
include 'config.php';
$email = $data['preferred_username'];
$params = array(
array(&$myparams['email'], SQLSRV_PARAM_IN),
array(&$myparams['provider'], SQLSRV_PARAM_IN)
);
$sql = "{EXEC [dbo].[getSubUniqueID_HPCreate] @email = ?, @provider = ?}";
$stmt = sqlsrv_prepare($conn, $sql, $params);
sqlsrv_execute($stmt);
$uid=null;
if($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC) > 0) {
$uid = $row[0]['sub_unique_id'];
}else{
$params = array(
array(&$myparams['email'], SQLSRV_PARAM_IN),
array(&$myparams['provider'], SQLSRV_PARAM_IN),
array(&$myparams['subuid'], SQLSRV_PARAM_IN)
);
$sql = "{EXEC [dbo].[insertSubUniqueID_HPCreate] @email = ?, @provider = ?, @subuid = ?}";
$stmt = sqlsrv_prepare($conn, $sql, $params);
sqlsrv_execute($stmt);
}
return $uid;
}
这是SPdbo.getSubUniqueID_HPCreate
USE [homepages_config]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[getSubUniqueID_HPCreate]
@email nvarchar(256),
@provider nvarchar(64)
AS
BEGIN
SET NOCOUNT ON;
SELECT sub_unique_id FROM homepages_config.dbo.users_providers
WHERE email = @email AND provider_id = @provider;
END
这是SPdbo.insertSubUniqueID_HPCreate
USE [homepages_config]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[insertSubUniqueID_HPCreate]
@email nvarchar(256),
@provider nvarchar(256),
@subuid nvarchar(1024)
AS
BEGIN
SET NOCOUNT ON;
INSERT INTO homepages_config.dbo.users_providers ([email], [provider_id], [sub_unique_id])
VALUES (LOWER(@email), @provider, @subuid)
END
如有任何帮助,我们将不胜感激。
首先,存储过程是正确的。一个问题是 @provider
参数(@provider nvarchar(64)
和 @provider nvarchar(256)
)的不同声明,但这可能是输入错误。
所以,我认为您应该对脚本进行一些更改:
- 使用
{call sp_name (?, ...)}
语法执行存储过程。这是 Warning: sqlsrv_execute() expects parameter 1 to be resource, bool given in ajax_functions1.live.php on line ... 错误的可能原因,因为函数sqlsrv_prepare()
未正确执行,您需要检查此执行的结果。注意,你可以使用sqlsrv_query()
,因为这个函数既做语句准备又做语句执行,可以用来执行参数化查询。
- 更改
db_add_user()
函数的参数声明。
- 始终检查错误。
sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)
的结果是一个关联数组,所以$row[0]['sub_unique_id']
是一个错误。
以下脚本(基于您的代码)可能是您问题的解决方案:
<?php
function db_add_user($email, $provider, $subuid){
include 'config.php';
$params = array(
array($email, SQLSRV_PARAM_IN),
array($provider, SQLSRV_PARAM_IN)
);
$uid = null;
$sql = "{call [dbo].[getSubUniqueID_HPCreate]( ?, ? )}"
$stmt = sqlsrv_query($conn, $sql, $params);
if ($stmt === false) {
echo print_r(sqlsrv_errors(), true);
return null;
}
if ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) {
$uid = $row['sub_unique_id'];
} else {
$params = array(
array($email, SQLSRV_PARAM_IN),
array($provider, SQLSRV_PARAM_IN),
array($subid SQLSRV_PARAM_IN)
);
$sql = "{call [dbo].[insertSubUniqueID_HPCreate]( ?, ?, ? )}"
$stmt = sqlsrv_query($conn, $sql, $params);
if ($stmt === false) {
echo print_r(sqlsrv_errors(), true);
return null;
}
}
return $uid;
}
?>
我正在努力将我们的数据从使用内联 SQL 迁移到使用存储过程。当我的代码 运行 出现如下错误时,我遇到了麻烦:
Warning: sqlsrv_execute() expects parameter 1 to be resource, bool given in ajax_functions1.live.php on line 285
Warning: sqlsrv_fetch_array() expects parameter 1 to be resource, bool given in ajax_functions1.live.php on line 296
下面是代码的摘录:
function db_add_user($email, $provider, $subuid,$data){
include 'config.php';
$email = $data['preferred_username'];
$params = array(
array(&$myparams['email'], SQLSRV_PARAM_IN),
array(&$myparams['provider'], SQLSRV_PARAM_IN)
);
$sql = "{EXEC [dbo].[getSubUniqueID_HPCreate] @email = ?, @provider = ?}";
$stmt = sqlsrv_prepare($conn, $sql, $params);
sqlsrv_execute($stmt);
$uid=null;
if($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC) > 0) {
$uid = $row[0]['sub_unique_id'];
}else{
$params = array(
array(&$myparams['email'], SQLSRV_PARAM_IN),
array(&$myparams['provider'], SQLSRV_PARAM_IN),
array(&$myparams['subuid'], SQLSRV_PARAM_IN)
);
$sql = "{EXEC [dbo].[insertSubUniqueID_HPCreate] @email = ?, @provider = ?, @subuid = ?}";
$stmt = sqlsrv_prepare($conn, $sql, $params);
sqlsrv_execute($stmt);
}
return $uid;
}
这是SPdbo.getSubUniqueID_HPCreate
USE [homepages_config]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[getSubUniqueID_HPCreate]
@email nvarchar(256),
@provider nvarchar(64)
AS
BEGIN
SET NOCOUNT ON;
SELECT sub_unique_id FROM homepages_config.dbo.users_providers
WHERE email = @email AND provider_id = @provider;
END
这是SPdbo.insertSubUniqueID_HPCreate
USE [homepages_config]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[insertSubUniqueID_HPCreate]
@email nvarchar(256),
@provider nvarchar(256),
@subuid nvarchar(1024)
AS
BEGIN
SET NOCOUNT ON;
INSERT INTO homepages_config.dbo.users_providers ([email], [provider_id], [sub_unique_id])
VALUES (LOWER(@email), @provider, @subuid)
END
如有任何帮助,我们将不胜感激。
首先,存储过程是正确的。一个问题是 @provider
参数(@provider nvarchar(64)
和 @provider nvarchar(256)
)的不同声明,但这可能是输入错误。
所以,我认为您应该对脚本进行一些更改:
- 使用
{call sp_name (?, ...)}
语法执行存储过程。这是 Warning: sqlsrv_execute() expects parameter 1 to be resource, bool given in ajax_functions1.live.php on line ... 错误的可能原因,因为函数sqlsrv_prepare()
未正确执行,您需要检查此执行的结果。注意,你可以使用sqlsrv_query()
,因为这个函数既做语句准备又做语句执行,可以用来执行参数化查询。 - 更改
db_add_user()
函数的参数声明。 - 始终检查错误。
sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)
的结果是一个关联数组,所以$row[0]['sub_unique_id']
是一个错误。
以下脚本(基于您的代码)可能是您问题的解决方案:
<?php
function db_add_user($email, $provider, $subuid){
include 'config.php';
$params = array(
array($email, SQLSRV_PARAM_IN),
array($provider, SQLSRV_PARAM_IN)
);
$uid = null;
$sql = "{call [dbo].[getSubUniqueID_HPCreate]( ?, ? )}"
$stmt = sqlsrv_query($conn, $sql, $params);
if ($stmt === false) {
echo print_r(sqlsrv_errors(), true);
return null;
}
if ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) {
$uid = $row['sub_unique_id'];
} else {
$params = array(
array($email, SQLSRV_PARAM_IN),
array($provider, SQLSRV_PARAM_IN),
array($subid SQLSRV_PARAM_IN)
);
$sql = "{call [dbo].[insertSubUniqueID_HPCreate]( ?, ?, ? )}"
$stmt = sqlsrv_query($conn, $sql, $params);
if ($stmt === false) {
echo print_r(sqlsrv_errors(), true);
return null;
}
}
return $uid;
}
?>