У меня есть этот 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. ) )
В чем именно вопрос/проблема? Непонятно, что вы хотите, чтобы мы вам сказали.
@ADyson Я помогаю выяснить, можно ли это сделать? я никогда не пробовал этот длинный запрос, и мне интересно
Под «маленьким запросом» вы подразумеваете набор результатов или оператор выбора? Это не работает? Вы говорите, что вам интересно, но вы действительно пробовали это?
Небольшой запрос @mykaf, подобный этому (я отредактировал свой пост), но мне не хватает этих строк: SET NOCOUNT ON DECLARE @ NewValue INT; ОБЪЯВИТЬ @соль UNIQUEIDENTIFIER=NEWID()
Сначала попробуйте и посмотрите, что получится, это лучше, чем гадать. Но если это не сработает (например, потому что sqlrv_query, возможно, позволяет выполнять только отдельные операторы), то я бы посоветовал поместить этот код в хранимую процедуру в базе данных и позволить PHP вызвать хранимую процедуру.
@ADyson ADyson, можете ли вы показать мне, как вызвать хранимую процедуру с PHP на SQL Server?
Вы читали документацию?
С помощью команды EXEC, как обычно. Но да, пожалуйста проведите небольшое исследование прежде чем обращаться за помощью, обычно вы можете найти то, что вам нужно, не требуя времени других людей.
Что мешает вам добавить недостающие строки? SET NOCOUNT ON DECLARE @ NewValue INT; DECLARE @ salt UNIQUEIDENTIFIER=NEWID()?
Пожалуйста, проверьте мою отредактированную версию, большое спасибо! я не знал, что мы можем называть их так! Благодаря @ADyson Можете ли вы проверить мое последнее редактирование?
Хорошо, что происходит, когда вы тестируете это? Я ожидаю, что это должен быть EXEC, а не CALL, согласно ссылкам, которые я предоставил.
Я связался с документацией по php. Конечно, MySQL будет отличаться от SQL Server. Вы спросили, как вызвать хранимую процедуру с помощью PHP. Вот как вы вызываете хранимую процедуру в PHP. Вставьте правильный синтаксис для используемой базы данных.
@mykaf Я этого не спрашивал, это был ОП. И да, MySQL будет отличаться от SQL Server. Вы ссылаетесь на документацию PHP, в которой конкретно рассказывается, как вызывать процедуры MySQL с помощью библиотеки mysqli. Это совершенно бесполезно для работы с SQL Server из PHP. Для этого требуется совершенно другая библиотека кода PHP (sqlsrv) с существенно другими командами и синтаксисом. И синтаксис хранимой процедуры MySQL существенно отличается от SQL Server. Для этого нет общей «документации php», в каждом случае она очень разная. Извините, но ваш комментарий явно неверен.
@ADyson, я понимаю, что ты говоришь. Мои извинения.
@mykaf без проблем, каждый день - учебный день :-)
@ADyson, пожалуйста, проверьте мое последнее редактирование кода, когда я изменил вызов на EXEC, и я получил ошибку, возможно, это поможет вам найти мне решение.
В сообщении указано, что $conn является false, а не объектом соединения. Это означает, что ваша попытка подключения не удалась. Добавьте обработку ошибок после команды sqlsrv_connect, чтобы узнать, почему
@ADyson, как отдать тебе должное? Мой код работает!!!
Что было не так с подключением?
Я случайно отредактировал свой код, чтобы скопировать его сюда, поэтому, когда я проверял вашу вещь, я не работал, пока не исправил учетные данные для подключения к серверу xD !!!
Я бы посоветовал поместить этот код в хранимую процедуру в базе данных и позволить 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);
Угадай, что? MySQL — это совершенно другой продукт по сравнению с SQL Server — сделайте себе одолжение и исправьте свои теги, чтобы на ваш пост посмотрели нужные эксперты.