Как правильно использовать PHP require

У меня есть 3 файла: index.php, db.php (база данных) и functions.php

вот пример того, что находится в каждом файле:

database.php:

define ("DB_HOST", "localhost");
define ("DB_USER", "root");
define ("DB_PASS", "1234");
define ("DB_NAME", "test");

try {
    $dsn = "mysql:dbname=".DB_NAME.";host=".DB_HOST;
    $dbh = new PDO($dsn, DB_USER, DB_PASS);
} catch (PDOException $e) {
    echo 'Connection failed: ' . $e->getMessage();
}

index.php:

require $_SERVER['DOCUMENT_ROOT']."/config/db.php";
require $_SERVER['DOCUMENT_ROOT']."/config/functions.php";

if(isLoggedIn()) {
    echo "hi";
}

functions.php:

function isLoggedIn() {
    require $_SERVER['DOCUMENT_ROOT']."/config/db.php";

    $stmt = $dbh->prepare("SELECT * FROM users....");
    $stmt->execute();
}

Я получаю следующую ошибку:

Примечание: константа DB_HOST уже определена в /var/www/config/database.php

что я пробовал:

Я попытался заменить require на require_once во всех своих файлах, но выдает ошибку:

Неустранимая ошибка: неперехваченная ошибка: вызов функции-члена prepare () с нулевым значением в functions.php


person John Jaoill    schedule 14.06.2017    source источник
comment
поменяй все свои require на require_once   -  person LF00    schedule 14.06.2017
comment
Возможный дубликат Различия между require, include и require_once?   -  person LF00    schedule 14.06.2017
comment
Еще лучше, удалите require из functions.php и передайте $dbh вашей isLoggedIn функции в качестве аргумента.   -  person Phil    schedule 14.06.2017
comment
Кроме того, ваше приложение продолжит работу, если PDO не сможет подключиться к вашей БД. Я предлагаю поставить exit в ваш catch блок или полностью удалить try...catch   -  person Phil    schedule 14.06.2017
comment
@KrisRoofe извини, пожалуйста, посмотри на мою правку   -  person John Jaoill    schedule 14.06.2017
comment
@phil да, решения кажутся хакерскими, хотя ... также, я положу выход, спасибо   -  person John Jaoill    schedule 14.06.2017
comment
@JohnJaoill В каком смысле внедрение зависимостей хакерское?   -  person Phil    schedule 14.06.2017
comment
Как говорит @Phil, инъекция - это стандартный метод передачи ресурсов, я думаю, что то, что у вас есть, в порядке (если оно было переработано), но оно ближе к хакерскому, чем инъекция.   -  person Rasclatt    schedule 14.06.2017
comment
Я вижу, что проблема здесь не в требовании. Проблема в этой строке: require $_SERVER['DOCUMENT_ROOT']."/config/db.php"; Должно быть: require $_SERVER['DOCUMENT_ROOT']."/config/database.php"; У вас есть файл с именем database.php, пока вы пытаетесь импортировать db.php. Просто исправьте это, и все будет в порядке.   -  person pasignature    schedule 07.05.2019


Ответы (1)


Итак, поскольку для вас это не имело смысла, мой последний ответ - это полный ответ о том, что вы можете сделать, чтобы избавиться от этой проблемы раз и навсегда:

db.php

<?php
$host="localhost"; 
$user="root"; 
$password="1234"; 
$db="test"; 

    try {
        $dbh = new PDO("mysql:host=$host;dbname=$db",$user,$password);
    } catch (PDOException $e) {
        die("DB ERROR: ". $e->getMessage());
    }
?>

index.php

require_once $_SERVER['DOCUMENT_ROOT']."/config/db.php";

if(isLoggedIn($dbh)) {
    echo "hi";
}

functions.php

function isLoggedIn($dbh) {
$stmt = $dbh->prepare("SELECT * FROM users....");
$stmt->execute(); 
}
function anotherfunction($dbh) {
$stmt = $dbh->prepare("SELECT * FROM others....");
$stmt->execute(); 
}

Вышеупомянутые исправления избавят вас от боли, связанной с выполнением требований, вам потребуется db.php один раз, чтобы теперь у вас был доступ к его переменной и передавался в качестве аргумента всякий раз, когда это необходимо.

Примечание. Спасибо Филу за полезные комментарии и подробное описание.

person Oussama Ben Ghorbel    schedule 14.06.2017
comment
Пожалуйста, объясните голосование "против" в ознакомительных целях. - person Oussama Ben Ghorbel; 14.06.2017
comment
Если вы просто удалите require, вы столкнетесь с проблемой области видимости с переменной $dbh. - person Phil; 14.06.2017
comment
Я сказал, что удалите его из индекса, а не functions.php. - person Oussama Ben Ghorbel; 14.06.2017
comment
извините, что сначала была опечатка. кроме того, если я удалю require из index.php, что, если у меня будет две функции в моем functions.php файле? будут два requires, которые будут конфликтовать - person John Jaoill; 14.06.2017
comment
@OussamaBenGhorbel моя ошибка - person Phil; 14.06.2017
comment
@Phil, без проблем, спасибо за разъяснения, очень признателен. - person Oussama Ben Ghorbel; 14.06.2017
comment
пожалуйста, посмотрите мой комментарий выше, это все еще не решает проблему - person John Jaoill; 14.06.2017
comment
Две функции? Как это может вызвать проблемы с требованием? Вы можете просто потребовать $ _SERVER ['DOCUMENT_ROOT'] ./ config / db.php; вверху functions.php - person Oussama Ben Ghorbel; 14.06.2017
comment
Подождите, я вам напишу полное решение - person Oussama Ben Ghorbel; 14.06.2017
comment
да, я пытался потребовать вверху functions.php вне всех функций, и там написано Fatal error: Uncaught Error: Call to a member function prepare() on null in functions.php - person John Jaoill; 14.06.2017
comment
Я написал вам полное решение вашей проблемы, надеюсь, это поможет. - person Oussama Ben Ghorbel; 14.06.2017
comment
я получаю ту же ошибку: Fatal error: Uncaught Error: Call to a member function prepare() on null in functions.php - person John Jaoill; 14.06.2017
comment
Ваш dbh равен нулю, у вас проблема при создании объекта PDO. Вы уверены в коде db.php? - person Oussama Ben Ghorbel; 14.06.2017
comment
Давайте продолжим это обсуждение в чате. - person John Jaoill; 14.06.2017