Php require, include et fonction

chabinot 81 Messages postés mardi 10 novembre 2015Date d'inscription 11 décembre 2017 Dernière intervention - 6 déc. 2017 à 17:14 - Dernière réponse : Reivax962 3100 Messages postés jeudi 16 juin 2005Date d'inscription 12 décembre 2017 Dernière intervention
- 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
Afficher la suite 
81Messages postés mardi 10 novembre 2015Date d'inscription 11 décembre 2017 Dernière intervention

6 réponses

Répondre au sujet
le père. 5984 Messages postés mardi 15 mai 2012Date d'inscription 11 décembre 2017 Dernière intervention - 6 déc. 2017 à 20:16
0
Utile
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.
Commenter la réponse de le père.
chabinot 81 Messages postés mardi 10 novembre 2015Date d'inscription 11 décembre 2017 Dernière intervention - 7 déc. 2017 à 05:37
0
Utile
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
Commenter la réponse de chabinot
le père. 5984 Messages postés mardi 15 mai 2012Date d'inscription 11 décembre 2017 Dernière intervention - 7 déc. 2017 à 12:19
0
Utile
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.
Commenter la réponse de le père.
Reivax962 3100 Messages postés jeudi 16 juin 2005Date d'inscription 12 décembre 2017 Dernière intervention - 7 déc. 2017 à 12:57
0
Utile
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://php.net/include

Xavier
Commenter la réponse de Reivax962
chabinot 81 Messages postés mardi 10 novembre 2015Date d'inscription 11 décembre 2017 Dernière intervention - 8 déc. 2017 à 09:42
0
Utile
1
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
Reivax962 3100 Messages postés jeudi 16 juin 2005Date d'inscription 12 décembre 2017 Dernière intervention - 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
Commenter la réponse de chabinot