【问题标题】:sqlsrv_execute Errors With PHP Errors and Stored Procedures带有 PHP 错误和存储过程的 sqlsrv_execute 错误
【发布时间】:2020-03-25 00:52:38
【问题描述】:

我正在努力将我们的数据从使用内联 SQL 迁移到使用存储过程。我在运行我的代码时遇到了一个问题,并得到如下所示的错误:

警告:sqlsrv_execute() 期望参数 1 是资源,bool 在第 285 行的 ajax_functions1.live.php 中给出

警告:sqlsrv_fetch_array() 期望参数 1 是资源,在第 296 行的 ajax_functions1.live.php 中给出布尔值

以下是代码的摘录:

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;

}

这里是 SP dbo.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

这里是 SP dbo.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

任何帮助将不胜感激。

【问题讨论】:

  • 您的$stmt = sqlsrv_prepare($conn, $sql, $params); 显然失败了。可能是因为您没有提供$conn。检查$conn 是否存在,然后使用sqlsrv_errors() 来查看到底发生了什么错误
  • 问题:1)$conn在哪里定义和初始化,2)$email$provider$subuid$data$myparams之间有什么联系?谢谢。
  • $conn 在我包含在函数顶部的 config.php 文件中定义。 $email、$provider、$subuid 和 $data 从代码的前面部分传入。 $myparams 我是从这里的代码中得到的:stackoverflow.com/questions/31575135/… - 如果有其他方法我应该这样做,我很乐意。我只是在跟踪已经存在的东西......盲目地。

标签: php sql-server stored-procedures sqlsrv


【解决方案1】:

首先,存储过程是正确的。一个问题是 @provider 参数的声明不同(@provider nvarchar(64)@provider nvarchar(256)),但这可能是输入错误。

所以,我认为您应该对脚本进行一些更改:

  • 使用{call sp_name (?, ...)} 语法执行存储过程。这是 警告的一个可能原因:sqlsrv_execute() 期望参数 1 是资源,在线 ajax_functions1.live.php 中给出的布尔值 ... 错误,因为函数 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;
}
?>

【讨论】:

  • @MyLifeAsBK 很高兴为您提供帮助。
猜你喜欢
  • 2013-12-10
  • 2017-04-26
  • 1970-01-01
  • 2021-09-13
  • 2012-11-06
  • 2020-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多