Вставка этого длинного SQL-запроса в PHP

У меня есть этот SQL-запрос, который отлично работает на моем сервере, но я создаю веб-сайт, который делает что-то для меня проще, и мне нужна помощь в его развертывании на PHP.

Проверьте код PHP и попробуйте дать мне рабочую версию, так как я не знаком с PHP и он не работает.

<?php
// Set up variables for the query values
$login = "test.me";
$password = "P@ssw0rd";
$salt = "6B29FC40-CA47-1067-B31D-00DD010662DA";
$group = "Dispatcher";

// Create a new SQL Server connection
$serverName = "192.168.200.110";
$connectionInfo = array( 
    "Database"=>"test1",
    "UID"=>"test",
    "PWD"=>"ptest",
    "TrustServerCertificate"=>true
    );
$conn = sqlsrv_connect($serverName, $connectionInfo);

// Prepare the query statement
$query = "BEGIN
            SET NOCOUNT ON
            DECLARE @NewValue INT;
            DECLARE @salt UNIQUEIDENTIFIER=NEWID()
            BEGIN TRY

                INSERT INTO Users (Username, Password, Salt,Active, [group])
                VALUES(@pLogin, HASHBYTES('SHA2_512', @pPassword+CAST(@salt AS NVARCHAR(36))), @salt, 1, @group)
                SET @NewValue = SCOPE_IDENTITY()
                
                INSERT INTO Employees select @FirstName, ISNULL(@LastName, ''), '' , '', '', IIF(LOWER(@group) = 'dispatcher' or LOWER(@group) = 'teamleader', 1, null), @NewValue, 'dbo', GETDATE(),'', 0 ,null,null
            
            END TRY
            BEGIN CATCH
            select 0
            END CATCH
            END";

$params = array($login, $password, $salt, $salt, $group);
$stmt = sqlsrv_query($conn, $query, $params);
sqlsrv_close($conn);
?>

Это мой код из SQL Server:

USE [me]
GO
/** Object:  StoredProcedure [dbo].[Sp_CreateEmployeeAndUser]**/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER procedure [dbo].[Sp_CreateEmployeeAndUser] (
    @pLogin NVARCHAR(50), 
    @pPassword NVARCHAR(50),
    @Group NVARCHAR(50),
    @FirstName nvarchar(50),
    @LastName nvarchar(50))
AS
BEGIN
    SET NOCOUNT ON
    DECLARE @NewValue INT;
    DECLARE @salt UNIQUEIDENTIFIER=NEWID()
    BEGIN TRY

        INSERT INTO Users (Username, Password, Salt,Active, [group])
        VALUES(@pLogin, HASHBYTES('SHA2_512', @pPassword+CAST(@salt AS NVARCHAR(36))), @salt, 1, @group)
        SET @NewValue = SCOPE_IDENTITY()
        
    insert into Employees select @FirstName, ISNULL(@LastName, ''), '' , '', '', IIF(LOWER(@group) = 'dispatcher' or LOWER(@group) = 'teamleader', 1, null), @NewValue, 'dbo', GETDATE(), '', 0 ,null,null
     
    END TRY
    BEGIN CATCH
    select 0
    END CATCH
END

Я попытался сделать небольшой запрос, но наверняка многое упускаю. Мне нужна помощь в этом, так как я впервые делаю этот большой запрос в PHP.

$query = "INSERT INTO Users (Username, Password, Salt, Active, [group])
          VALUES (?, HASHBYTES('SHA2_512', ? + CAST(? AS NVARCHAR(36))), ?, 1, ?);
          SET @NewValue = SCOPE_IDENTITY();";

ВОЗМОЖНОЕ РЕШЕНИЕ:

<?php

$login = "test.test";
$password = "P@ssw0rd";
$salt = "example_salt";
$group = "Dispatcher";

// Connect to the SQL Server database
$serverName = "192.168.200.110";
$connectionInfo = array( 
    "Database"=>"test1",
    "UID"=>"test",
    "PWD"=>"test",
    "TrustServerCertificate"=>true
    );
$conn = sqlsrv_connect($serverName, $connectionInfo);

// Call the stored procedure
$procedureName = "{call [dbo].[Sp_CreateEmployeeAndUser] (?, ?, ?, ?, ?)}"; // replace with the name of your stored procedure and the appropriate number of placeholders
$params = array($login, $password, $group, 'pj', 'pj'); // replace with the values for your parameters
$stmt = sqlsrv_prepare($conn, $procedureName, $params);
if (!$stmt) {
    die(print_r(sqlsrv_errors(), true));
}
if (!sqlsrv_execute($stmt)) {
    die(print_r(sqlsrv_errors(), true));
}

// Process the results
while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) {
    echo $row['group'] . "\n"; // replace with the name of the column(s) you want to retrieve
}

// Close the connection
sqlsrv_free_stmt($stmt);
sqlsrv_close($conn);
?>

Мое последнее редактирование кода:

$procedureName = "{EXEC [dbo].[Sp_CreateEmployeeAndUser] (?, ?, ?, ?, ?)}"; 
$procedure_params = array(
    array($login, SQLSRV_PARAM_IN),
    array($password, SQLSRV_PARAM_IN),
    array($group, SQLSRV_PARAM_IN),
    array('pj', SQLSRV_PARAM_IN),
    array('pj', SQLSRV_PARAM_IN)
    );
with the values for your parameters
$stmt = sqlsrv_prepare($conn, $procedureName, $procedure_params);

Ошибка:

Warning: sqlsrv_prepare() expects parameter 1 to be resource, bool given in C:\xampp\htdocs\portal\proccall.php on line 28
Array ( [0] => Array ( [0] => IMSSP [SQLSTATE] => IMSSP [1] => -14 [code] => -14 [2] => An invalid parameter was passed to sqlsrv_prepare. [message] => An invalid parameter was passed to sqlsrv_prepare. ) )

Угадай, что? MySQL — это совершенно другой продукт по сравнению с SQL Server — сделайте себе одолжение и исправьте свои теги, чтобы на ваш пост посмотрели нужные эксперты.

Dale K 22.02.2023 21:27

В чем именно вопрос/проблема? Непонятно, что вы хотите, чтобы мы вам сказали.

ADyson 22.02.2023 21:33

@ADyson Я помогаю выяснить, можно ли это сделать? я никогда не пробовал этот длинный запрос, и мне интересно

Jean Pierre Waked 22.02.2023 21:35

Под «маленьким запросом» вы подразумеваете набор результатов или оператор выбора? Это не работает? Вы говорите, что вам интересно, но вы действительно пробовали это?

mykaf 22.02.2023 21:36

Небольшой запрос @mykaf, подобный этому (я отредактировал свой пост), но мне не хватает этих строк: SET NOCOUNT ON DECLARE @ NewValue INT; ОБЪЯВИТЬ @соль UNIQUEIDENTIFIER=NEWID()

Jean Pierre Waked 22.02.2023 21:38

Сначала попробуйте и посмотрите, что получится, это лучше, чем гадать. Но если это не сработает (например, потому что sqlrv_query, возможно, позволяет выполнять только отдельные операторы), то я бы посоветовал поместить этот код в хранимую процедуру в базе данных и позволить PHP вызвать хранимую процедуру.

ADyson 22.02.2023 21:40

@ADyson ADyson, можете ли вы показать мне, как вызвать хранимую процедуру с PHP на SQL Server?

Jean Pierre Waked 22.02.2023 21:41

Вы читали документацию?

mykaf 22.02.2023 21:45

С помощью команды EXEC, как обычно. Но да, пожалуйста проведите небольшое исследование прежде чем обращаться за помощью, обычно вы можете найти то, что вам нужно, не требуя времени других людей.

ADyson 22.02.2023 21:46

Что мешает вам добавить недостающие строки? SET NOCOUNT ON DECLARE @ NewValue INT; DECLARE @ salt UNIQUEIDENTIFIER=NEWID()?

mykaf 22.02.2023 21:47

Пожалуйста, проверьте мою отредактированную версию, большое спасибо! я не знал, что мы можем называть их так! Благодаря @ADyson Можете ли вы проверить мое последнее редактирование?

Jean Pierre Waked 22.02.2023 21:49

Хорошо, что происходит, когда вы тестируете это? Я ожидаю, что это должен быть EXEC, а не CALL, согласно ссылкам, которые я предоставил.

ADyson 22.02.2023 21:59

Я связался с документацией по php. Конечно, MySQL будет отличаться от SQL Server. Вы спросили, как вызвать хранимую процедуру с помощью PHP. Вот как вы вызываете хранимую процедуру в PHP. Вставьте правильный синтаксис для используемой базы данных.

mykaf 22.02.2023 21:59

@mykaf Я этого не спрашивал, это был ОП. И да, MySQL будет отличаться от SQL Server. Вы ссылаетесь на документацию PHP, в которой конкретно рассказывается, как вызывать процедуры MySQL с помощью библиотеки mysqli. Это совершенно бесполезно для работы с SQL Server из PHP. Для этого требуется совершенно другая библиотека кода PHP (sqlsrv) с существенно другими командами и синтаксисом. И синтаксис хранимой процедуры MySQL существенно отличается от SQL Server. Для этого нет общей «документации php», в каждом случае она очень разная. Извините, но ваш комментарий явно неверен.

ADyson 22.02.2023 22:03

@ADyson, я понимаю, что ты говоришь. Мои извинения.

mykaf 22.02.2023 22:05

@mykaf без проблем, каждый день - учебный день :-)

ADyson 22.02.2023 22:12

@ADyson, пожалуйста, проверьте мое последнее редактирование кода, когда я изменил вызов на EXEC, и я получил ошибку, возможно, это поможет вам найти мне решение.

Jean Pierre Waked 22.02.2023 22:20

В сообщении указано, что $conn является false, а не объектом соединения. Это означает, что ваша попытка подключения не удалась. Добавьте обработку ошибок после команды sqlsrv_connect, чтобы узнать, почему

ADyson 22.02.2023 22:23

@ADyson, как отдать тебе должное? Мой код работает!!!

Jean Pierre Waked 22.02.2023 22:30

Что было не так с подключением?

ADyson 22.02.2023 22:31

Я случайно отредактировал свой код, чтобы скопировать его сюда, поэтому, когда я проверял вашу вещь, я не работал, пока не исправил учетные данные для подключения к серверу xD !!!

Jean Pierre Waked 22.02.2023 22:32
Конечные и Readonly классы в PHP
Конечные и Readonly классы в PHP
В прошлом, когда вы не хотели, чтобы другие классы расширяли определенный класс, вы могли пометить его как final.
Запуск PHP на IIS без использования программы установки веб-платформы
Запуск PHP на IIS без использования программы установки веб-платформы
Установщик веб-платформы, предлагаемый компанией Microsoft, перестанет работать 31 декабря 2022 года. Его закрытие привело к тому, что мы не можем...
Запись файлов cookie в файл с помощью XSS R
Запись файлов cookie в файл с помощью XSS R
Привет всем :), здесь я продемонстрирую получение cookies, которые будут сохранены в виде txt файла, используя дефект XSS Reflected.
Каковы некоторые из продвинутых концепций языков программирования?
Каковы некоторые из продвинутых концепций языков программирования?
В языках программирования существует множество продвинутых концепций, но некоторые из них являются наиболее важными:
PHPStorm vs Visual Studio Code: Выбор лучшей IDE для ваших потребностей в веб-разработке
PHPStorm vs Visual Studio Code: Выбор лучшей IDE для ваших потребностей в веб-разработке
PHPStorm и Visual Studio Code - две популярные интегрированные среды разработки (IDE), используемые веб-разработчиками. Оба инструмента предлагают...
Повышение качества Laravel с помощью принципов SOLID: Лучшие практики и примеры
Повышение качества Laravel с помощью принципов SOLID: Лучшие практики и примеры
Когда мы говорим о том, как сделать следующий шаг в качестве разработчика, мы должны понимать, что качество кода всегда является основным фокусом на...
1
22
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я бы посоветовал поместить этот код в хранимую процедуру в базе данных и позволить PHP вызвать хранимую процедуру. Например:

$procedureName = "{EXEC [dbo].[Sp_CreateEmployeeAndUser] (?, ?, ?, ?, ?)}"; 
$procedure_params = array(
    array($login, SQLSRV_PARAM_IN),
    array($password, SQLSRV_PARAM_IN),
    array($group, SQLSRV_PARAM_IN),
    array('pj', SQLSRV_PARAM_IN),
    array('pj', SQLSRV_PARAM_IN)
    );
$stmt = sqlsrv_prepare($conn, $procedureName, $procedure_params);
sqlsrv_execute($stmt);

Другие вопросы по теме