Menu

Php require, include et fonction

chabinot 183 Messages postés mardi 10 novembre 2015Date d'inscription 18 juillet 2018 Dernière intervention - 6 déc. 2017 à 17:14 - Dernière réponse : Reivax962 3246 Messages postés jeudi 16 juin 2005Date d'inscription 2 juillet 2018 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 

Votre réponse

6 réponses

le père. 6092 Messages postés mardi 15 mai 2012Date d'inscription 18 juillet 2018 Dernière intervention - 6 déc. 2017 à 20:16
0
Merci
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 183 Messages postés mardi 10 novembre 2015Date d'inscription 18 juillet 2018 Dernière intervention - 7 déc. 2017 à 05:37
0
Merci
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. 6092 Messages postés mardi 15 mai 2012Date d'inscription 18 juillet 2018 Dernière intervention - 7 déc. 2017 à 12:19
0
Merci
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 3246 Messages postés jeudi 16 juin 2005Date d'inscription 2 juillet 2018 Dernière intervention - 7 déc. 2017 à 12:57
0
Merci
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 183 Messages postés mardi 10 novembre 2015Date d'inscription 18 juillet 2018 Dernière intervention - 8 déc. 2017 à 09:42
0
Merci
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 3246 Messages postés jeudi 16 juin 2005Date d'inscription 2 juillet 2018 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