Php require, include et fonction

Fermé
chabinot Messages postés 321 Date d'inscription mardi 10 novembre 2015 Statut Membre Dernière intervention 22 mars 2024 - 6 déc. 2017 à 17:14
Reivax962 Messages postés 3671 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 - 8 déc. 2017 à 10:56
Bonjour,
J'ai créé des fonctions comme suit:
1 - Source fonctions.php
<?php

function get_constant() {
  require __DIR__ . '/includes/constants.php';
}

function get_functions()
{
  require __DIR__ . '/includes/functions.php';
}

function get_index()
{
  require __DIR__ . '/views/index.view.php';
}

function get_register()
{
  include __DIR__ . '/views/register.view.php';
}

function get_header()
{
  include __DIR__ . '/partials/header.php';
}

function get_menu()
{
  include __DIR__ . '/partials/menu.php';
}

function get_footer()
{
  include __DIR__ . '/partials/footer.php';
}

function get_error()
{
  include __DIR__ . '/partials/errors.php';
}

2 - Source register.php
<?php
// Autoloading
require __DIR__ . '/vendor/autoload.php';

// Accès à la base de données
$bdd = new Database();

// Chargement divers fichiers
get_constant();
get_functions();

// Traitement du formulaire soumis
if (isset($_POST['register'])) {
  // Tous les champs ont été remplis ?
  if (not_empty(['name', 'pseudo', 'email', 'password', 'password_confirm'])) {
    $errors = [];
    extract($_POST);
    if (mb_strlen($name) < 3) {
      $errors[] = 'Nom trop court (minimum 3 caractères)';
    }
    if (mb_strlen($pseudo) < 3) {
      $errors[] = 'Pseudonyme trop court (minimum 3 caractères)';
    }
    if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
      $errors[] = 'Adresse courriel invalide';
    }
    if (mb_strlen($password) < 6) {
      $errors[] = 'Mot de passe trop court (minimum 6 caractères)';
    } else {
      if ($password != $password_confirm) {
        $errors[] = 'Les deux mots de passe ne concordent pas';
      }
    }
    if ($bdd->is_already_in_use('pseudo', $pseudo, 'users')) {
      $errors = 'Pseudonyme déjà utilisé';
    }
    if ($bdd->is_already_in_use('email', $email, 'users')) {
      $errors = 'Adresse courriel déjà utilisée';
    }
    if (count($errors) == 0) {
          // Envoi d'un courriel d'activation
      $to = $email;
      $subject = WEBSITE_NAME . " - ACTIVATION DE COMPTE";
      $token = sha1($pseudo . $email . $password);
      ob_start();
      require __DIR__ . '/templates/emails/activation.tmpl.php';
      $content = ob_get_clean();
      $headers = 'MIME-Version: 1.0' . "\r\n";
      $headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";
      mail($to, $subject, $content, $headers);
          // Informer l'utilisateur de vérifier sa boîte de réception
      echo 'Un couurriel d\'activation de votre compte vous a été envoyé';
          // Redirection vers sa page de profil
    }
  } else {
    $errors[] = 'Veuillez remplir tous les champs.';
  }
}

// Titre
$title = 'Inscription';

// Page register.view.php
get_register();


Quand j'appelle le source views/register.view.php par la fonction get_register(),
il ne marche pas très bien, source register.view.php:
<?php get_header(); ?>

<div id="main-content">
        <div class="container-fluid">
            <h1>Devenez dès à présent membre</h1>
            <?php include 'partials/_errors.php'; ?>
            
            <form method="post" class="well col-md-6">
                <!-- Name field -->
                <div class="form-group">
                    <label class="control-label" for="name">Nom <span>*</span></label>
                    <input type="text" class="form-control" id="name" name="name" placeholder="Votre nom">
                </div>
                <!-- Pseudo field -->
                <div class="form-group">
                    <label class="control-label" for="pseudo">Pseudo <span>*</span></label>
                    <input type="text" class="form-control" id="pseudo" name="pseudo" placeholder="Votre pseudo">
                </div>
                <!-- Email field -->
                <div class="form-group">
                    <label class="control-label" for="email">Adresse Courriel <span>*</span></label>
                    <input type="email" class="form-control" id="email" name="email" placeholder="email@domaine.com">
                </div>
                <!-- Password field -->
                <div class="form-group">
                    <label class="control-label" for="password">Mot de passe <span>*</span></label>
                    <input type="password" class="form-control" id="password" name="password" placeholder="Votre mot de passe">
                </div>
                <!-- Password confirmation field -->
                <div class="form-group">
                    <label class="control-label" for="password_confirm">Confirmer votre mot de passe <span>*</span></label>
                    <input type="password" class="form-control" id="password_confirm" name="password_confirm">
                </div>
                <!-- Bouton enregistrer -->
                <input type="submit" class="btn btn-primary" name="register" value="Inscription">
            </form>
        </div><!-- /.container -->
    </div>
        
<?php get_footer(); ?>

surtout à la ligne <?php include 'partials/_errors.php'; ?>
Si je remplace get_register() par include __DIR__ . '/views/register.view.php;
Cela marche, il me renvoie bien les erreurs que j'attends.
Merci de m'expliquer ce mystère !!
Cordialement
A voir également:

5 réponses

Utilisateur anonyme
6 déc. 2017 à 20:16
Bonjour

fonction.php et register.php sont-ils dans le même répertoire ?
Si ce n'est pas le cas, la valeur de __DIR__ est différente dans les deux fichiers, et c'est donc normal que get_register() (qui utilise le __DIR__ de fonction.php), ne donne pas le même résultat que l'utilisation directe de __DIR__ dans register.php.
0
chabinot Messages postés 321 Date d'inscription mardi 10 novembre 2015 Statut Membre Dernière intervention 22 mars 2024 15
7 déc. 2017 à 05:37
Bonjour,
Oui, j'espère, je te mets en photo l'arborescence du projet:

et le fichier fonction.php (image)

et la suite :

Si tu remarques quelque chose !!
Merci encore de ton aide
Cordialement
0
Utilisateur anonyme
7 déc. 2017 à 12:19
C'est bien le get_register() appelé à la fin de register.php qui te pose un problème ?
Y a-t-il un message d'erreur ? Lequel ?
Il y a bien quelque part un include ou un require de fonctions.php dans ton register.php ? On ne le voit pas et s'il n'y est pas, c'est normal que get_register ne soit pas défini.
0
Reivax962 Messages postés 3671 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011
7 déc. 2017 à 12:57
Bonjour,

Attention avec l'utilisation des include et require au sein de fonctions.
Les variables qui peuvent y être définies ne seront disponibles que dans la fonction qui réalise l'include !
Regarde bien les exemples dans la doc : https://www.php.net/manual/en/function.include.php

Xavier
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
chabinot Messages postés 321 Date d'inscription mardi 10 novembre 2015 Statut Membre Dernière intervention 22 mars 2024 15
8 déc. 2017 à 09:42
Bonjour à tous,
J'ai abandonné de mettre include et require dans des fonctions.
Je les mets dorénavant au niveau des sources.
Donc ce problème est résolu. Une autre petite question, j'ai un fichier functions.php comme suit :
<?php
if (!function_exists('not_empty')) {
  function not_empty($fields = []) : bool
  {
    if (count($fields) != 0) {
      foreach ($fields as $key => $field) {
        if (empty($_POST[$field]) || trim($_POST[$field]) == '') {
          return false;
        }
      }
      return true;
    }
  }
}


if (!function_exists('set_flash')) {
  function set_flash($message, $type = 'info')
  {
    $_SESSION['notification']['message'] = $message;
    $_SESSION['notification']['type'] = $type;
  }
}

if (!function_exists('redirect')) {
  function redirect($page)
  {
    header('Location: ' . $page);
    exit();
  }
}

J'aimerais le remplacer par une classe Functions.
Auriez-vous une idée ?
Cordialement
0
Reivax962 Messages postés 3671 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011
Modifié le 8 déc. 2017 à 10:56
Bonjour,

Le mieux à mon avis est d'utiliser une classe avec des fonctions statiques.
<?php
class Functions
{
 public static function not_empty($fields = []) : bool
 {
  if (count($fields) != 0) {
   foreach ($fields as $key => $field) {
    if (empty($_POST[$field]) || trim($_POST[$field]) == '') {
     return false;
    }
   }
   return true;
  }
 }
}
?>

Et ensuite, tu l'appelles comme ça : Functions::not_empty()

Xavier
0