Ошибки sqlsrv_execute с ошибками PHP и хранимыми процедурами - PullRequest
1 голос
/ 25 марта 2020

Я работаю над переносом наших данных с использованием встроенного SQL на использование хранимых процедур. Я сталкиваюсь с ошибкой при запуске моего кода и получаю ошибки, показанные ниже:

Предупреждение: sqlsrv_execute () ожидает, что параметр 1 будет ресурсом, bool указан в ajax_functions1.live. php в строке 285

Предупреждение: sqlsrv_fetch_array () ожидает, что параметр 1 будет ресурсом, bool указан в ajax_functions1.live. php в строке 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;

}

Вот 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

Любая помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 26 марта 2020

Во-первых, хранимые процедуры верны. Одной из проблем является другое объявление для параметра @provider (@provider nvarchar(64) и @provider nvarchar(256)), но, вероятно, это ошибка ввода.

Итак, я думаю, что вы должны внести некоторые изменения в свой скрипт:

  • Выполнение хранимых процедур с синтаксисом {call sp_name (?, ...)}. Это возможная причина для предупреждения : sqlsrv_execute () ожидает, что параметр 1 будет ресурсом, bool указан в ajax_functions1.live. php on line ... error, потому что функция 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;
}
?>
...