Задать вопрос
@Hekys

Как добавить данные в бд с помощью php sqlsrv?

Расширения sqlsrv и pdo_sqlsrv. Версия php 8.1.16. При нажатии на кнопку страница обновляется. Одна кнопка с name="signInButton" в форме. БД подключается, я пробовал запрос на вывод данных на страницу - всё работает. Но вот запрос с добавляет данных в таблицу - нет. UserId имеет IDENTITY(1,1)
Таблица
68027f63e26a2589166758.png

Код PHP
<?php
$serverName = ".\\SQLEXPRESS01";
$connectionOptions = [
    "Database" => "ClothesShop",
    "UID" => "",
    "PWD" => "",
    "TrustServerCertificate" => true,
];

// Устанавливаем подключение
$conn = sqlsrv_connect($serverName, $connectionOptions);

$email = "tes1t";
$password = "test2";
$keepSignIn = "test3";

if (isset($_POST['signInButton'])) {
    createAccount($conn, $email, $password, $keepSignIn);
}

function createAccount($conn, $email, $password, $keepSignIn) {
    // Подготовленный запрос с параметрами
    $query = "INSERT INTO Accounts (UserLogin, UserPassword, KeepSignIn) VALUES (?, ?, ?)";
    $params = array($email, $password, $keepSignIn); // Параметры для вставки

    // Выполняем запрос
    $stmt = sqlsrv_query($conn, $query, $params);

    // Освобождаем ресурсы
    sqlsrv_free_stmt($stmt);
}

// Закрываем соединение
sqlsrv_close($conn);
?>
  • Вопрос задан
  • 172 просмотра
Подписаться 1 Простой Комментировать
Решения вопроса 2
ipatiev
@ipatiev Куратор тега PHP
Потомок старинного рода Ипатьевых-Колотитьевых
Самое главное, чему надо научиться - это правильно формулировать свои проблемы.
Судя по приведённому коду, вы прекрасно знаете, как добавлять данные. Но почему-то всё равно спрашиваете, как это сделать. "Где логика, где разум?"
Судя по тексту вопроса, проблема ваша формулируется совсем по-другому: не "как добавить", а "почему не добавляется". Это два совершенно разных вопроса.

А чтобы ответить на вопрос, почему код не работает, надо заниматься отладкой. Это отдельная дисциплина в программировании, которую надо освоить. Чтобы найти ошибку в своём коде, надо выполнить три вещи

1. Убедиться, что в РНР включён вывод ошибок. Проверить можно тупо допустив ошибку синтаксиса. Если она выведется - очень хорошо, значит вы видите ошибки. Если нет, то включить, хотя бы через ini_set.
1.2. Для древних, как гуано мамонта расширений, таких как sqsrv, надо проверять ошибки запросов вручную. Но делать это надо с умом, а не как в соседнем ответе. Ошибку SQL надо не тупо вываливать на экран вручную, а превратить в ошибку РНР, чтобы она выводилась так же и туда же, куда и остальные ошибки. Это можно сделать простым кодом вида
if( $stmt === false ) {
    throw new Exception(print_r( sqlsrv_errors(), true));
}

2. Упростить свой код. Всегда проверять что-то одно. Вы что хотите проверить? Выполнение запроса на вставку? А зачем вам тогда форма вообще? Сделайте скрипт, который при обращении к нему просто записывает данные в БД, без всяких форм и прочего.
Работает? Очень хорошо, переходите к формам. И если что-то не будет работать, то и вопрос будет совсем другой, "у меня не работает форма", который к "как сделать запрос" уже совсем никакого отношения не имеет.
Не работает? Разбирайтесь с запросом, без всяких форм. Если вы проверяете что-то одно, то у вас и не работает что-то одно. А не десять разных потенциальных точек отказа.
3. Контролировать ход выполнения своего кода.
Например, вот вы разобрались с запросом, и перешли к обработке формы. И вот у вас есть условие, if (isset($_POST['signInButton'])). А вы проверили, оно хоть выполнилось? Если нет, то в базу никогда ничего не добавится, хоть обперегружайся. Поэтому добавляете временный вывод отладочной информации:
echo "проверяем нажатие кнопки\n";
if (isset($_POST['signInButton'])) {
    echo "проверка прошла успешно\n";
    createAccount($conn, $email, $password, $keepSignIn);
}

Если "проверка прошла успешно" не вывелось - значит никакого $_POST['signInButton']) в вашем скрипте нет, и надо разбираться - почему. Например, в форме не указан метод, или кнопка называется совсем по-другому. Чтобы разобраться с этим, надо
3.1 Выводить содержимое используемых переменных. Делаете
var_dump($_POST);
после отправки формы, и смотрите. Если там совсем пусто, значит никакую форму методом POST вы не отправляли. Если там что-то есть - то смотрите, что именно, и насколько это соответствует вашим ожиданиям.

Вот и всё. Эта нехитрая инструкция позволяет быстро решить любые проблемы с кодом. Главное потом не забыть удалить все отладочные сообщения. или научиться пользоваться пошаговой отладкой в IDE
Ответ написан
@alexalexes
Чтобы скрипт перестал быть черным ящиком, полезно иногда пошарить в справке, где в очередном PDO интерфейсе пробивать ошибки операций работы с СУБД:
// Выполняем запрос
    $stmt = sqlsrv_query($conn, $query, $params);
// То, чего никогда в учебниках не напишут - на любой чих в сторону СУБД - чекать ошибки и выводить их куда-нибудь:
if( $stmt === false ) {
    if( ($errors = sqlsrv_errors() ) != null) {
        foreach( $errors as $error ) {
            echo "SQLSTATE: ".$error[ 'SQLSTATE']."<br />";
            echo "code: ".$error[ 'code']."<br />";
            echo "message: ".$error[ 'message']."<br />";
        }
    }
}

    // Освобождаем ресурсы
    sqlsrv_free_stmt($stmt);
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы