PHP include не распознает XML-файл


У меня есть проект php в родительской папке структурирован следующим образом:

  • папка-оболочка:
    • папка config
      • XML-файл conexion.xml
    • папка php
      • подпапка bd
        • PHP файл conexionbd.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";
}

?>

Если я запускаю приложение до сих пор результат выглядит следующим образом: Imagen 1

Consultas.php

<?php
include("bd/conexionbd.php");
?>

при запуске приложения здесь он показывает мне следующее: Imagen 2

Почему include("bd/conexionbd.php") не обнаруживает XML-файл и как я могу это исправить?

Author: Ferny Cortez, 2017-11-06

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");
?>
 1
Author: nilsandrey, 2017-11-06 20:28:59

окончательное решение выглядит следующим образом (используя все ответы):

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";
}

?>
 0
Author: Ferny Cortez, 2017-11-06 22:17:23

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

 0
Author: Eduardo Rengifo, 2017-11-07 12:06:03