#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 .