PHP include не распознает XML-файл
У меня есть проект php в родительской папке структурирован следующим образом:
- папка-оболочка:
- папка
config
- XML-файл
conexion.xml
- XML-файл
- папка
php
- подпапка
bd
- PHP файл
conexionbd.php
- PHP файл
- PHP файл
consultas.PHP
- подпапка
- HTML-файл
index.html
- папка
Conexion.xml
<?xml version="1.0"?>
<conexion>
<servidor>localhost</servidor>
<usuario>
<usuario_bd>usuario</usuario_bd>
<contrasena_bd>contrasena</contrasena_bd>
</usuario>
<bd>nombre_bd</bd>
</conexion>
Conexionbd.php
<?php
if (file_exists("../../config/conexion.xml")) {
$archivo_xml= simplexml_load_file("../../config/conexion.xml");
/*Se asigna los valores del archivo XML a las variables PHP*/
$servidor=$archivo_xml->servidor;
$usuario_bd=$archivo_xml->usuario->usuario_bd;
$contrasena_bd=$archivo_xml->usuario->contrasena_bd;
$bd=$archivo_xml->bd;
try{
$conn= new mysqli($servidor,$usuario_bd,$contrasena_bd,$bd);
echo "Conectado";
}catch(Exception $e){
echo $e;
}
}else{
echo "el archivo no existe";
}
?>
Если я запускаю приложение до сих пор результат выглядит следующим образом:
Consultas.php
<?php
include("bd/conexionbd.php");
?>
при запуске приложения здесь он показывает мне следующее:
Почему include("bd/conexionbd.php")
не обнаруживает XML-файл и как я могу это исправить?
3 answers
Проблема контекста; по пути в операторе функции file_exists
в файле conexionbd.php
.
Относительный путь, используемый там, действителен при переходе непосредственно к этому файлу, но при переходе к consultas.php
первый выполняется косвенно, то есть при достижении последовательности выполнения в первой строке conexionbd.php
путь, указанный относительно, как вы помещаете в код "../../config/conexion.xml"
, недействителен, потому что в этот момент действительный будет "../config/conexion.xml"
.
Решение состояло бы в том, чтобы поместить этот последний путь, но у него есть недостаток, что вы не можете запустить его напрямую (что вам не нужно в вашем приложении в любом случае), и что он может включать и работать правильно только из файла, который находится в позиции в вашей структуре папок, так что указанный путь действителен.
Решение, которое я бы дал вам без чрезмерного изменения схемы, которую вы реализовали, чтобы использовать глобальную переменную, которая должна быть указана для каждого файла, объявляющего путь, который ему подходит.
Conexionbd.php
<?php
if (file_exists("$PROJECTROOT/config/conexion.xml")) {
$archivo_xml= simplexml_load_file("$PROJECTROOT/config/conexion.xml");
/*Se asigna los valores del archivo XML a las variables PHP*/
$servidor=$archivo_xml->servidor;
$usuario_bd=$archivo_xml->usuario->usuario_bd;
$contrasena_bd=$archivo_xml->usuario->contrasena_bd;
$bd=$archivo_xml->bd;
try{
$conn= new mysqli($servidor,$usuario_bd,$contrasena_bd,$bd);
echo "Conectado";
}catch(Exception $e){
echo $e;
}
}else{
echo "el archivo no existe";
}
?>
Consultas.php
<?php
$PROJECTROOT = "../";
include("bd/conexionbd.php");
?>
окончательное решение выглядит следующим образом (используя все ответы):
Conexionbd.php
<?php
if (file_exists("../config/conexion.xml")) {
$archivo_xml= simplexml_load_file("../config/conexion.xml");
/*Se asigna los valores del archivo XML a las variables PHP*/
$servidor=$archivo_xml->servidor;
$usuario_bd=$archivo_xml->usuario->usuario_bd;
$contrasena_bd=$archivo_xml->usuario->contrasena_bd;
$bd=$archivo_xml->bd;
try{
$conn= new mysqli($servidor,$usuario_bd,$contrasena_bd,$bd);
echo "Conectado";
}catch(Exception $e){
echo $e;
}
}else{
echo "el archivo no existe";
}
?>
Возможно, вам будет интересно использовать vlucas / phpdotenv для сохранения данных подключения среди других, используемых вашим приложением. чтобы сохранить и использовать их безопасно.