PHP система входа в систему работает на локальном компьютере, но не работает на Hostgator PHP 7.2 - PullRequest
0 голосов
/ 01 мая 2020

PHP система входа в систему работает на локальном компьютере, но не работает на Hostgator PHP 7.1. Мой локальный PHP 7.2

Я создал полностью работающий портал на моей локальной машине. Я могу CRUD на моей локальной машине. Как только я размещаю его на сервере в сети, система входа не работает. Я по-прежнему могу регистрировать новых пользователей, поскольку информация о пользователях заполняется в БД, так что это не проблема конфигурации БД. Я получаю эти ошибки:

Предупреждение: mysqli_stmt_bind_param (): Количество переменных не соответствует количеству параметров в подготовленном операторе в .....

Неустранимая ошибка: Uncaught Ошибка: вызов неопределенной функции mysqli_stmt_get_result () в ....

Я потратил 5 часов, пытаясь выяснить, почему она не будет работать на сервере Hostgator, но будет работать на моем локальном компьютере.

Вот мой код:

if(isset($_POST['loginSubmit'])){

    //include connection configs
    require '../../db_configs.php';

    $email = mysqli_real_escape_string($conn, $_POST['email']);
    $password = mysqli_real_escape_string($conn, $_POST['password']);   

    if(empty($email || $password )){

        header("Location: ../../../portalSignIn.php?signin=fieldsempty");
        exit();

    }
    else
    {
        //user email query
        $sqlEmail = "SELECT * FROM users WHERE email='$email'";
        $emailResult = mysqli_query($conn, $sqlEmail);
        $stmt = mysqli_stmt_init($conn);

        //SQL Error
        if(!mysqli_stmt_prepare($stmt, $sqlEmail)){

            header("Location: ../../../portalSignIn.php?signin=SQL_FAILED");
            exit();

        }
        if(mysqli_num_rows($emailResult) == 0){

            //email doesn't exist
            header("Location: ../../../portalSignIn.php?signin=incorrectemail");
            exit();
        }
        else
        {   
            //bind data if email exists
            mysqli_stmt_bind_param($stmt, "s", $email);
            mysqli_stmt_execute($stmt);
            $result = mysqli_stmt_get_result($stmt);

            if($row = mysqli_fetch_assoc($result)){....

В этот момент он ломается -> mysqli_stmt_bind_param($stmt, "s", $email);

Я изучил https://www.plus2net.com/php_tutorial/mysqli_mysqlnd.php и Hostagtor не имеет этих настроек. И я успешно использовал mysqli_stmt_bind_param() на странице регистрации.

Ответы [ 2 ]

1 голос
/ 01 мая 2020

В вашем коде много ошибок. Позвольте мне объяснить вам некоторые из них.

  1. Не избегайте ваших переменных, используя mysqli_real_escape_string(). Только не используйте эту функцию вообще.
  2. empty($email || $password ) собирается проверить логическое значение. Это не имеет особого смысла. Удалите вызов empty и проверьте отрицание. Если ни $email, ни $password, то один из них пуст.
  3. Не используйте mysqli_query. Вы собираетесь подготовить заявление, поэтому не вызывайте эту функцию. Также вам необходимо параметризовать SQL. Используйте ? в качестве заполнителя для значения.
  4. mysqli_num_rows в этом месте выдаст ошибку. Вам не нужна эта функция вообще. Если вы хотите использовать его, вам нужно будет передать в качестве параметра вывод get_result()
  5. . Для извлечения значений с использованием подготовленного оператора вам необходимо подготовить / bind / execute / get_result. Только тогда вы можете получить строку, если она существует. Если ничего не возвращается, то $record будет нулевым.
if (isset($_POST['loginSubmit'])) {

    //include connection configs
    require '../../db_configs.php';

    $email = $_POST['email'];
    $password = $_POST['password'];

    if (!$email || !$password) {
        header("Location: ../../../portalSignIn.php?signin=fieldsempty");
        exit();
    } else {
        //user email query
        $sqlEmail = "SELECT * FROM users WHERE email=?";
        $stmt = $con->prepare($sqlEmail);
        $stmt->bind_param('s', $email);
        $stmt->execute();
        $result = $stmt->get_result();
        $record = $result->fetch_assoc();
        if (!$record) {
            //email doesn't exist
            header("Location: ../../../portalSignIn.php?signin=incorrectemail");
            exit();
        } else {
            // handle your data here
        }
    }
}

И, как всегда, не забудьте включить mysqli, сообщая об ошибках. См. Как получить сообщение об ошибке в MySQLi?

0 голосов
/ 03 мая 2020

Проблема, с которой я столкнулся, заключается в том, что Hostgator не имеет mysqlnd, доступного для пользователей общего хостинга, а только для пользователей с VPS или выделенными серверами:

https://www.hostgator.com/help/article/compatible-technologies

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

https://www.plus2net.com/php_tutorial/mysqli_mysqlnd.php

Это был учебный урок, особенно при знакомстве с вашим веб-хостом ,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...