Использование неопределенного корневого пути

#php

#php

Вопрос:

Я следую руководству, в котором я получаю неопределенную константу ROOT_PATH. У меня есть страница регистрации, которая содержит файл с именем path.php который содержит константу ROOT_PATH, ниже у меня есть еще один include, который связывает файл с именем users следующим образом.

 <?php



include(ROOT_PATH . "/app/database/db.php");
include(ROOT_PATH . "/app/helpers/validateUser.php");

$errors = array();
$username = '';
$email = '';
$password = '';
$passwordConf = '';


if(isset($_POST['register-btn'])){
    $errors = validateUser($_POST);
  

    if(count($errors) ===0){
        

        unset($_POST['register-btn'], $_POST['passwordConf']);
        $_POST['admin'] = 0;
    
        $_POST['password'] = password_hash($_POST['password'], PASSWORD_DEFAULT);
    
        $user_id = create('users', $_POST);
        $user = selectOne('users', ['id' => $user_id]);
    
        

        $_SESSION['id'] = $user['id'];
        $_SESSION['username'] = $user['username'];
        $_SESSION['admin'] = $user['admin'];
        $_SESSION['message'] = 'you are now logged in';
        $_SESSION['type'] = 'success';

        if($_SESSION['admin']){
            header('location: ' . BASE_URL . '/admin/dashboard.php');

        } else {
            header('location: ' . BASE_URL . '/index.php');
        }

        header('location: ' . BASE_URL . '/index.php');
        exit();

    } else{
        $username = $_POST ['username'];
        $email = $_POST ['email'];
        $password = $_POST ['password'];
        $passwordConf = $_POST ['password'];
    }

if(isset($_POST['login-btn'])){
    $errors = validateLogin($_POST);

    if(count($errors) === 0){
        $user = selectOne('users', ['username' => $_POST['username']]);

        if ($user amp;amp; password_verify($_POST['password'], $user['password'])){

            $_SESSION['id'] = $user['id'];
            $_SESSION['username'] = $user['username'];
            $_SESSION['admin'] = $user['admin'];
            $_SESSION['message'] = 'you are now logged in';
            $_SESSION['type'] = 'success';
    
            if($_SESSION['admin']){
                header('location: ' . BASE_URL . '/admin/dashboard.php');
    
            } else {
                header('location: ' . BASE_URL . '/index.php');
            }
    
            header('location: ' . BASE_URL . '/index.php');
        }
            exit();
        } else{
            array_push($errors, 'wrong credentials');
        }
     }
   }
 

теперь, согласно ему, мне не нужно связывать path.php в пользователях, потому что на странице регистрации там я ссылался path.php переходит к users.php но я все равно получаю это сообщение:
Предупреждение: использование неопределенной константы ROOT_PATH — предполагается ‘ROOT_PATH’ (это вызовет ошибку в будущей версии PHP) в C:xampphtdocsphpblogtutappcontrolersusers.php в строке 5

это register.php :

    <?php include("path.php"); ?>
<?php include(ROOT_PATH . "/app/controlers/users.php"); ?>
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <!-- Font Awesome -->
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css" />
  <!-- Custom CSS -->
  <link rel="stylesheet" href="assets/css/style.css">
  <title>Register</title>
</head>
<body>
  <!-- header -->
  <?php include(ROOT_PATH . '/app/includes/header.php');?>
  <!-- // header -->
  <div class="auth-content">
    <form action="register.php" method="post">
      <h3 class="form-title">Register</h3>
    <?php include(ROOT_PATH . "/app/helpers/formErrors.php");?>
      
      <div>
        <label>Username</label>
        <input type="text" name="username" value="<?php echo $username; ?>" class="text-input">
      </div>
      <div>
        <label>Email</label>
        <input type="email" name="email" value="<?php echo $email; ?>" class="text-input">
      </div>
      <div>
        <label>Password</label>
        <input type="password" name="password" value="<?php echo $password; ?>" class="text-input">
      </div>
      <div>
        <label>Confirm Password</label>
        <input type="password" name="passwordConf" value="<?php echo $passwordConf; ?>" class="text-input">
      </div>
      <div>
        <button type="submit" name="register-btn" class="btn">Register</button>
      </div>
      <p class="auth-nav">Or <a href="<?php echo BASE_URL . '/login.php' ?> ">Sign In</a></p>
    </form>
  </div>
  <!-- JQuery -->
  <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
  <script src="assets/js/script.js"></script>
</body>
</html>
 

это path.php :

 <?php
    define('ROOT_PATH',realpath(dirname('_FILE_'))); 
    define("BASE_URL", 'http://localhost/phpblogtut');
 

Комментарии:

1. Что здесь происходит? users.php Всегда включается, как и в первом фрагменте, или вы вызываете файл каким-либо другим способом (что предполагает сообщение об ошибке)? Нам нужно видеть больше контекста, например, куда поступает запрос, какой путь он проходит через ваше приложение, чтобы достичь users.php .

2. Вы также неправильно определяете путь. Это должно быть либо: realpath(dirname(__FILE__)) (без кавычек и двойных подчеркиваний), либо более чистая версия: realpath(__DIR__) .

3. Я бы предпочел установить все константы, необходимые приложению, как можно скорее, например, в файле начальной загрузки, который всегда вызывается в начале каждого запроса (например, если вы используете шаблон front controller, я бы поместил его в индексный файл, который всегда вызывается.)

4. Я обновил, чтобы вы могли видеть весь код

5. отладка: var_dump(defined('ROOT_PATH'), __FILE__.__LINE__); добавьте это после ‘define’ в файле register и перед использованием константы в файле user. Это покажет вам, что происходит.

Ответ №1:

Я думаю, вам не хватает включения path.php в users.php

ваш users.php файл должен быть

 <?php include_once("path.php"); ?> // **include path.php in users.php**
<?php include(ROOT_PATH . "/app/database/db.php");
    include(ROOT_PATH . "/app/helpers/validateUser.php"); ?>
 

и register.php файл должен быть

 <?php include_once("path.php"); ?> // remove this line if this files includes users.php
    <?php include(ROOT_PATH . "/app/controlers/users.php"); ?>
 

Комментарии:

1. Если они удаляют path.php из register.php , у него не будет ROOT_PATH нужных данных в строке ниже, и они получат ту же ошибку, но в другом файле.

2. на самом деле я имею в виду, если users.php файл, уже включенный в register.php затем они могут игнорировать, чтобы включить path.php в этом.

3. Поскольку register.php включает в себя users.php используя константу ROOT_PATH, затем register.php необходимо включить path.php прежде чем он включит в себя users.php , или константа еще не будет определена. Вы не можете использовать константу для загрузки файла, который определяет эту константу.

4. По словам парня, за которым я слежу. Мне это не нужно, и он тоже этого не делает. youtube.com /… 07:25

Ответ №2:

Если вы хотите использовать константу, вы должны включить файл, содержащий константу, если она не была объявлена в том же файле PHP. Итак, вам нужно включить path.php .

 <?php 
    include('path.php');
    include(ROOT_PATH . "/app/database/db.php");
    include(ROOT_PATH . "/app/helpers/validateUser.php");
 

Не могли бы вы связать учебник?

Комментарии:

1. ‘define’ создает имя в глобальном пространстве имен. Они доступны везде после их определения. Есть пара полезных функций: ‘defined’ и ‘get_defined_constants’ .

2. youtube.com /… 07:25

3. @RyanVincent Если веб-сервер был перезапущен, не будет ли эта глобальная переменная также потеряна? Кроме того, после перезагрузки, если бы я должен был напрямую перейти к user.php без посещения register.php глобальный ROOT_PATH был бы неопределенным в пространстве имен, не так ли?

4. Все переменные / константы php теряются при завершении PHP-скрипта. Вот как работает PHP.

5. Ну, тогда вам нужно включить path.php .