Проблема с подготовленными заявлениями для страницы входа - PullRequest
0 голосов
/ 08 февраля 2020

Я пытаюсь создать страницу входа для моего сайта. Я скопировал и вставил это с другого сайта, который я создал, где логин работает просто отлично. Я использовал оператор echo, чтобы проверить его, но все, что я получаю, когда пытаюсь войти в систему, - это отсеченная версия страницы входа. Он обрезается прямо в том месте, где этот код вставляется в код HTML. Я смотрел на это так много раз, что мои глаза косоглазие, поэтому я не уверен, что мне не хватает! Любая помощь очень ценится!

<?php
                    if($_SERVER['REQUEST_METHOD'] != 'POST') {
                        echo '<form method="post" action="">
                        <p><label for="username">Username:</label><input type="text" name="username" id="username" title="username"></p>
                        <p><label for="password">Password:</label><input type="password" name="password" id="password" title="password"></p>
                        <p><input type="submit" name="login" id="login" value="Login"></p></form>';
                    } else {
                        $username = $_POST['username'];
                        $password = $_POST['password'];

                        $mysqli = new mysqli("","","","");
                        if($mysqli->connect_error) {
                            exit('Error connecting to database');
                        } else {
                            $sql2 = "SELECT admin_id, admin_username, admin_password FROM adminlogin WHERE admin_username = ?";
                            if(($stmt = $mysqli->prepare($sql2)) === false) {
                                error_log($mysqli->error);
                                error_log("SQL = [$sql2]");
                                die("Database error, contact site admin");
                            } else {
                                $stmt->bind_param("s", $username);
                                $stmt->execute();
                                $stmt->store_result();
                                if($stmt->store_result() === false) {
                                    error_log($stmt->error);
                                    die("Database error, contact site admin.");
                                } else {
                                    echo 'No error';
                                }// test store
                            } // bind param
                        } // sql statement
                    } // test connection
                    ?>
                </div>
                <div class="col-1-3">
                    <h2>Search Blog</h2><br>
                    <form method="post" action="search.php" name="search" id="search">
                        <p><input type="text" name="searchinput" id="searchinput" title="search"></p>
                        <p><input type="submit" name="search" id="search" value="Search"></p>
                    </form>
                    <br>
                    <h2>About</h2>
                    <p>Hello and welcome to Cooking for Alaska: THM and Healthy Eating on a Budget! It is my prayer that you will find this blog useful in helping your family eat healthy while living on an Alaska-based budget. Groceries in Alaska are expensive, but feeding your family shouldn't be! Please enjoy my blog and feel free to contact me with any questions.</p>
                    <br>
                    <h2>Recent Blog Posts</h2>
                    <?php
                    include('includes/dblogin.php');
                    $sql = "SELECT * FROM recentposts_short ORDER BY post_datetime DESC LIMIT 3";
                    $result = mysqli_query($con, $sql);
                    if($result == false) {
                        $mysql_error = mysqli_error($con);
                        echo '<p>There was an error. Please contact an administrator.</p>';
                    } else {
                        while($row=mysqli_fetch_assoc($result)) {
                            echo '<p><bold><a href="blog.php?id='.$row['post_title'].'">'.$row['post_title'].'</a></bold></p>';
                            echo '<p class="smallfont">'.$row['post_datetime'].'</p><br>';
                        }
                    }
                    ?><br>

1 Ответ

0 голосов
/ 10 февраля 2020

Я проверил ваш код, и он работает. В этом нет ничего плохого.

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

Я проверил ваш код как есть, а затем немного реорганизовал его Я подумал, что покажу вам, как написать:

Это показывает использование error_log(), которое выводит в файл ошибок http. Хорошая привычка - выводить сообщение о технической ошибке в месте, где его можно прочитать, но при этом выводить более удобную для пользователя ошибку в выводе браузера. Вы не хотите путать своих пользователей.

$mysqli = new mysqli("localhost","USER","PASSWORD","DB");
if ($mysqli->connect_error) { 
    error_log($mysqli->connect_error);
    die('Error connecting to database, contact site administrator');
}   

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

$sql = "
  SELECT admin_id, admin_username, admin_password 
  FROM admin 
  WHERE admin_username = ?";
if (($stmt = $mysqli->prepare($sql)) === false) {
  error_log($mysqli->error);
  error_log("SQL = [$sql]");
  die("Database error, contact site administrator");
}   

Каждая функция mysqli возвращает false если есть проблема на любом этапе. Вы должны проверить это.

if ($stmt->bind_param("s", $username) === false) {
  error_log($stmt->error);
  die("Database error, contact site administrator");
} 
if ($stmt->execute() === false) {
  error_log($stmt->error);
  die("Database error, contact site administrator");
} 
if ($stmt->store_result() === false) {
  error_log($stmt->error);
  die("Database error, contact site administrator");
}

Если строк нет, это означает, что имя пользователя не соответствует ничему. Вы хотите узнать об этом в журнале ошибок, но не раскрывать его пользователю. Они должны знать только, что имя пользователя или пароль были неправильными, а не то, что было неправильным.

if ($stmt->num_rows == 0) {
  error_log("Username '$username' not found");
  die("Incorrect username or password");
} 
if ($stmt->bind_result($id, $user, $pass) === false) {
  error_log($stmt->error);
  die("Database error, contact site administrator");
} 

Должна быть только одна строка, соответствующая имени пользователя. Поэтому, если у него нет подходящего пароля, не стесняйтесь d ie ().

while ($stmt->fetch()) {
   if (password_verify($password, $pass) === false) {
       error_log("Username '$username' found, but password is wrong");
       die("Incorrect username or password");
   }
} 
$stmt->close();

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

echo "<p>Welcome! You are logged in, $username</p>";
...