PHP 7.2 - Включаемый файл не может получить доступ к другому включаемому файлу - PullRequest
0 голосов
/ 09 ноября 2019

У меня проблема с включаемым файлом, который обращается к другому включаемому файлу (мое соединение с БД)

У меня есть сайт со следующим макетом ::

root/conn.php :: db connection file  
root/site/file1.php :: regular page  
root/site/include/func.inc :: file with functions in it

Каждый файл указан в спискениже с соответствующим кодом ...

conn.php ::

<?php

$host = 'localhost';
$db   = 'mydb';
$user = 'myuser';
$pass = 'mypass';
$charset = 'utf8mb4';

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
try {
    $conn = new mysqli($host, $user, $pass, $db);
    $conn->set_charset($charset);
} catch (\mysqli_sql_exception $e) {
     throw new \mysqli_sql_exception($e->getMessage(), $e->getCode());
}
unset($host, $db, $user, $pass, $charset);

?>

file1.php ::

include_once ("{$_SERVER['DOCUMENT_ROOT']}/conn.php");
include_once ("{$_SERVER['DOCUMENT_ROOT']}/site/include/func.inc");
{ code that calls functions in func.php }

func.inc::

include_once ("{$_SERVER['DOCUMENT_ROOT']}/conn.php");
{ various functions }

Когда я перехожу к /file1.php, я получаю следующую ошибку: *

PHP Notice:  Undefined variable: conn in C:\inetpub\root\site\include\func.inc on line 231
PHP Fatal error:  Uncaught Error: Call to a member function prepare() on null in C:\inetpub\root\site\include\func.inc:231

мой файл func.inc не может найти коннФайл .php. Я также попытался удалить функцию включения из func.inc. В папке / include находятся другие файлы, которые могут обращаться к файлу conn.php с помощью той же функции include.

1 Ответ

0 голосов
/ 09 ноября 2019

Проблема связана с тем, что называется variable scope (https://www.php.net/manual/en/language.variables.scope.php) ==>. Прочтите это, чтобы получить подробную информацию

Во втором примере описывается ваша проблема

func. inc

<?php
include_once ("{$_SERVER['DOCUMENT_ROOT']}/conn.php");    
// to illustrate the issue, the include can be simplified to 
// $conn = "something";  // => global scope variable

function myFunc(){
    echo $conn; //no output - $conn exists ONLY in the local scope --> not available inside thisfunction
}

Решение 1:

func.inc

<?php
function myFunc($conn){
    echo $conn; //outputs $conn
}

file1.php

<?php
include_once ("{$_SERVER['DOCUMENT_ROOT']}/conn.php");
include_once ("{$_SERVER['DOCUMENT_ROOT']}/site/include/func.inc");

//call function and pass the $conn, it's available here in the global scope
myFunc($conn); 

Решение 2

но имейте в виду global считается плохой практикой

func.inc

<?php
include_once ("{$_SERVER['DOCUMENT_ROOT']}/conn.php");    

function myFunc(){
    global $conn; //$conn is declared global in the local scope of this function
    echo $conn; //outputs $conn from conn.php if you call myFunc from anywhere
}
...