Quantcast
Channel: Grafikart | Derniers Sujets du forum
Viewing all 4861 articles
Browse latest View live

Avis Class Wordpress

$
0
0

Bonjour,

Je me présente, Théo, je suis un jeune développeur dans une entreprise qui travaille sur Wordpress, et au fur et a mesure du temps, je me suis rendu compte que je faisais très souvent la même chose sur la pluspart des sites, j'avais envie d'arrêter de regarder ce que j'avais fait sur les autres sites pour le refaire. Donc je me suis dit que j'allais me crée des classes. Je ne suis pas ultra fort en POO, je me débrouille, mais j'ai besoin de savoir si les classes sont bien faites, bien construites, j'y ai passé pas mal de temps pour essayer de bien les réfléchir, mais j'aurais besoin d'un avis extérieur pour savoir si je suis dans la bonne voie.

Voici les problématiques rencontrées :

  • Les articles :

Sur les pages category.php et single.php, souvent, j'avais besoin d'afficher beaucoup d'articles et les catégories correspondantes. Cependant, ça me gonflait de mettre toute la logique dans category.php ou single.php et de répéter du code ou de faire une fonction pour afficher les catégories.
Et aussi, sur tous les sites ça me saoulait de faire des (while have_posts) tout ça pour afficher des articles je voulais faire quelque chose de plus simple (pour moi ça l'est en tout cas). Voici les classes en question :

Posts.php

<?php

namespace App\Posts;

use App\Pagination;
use App\Posts\Post;

class Posts {

    /**
     * Numbers of posts you want to display
     *
     * @var int
     */
    private $numbers = -1;

    /**
     * Number of characters in excerpt
     *
     * @var int
     */
    private $excerptCharacterNumber = 120;

    /**
     * The string after the excerpt
     *
     * @var string
     */
    private $excerptOverflow = '...';

    /**
     * Excludes some Posts
     *
     * @var array
     */
    private $excludes = [];

    /**
     * Posts need to be paginate ?
     *
     * @var bool
     */
    private $pagination = false;

    /**
     * Date format
     *
     * @var string
     */
    private $dateFormat = 'd F Y';

    /**
     * Category ID
     *
     * @var int
     */
    private $categoryID;

    /**
     * Query of the page
     *
     * @var \WP_Query
     */
    private $wpQuery;

    /**
     * Template use to display posts
     * (Refer to setTemplate())
     *
     * @var string
     */
    private $template;

    /**
     * Set up category ID
     * Get the term ID if this is a category page
     * else, from the parameter
     *
     * @param string $categoryID
     *
     * @throws \Exception
     */
    public function __construct($categoryID = '') {
        global $wp_query;
        $this->wpQuery = $wp_query;

        if (empty($categoryID) && !$this->categoryPage()) throw new \Exception('You need to set a category ID.');

        if ($categoryID && !$this->categoryPage()) $this->categoryID = $categoryID;
        if ($this->categoryPage()) $this->categoryID = $this->getQueriedTermID();
    }

    /**
     * Get the queried term ID
     *
     * @return mixed
     */
    public function getQueriedTermID() {
        return $this->wpQuery->get_queried_object()->term_id;
    }

    /**
     * Is this a category page ?
     *
     * @return bool
     */
    private function categoryPage() {
        return ($this->wpQuery->get_queried_object()->taxonomy === "category") ? true : false;
    }

    /**
     * Get top category
     *
     * @return mixed
     */
    private function getTopCategoryID() {
        $category = get_category($this->categoryID);

        if ($category->parent) {
            $ancestors = get_ancestors($this->categoryID, 'category');
            return $ancestors[count($ancestors) - 1];
        } else {
            return $category->term_id;
        }
    }

    /**
     * Get an array with all the categories
     *
     * @return \WP_Term[]
     */
    private function getCategories() {
        $topCategoryID = $this->getTopCategoryID();
        $categories = get_categories(['child_of' => $topCategoryID]);

        array_unshift($categories, get_category($topCategoryID));

        return $categories;
    }

    /**
     * Get all the posts
     *
     * If it's category page, get the posts from this category ID
     *
     * @return int[]|\WP_Post[]|\WP_Query
     */
    private function getAll() {
        if ($this->pagination) {
            $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;

            return new \WP_Query([
                'post_type'      => 'post',
                'post__not_in' => $this->excludes,
                'posts_per_page' => $this->numbers,
                'paged'          => $paged,
                'tax_query'      => [
                    [
                        'taxonomy' => 'category',
                        'field'    => 'term_id',
                        'terms'    => $this->categoryID
                    ]
                ]
            ]);
        } else {
            return new \WP_Query([
                'posts_per_page' => $this->numbers,
                'post__not_in' => $this->excludes,
                'cat' => $this->categoryID
            ]);
        }
    }

    /**
     * List all categories, return an array with
     * ID of the category, if the category is active or not, it name
     *
     * @return array
     */
    public function categories() {
        $categories = [];

        foreach ($this->getCategories() as $category) {
            $categories[$category->term_id]['top_category'] = ($this->getTopCategoryID() === $category->term_id) ? 1 : 0;
            $categories[$category->term_id]['active'] = ($this->getQueriedTermID() === $category->term_id) ? 1 : 0;
            $categories[$category->term_id]['name'] = $category->name;
        }

        return $categories;
    }

    /**
     * Exclude one or multiple IDs from display
     *
     * @param $excludesIDs
     *
     * @return $this
     */
    public function exclude($excludesIDs) {
        if (!is_array($excludesIDs)) $excludes[] = $excludesIDs;

        $this->excludes = $excludes;

        return $this;
    }

    /**
     * Set the numbers of posts you want to display
     *
     * @param $numbers
     *
     * @return $this
     * @throws \Exception
     */
    public function setNumbers($numbers) {
        if (!is_int($numbers)) throw new \Exception('Numbers have to be an integer.');

        $this->numbers = $numbers;
        return $this;
    }

    /**
     * Set the number of character you want in excerpt
     *
     * @param $excerptCharacterNumber
     *
     * @return $this
     * @throws \Exception
     */
    public function setExcerptCharacterNumber($excerptCharacterNumber) {
        if (empty($excerptCharacterNumber)) throw new \Exception('Excerpt number parameter can\'t be null.');
        if (!is_int($excerptCharacterNumber)) throw new \Exception('Excerpt number have to be an integer.');

        $this->excerptCharacterNumber = $excerptCharacterNumber;
        return $this;
    }

    /**
     * Set the string after the excerpt
     *
     * @param $excerptOverflow
     *
     * @return $this
     * @throws \Exception
     */
    public function setExcerptOverflow($excerptOverflow) {
        if (empty($excerptOverflow)) throw new \Exception('Excerpt Overflow parameter can\'t be null.');
        if (!is_string($excerptOverflow)) throw new \Exception('Excerpt Overflow parameter have to be a string.');

        $this->excerptOverflow = $excerptOverflow;
        return $this;
    }

    /**
     * Paginate posts
     *
     * @return $this
     */
    public function paginate() {
        $this->pagination = true;
        return $this;
    }

    /**
     * Set up the date format
     *
     * @param $dateFormat
     *
     * @return $this
     * @throws \Exception
     */
    public function setDateFormat($dateFormat) {
        if (empty($dateFormat)) throw new \Exception('Date format parameter can\'t be null.');
        if (!is_string($dateFormat)) throw new \Exception('Date format parameter need to be a string.');

        $this->dateFormat = $dateFormat;
        return $this;
    }

    /**
     * Set the template for a post with some variables
     *
     * {%TITLE%} for the title of the post
     * {%LINK%} for the link of the post
     * {%DATE%} for the date of the post
     * {%TOP_CATEGORY%} for the top category of the post
     * {%EXCERPT%} for the excerpt
     * {%THUMBNAIL%} for the thumbnail
     * {%THUMBNAIL_URL%} for the thumbnail URL
     *
     * @param string $template
     *
     * @return $this
     *
     * @throws \Exception
     */
    public function setTemplate($template) {
        if (empty($template)) throw new \Exception('Template parameter can\'t be null.');

        $this->template = $template;
        return $this;
    }

    /**
     * Get pagination
     *
     * @return Pagination
     * @throws \Exception
     */
    public function getPagination() {
        if (!$this->pagination) throw new \Exception('You need to activate the pagination with the "paginate" method to get a pagination.');

        return new Pagination($this->wpQuery);
    }

    /**
     * Get HTML of all posts, you can also wrap everything
     *
     * @param string $startWrap
     * @param string $endWrap
     *
     * @return string
     * @throws \Exception
     */
    public function all($startWrap = '', $endWrap = '') {
        $html = '';
        $allPosts = $this->getAll();

        if (!empty($startWrap)) $html .= $startWrap;
        while ($allPosts->have_posts()) {
            $allPosts->the_post();
            $post = new Post(get_the_ID(), $this->excerptCharacterNumber, $this->excerptOverflow, $this->dateFormat, $this->template);
            $html .= $post->display();
        }
        if (!empty($endWrap)) $html .= $endWrap;

        return $html;
    }

}

Post.php

<?php

namespace App\Posts;

class Post {

    /**
     * ID of the post
     *
     * @var int
     */
    private $postID;

    /**
     * Number of characters in excerpt
     *
     * @var int
     */
    private $excerptCharacterNumber;

    /**
     * The string after the excerpt
     *
     * @var string
     */
    private $excerptOverflow;

    /**
     * Date format
     *
     * @var string
     */
    private $dateFormat;

    /**
     * Template use to display posts
     * (Refer to setTemplate()) of Posts class
     *
     * @var string
     */
    private $template;

    /**
     * Create a post
     *
     * @param $postID
     * @param $excerptCharacterNumber
     * @param $excerptOverflow
     * @param $dateFormat
     * @param $template
     */
    public function __construct($postID, $excerptCharacterNumber, $excerptOverflow, $dateFormat, $template) {
        $this->postID = $postID;
        $this->excerptCharacterNumber = $excerptCharacterNumber;
        $this->excerptOverflow = $excerptOverflow;
        $this->dateFormat = $dateFormat;
        $this->template = $template;
    }

    /**
     * Get the title with the tag we need
     *
     * @return string
     */
    private function getTitle() {
        return get_the_title($this->postID);
    }

    /**
     * Get the link
     *
     * @return false|string
     */
    private function getLink() {
        return get_the_permalink($this->postID);
    }

    /**
     * Get the date
     *
     * @return false|string
     */
    private function getDate() {
        return get_the_date($this->dateFormat, $this->postID);
    }

    /**
     * Get top category name
     *
     * @return string
     */
    private function getTopCategory() {
        return get_the_category($this->postID)[0]->name;
    }

    /**
     * Get excerpt
     *
     * @return string
     */
    private function getExcerpt() {
        if (!has_excerpt()) {
            return substr(strip_tags(strip_shortcodes(preg_replace('#\[[^\]]+\]#', '', get_the_content($this->postID)))), 0, $this->excerptCharacterNumber) . $this->excerptOverflow;
        }
        return substr(strip_tags(strip_shortcodes(get_the_excerpt($this->postID))), 0, $this->excerptCharacterNumber) . $this->excerptOverflow;
    }

    /**
     * Get the thumbnail
     *
     * @return string
     */
    private function getThumbnail() {
        return get_the_post_thumbnail($this->postID);
    }

    /**
     * Get the thumbnail URL
     *
     * @return false|string
     */
    private function getThumbnailUrl() {
        return get_the_post_thumbnail_url($this->postID);
    }

    /**
     * Replace variables in the template
     *
     * @return mixed|string
     * @throws \Exception
     */
    private function replaceVariables() {
        $pattern = '/^.*{%(.*)%}.*$/m';
        preg_match_all($pattern, $this->template, $matches);
        array_shift($matches);

        foreach ($matches[0] as $match) {
            $method = 'get';
            $strings = explode('_', $match);

            foreach ($strings as $string) {
                $string = ucfirst(strtolower($string));
                $method .= $string;
            }

            if (!method_exists(Post::class, $method)) throw new \Exception("The method $method doesn't exist in the Post class. Create this method to use {%$match%} variable in your template.");

            $this->template = str_replace("{%$match%}", $this->$method(), $this->template);
        }

        return $this->template;
    }

    /**
     * Display the post
     *
     * @return mixed|string
     * @throws \Exception
     */
    public function display() {
        return $this->replaceVariables();
    }

}

Il y a aussi une class Pagination (que j'appelle dans Posts), la voici :

Pagination.php

<?php

namespace App;

/**
 * Get Pagination
 *
 * Class Pagination
 * @package App
 */
class Pagination {

    /**
     * @var \WP_Query
     */
    private $query;

    /**
     * Total pages
     *
     * @var float
     */
    private $totalPages;

    /**
     * Current page
     *
     * @var int
     */
    private $currentPage;

    /**
     * Create a pagination
     *
     * @param $query
     */
    public function __construct($query) {
        $this->query = $query;
        $this->init();
    }

    /**
     * Init total pages & current pages variables
     */
    private function init() {
        $this->totalPages = $this->query->max_num_pages;
        $this->currentPage = max(1, ( get_query_var( 'paged' ) ) ? absint( get_query_var( 'paged' ) ) : 1);
    }

    /**
     * Pagination exist ?
     *
     * @return bool
     */
    public function exist() {
        if ($this->totalPages > 1) return true;

        return false;
    }

    /**
     * Get pages numbers with links, and if it's the current one
     *
     * @return array
     */
    public function getPages() {
        if (!$this->exist()) return [];

        $pagination = [];

        // Get all pages numbers and links
        for ($i = 1 ; $i <= $this->totalPages ; $i++) {
            $pagination[$i]['link'] = get_pagenum_link($i);
            $pagination[$i]['current'] = ($this->currentPage == $i) ? 1 : 0;
        }

        return $pagination;
    }

    /**
     * Get previous link
     *
     * @return array|string
     */
    public function getPrevLink() {
        if (!$this->exist()) return [];

        foreach ($this->getPages() as $pageNumber => $page) {
            if ($page['current'] && $pageNumber > 1) return get_pagenum_link($pageNumber - 1);
        }
        return '';
    }

    /**
     * Get next link
     *
     * @return array|string
     */
    public function getNextLink() {
        if (!$this->exist()) return [];

        foreach ($this->getPages() as $pageNumber => $page) {
            if ($page['current'] && $pageNumber != $this->totalPages) return get_pagenum_link($pageNumber + 1);
        }
        return '';
    }

}

J'ai fait la classe Pagination, car avant j'utilisais paginate_links, et ça me saoulait de devoir avoir une pagination uniforme sur toutes les pages et aller dans la fonction pour la faire, je voulais la faire sur chaque page différemment si j'en avais envie.

Voici un cas d'usage de Posts par exemple :

$posts = new \App\Posts\Posts(4);

        $posts
            ->setNumbers(4)
            ->setExcerptCharacterNumber(211)
            ->setExcerptOverflow('.')
            ->setTemplate('
                <article class="actuality">
                    <a href="{%LINK%}">
                        <div class="actuality__thumbnail">
                            {%THUMBNAIL%}
                        </div>
                        <div class="actuality__content">
                            <h2 class="actuality__content__title">{%TITLE%}</h2>
                            <div class="actuality__content__meta">
                                <p class="actuality__content__meta__date">{%DATE%}</p>
                                <p class="actuality__content__meta__divider">.</p>
                                <p class="actuality__content__meta__tagorcategory">{%TOP_CATEGORY%}</p>
                            </div>
                            <p class="actuality__content__excerpt">{%EXCERPT%}</p>
                        </div>
                    </a>
                </article>
            ');

        return $posts->all('<div class="news">', '</div>');

Merci!

Je ne sais pas si ce genre de chose se fais souvent, je ne sais pas si quelqu'un se donnera la peine de lire ce que j'ai fais, mais ce serais top! Histoire que je sache si je vais dans la bonne direction ou pas ? Ou peut-être que ce que j'ai fais c'est d'avoir perdu du temps ? J'ai l'impression d'en gagner, mais peut-être pas ? Est-ce que c'est plus simple ? Facilement évoluable, maintenable ?

Cordialement,
Théo


Tp_refactoring cours la POO en PHP/ problème au niveau de l'autoloader

$
0
0

Bonjour,

Voila je rencontre un petit problème avec mon code. j'ai essayé de trouvé le souci en vain.. j'ai dû raté quelque chose alors svp si quelqu'un voit ce que j'ai raté qu'il me fasse signe . merci

Ce que je fais

Décrivez ici votre code ou ce que vous cherchez à faire
Table.php

<?php


use Core\Config;
use Core\Database\MysqlDatabase;

class App
{

    public $title = "Mon super site";
    private static $_instance;
    private $db_instance;

    public static function getInstance(){
        if(is_null(self::$_instance)){
            self::$_instance = new App();
        }
        return self::$_instance;
    }

    public static function load(){
        session_start();
        require ROOT .'/App/Autoloader.php';
        App\Autoloader::register();
        require ROOT . '/Core/Autoloader.php';
        Core\Autoloader::register();
    }

    public function getTable($name){
        $class_name = '\\App\\Table\\' . ucfirst($name) . 'Table';
        return new $class_name($this->getDb());
    }

    public function getDb(){
        $config = Config::getInstance(ROOT . '/config/config.php');
        if(is_null($this->db_instance)){
            $this->db_instance = new MysqlDatabase($config->get('db_name'),$config->get('db_user'),$config->get('db_pass'),$config->get('db_host'));
        }
        return $this->db_instance;
    }


}

Autoloader.php
~~

<?php

namespace Core;

Class Autoloader{

/**
 * Enregistre notre autoloader
 */
static function register() {
    spl_autoload_register(array(__CLASS__,'autoload'));
}

/**
 * Inclure le fichier correspondant à notre classex  /
 * require 'autoloader.php'; Autoloader::register(); --> permet de lancer notre autoloader simplement.
 * @param $class string le nom de la classe à charger
 */

static function autoload($class){
    if(strpos($class,__NAMESPACE__. '\\') == 0){
        $class = str_replace(__NAMESPACE__ . '\\','',$class);
        $class = str_replace('\\','/', $class);
        require __DIR__ . '/' . $class. '.php';

    }

}

}

Ce que je veux

Décrivez ici ce que vous cherchez à obtenir

Ce que j'obtiens

Warning: require(C:\xampp\htdocs\BLOG\App/core/Table.php): failed to open stream: No such file or directory in C:\xampp\htdocs\BLOG\App\Autoloader.php on line 25

Fatal error: require(): Failed opening required 'C:\xampp\htdocs\BLOG\App/core/Table.php' (include_path='C:\xampp\php\PEAR') in C:\xampp\htdocs\BLOG\App\Autoloader.php on line 25

Problème site TUTO MVC mise en ligne OVH

$
0
0

Bonjour,

J'ai créé un site en suivant les tutoriels "Développer un site" (jour 1 à cette adresse: https://www.grafikart.fr/tutoriels/developper-site-jour1-base-donnees-183), qui sont, soit dit en passant, super bien faits.

Mon site est terminé (ça fait deux ans que je bosse dessus en local) et je l'ai uploadé sur mon server OVH (en php 7.2.19, comme mon wamp).
Et là, grosse déception , rien ne fonctionne. Le css n'est pas pris en compte, aucun lien ne fonctionne (j'obtiens des File not found. à chaque fois). J'ai essayé pas mal de choses, rien à faire.

Je fais mes liens grâce à deux fonctions, Router::url et Router::webroot, qui finissent toutes les deux par retourner BASE_URL.$url sachant que BASE_URL vaut dirname(dirname($_SERVER['SCRIPT_NAME'])). et est initialisé dans un fichier index.php dans un dossier webroot/index.php

Ce qui est étonnant c'est que les images sont bien affichées (avec ce code: <img src="<?php echo Router::webroot('img/img.png'); ?>" alt="machin" />
Mais les liens css <link rel="stylesheet" type="text/css" href="<?php echo Router::webroot('webroot/css/style.css'); ?>" /> ne fonctionnent pas (enfin dans le code de la page, quand je clique dessus, je vois bien le css mais les styles ne sont pas appliqués...)

Et les liens sont faits comme ça: <a href="<?php echo Router::url('homepage/index'); ?>">Page d'accueil</a>

J'ai bien mis en place les .htaccess comme indiqué dans le tuto.

Une idée?
Merci!

Problème confirmation du compte

$
0
0

Bonjour,

Voila je rencontre un petit problème avec mon code.

Ce que je fais

J'ai suivi les tuto pour la gestion de compte et la refactoriasation. J'ai juste ajouté le champ prénom (firstname) et le pseudo lors de l'inscription.

Voici le register.php

<?php 
require 'inc/bootstrap.php'; 

// Je veux récupérer le premier utilisateur

if (!empty($_POST)) {

    $errors = array();

    $db = App::getDatabase();
    $validator = new Validator($_POST);
    $validator->isAlpha('name', "Votre nom n'est pas valide (alphanumériquement) !");
    $validator->isAlpha('firstname', "Votre prénom n'est pas valide (alphanumériquement) !");
    $validator->isAlpha('pseudo', $db, 'membres', "Votre pseudo n'est pas valide !");
    if ($validator->isValid()) {
        $validator->isUniq('pseudo', $db, 'membres', "Ce pseudo est déjà utilisée pour un autre compte !");
    }
    $validator->isEmail('email', $db, 'membres', "Votre Email n'est pas valide !");
    if ($validator->isValid()) {
        $validator->isUniq('email', $db, 'membres', "Cette adresse Email est déjà utilisée pour un autre compte !");
    }
    $validator->isConfirmed('password', "Votre mot de passe n'est pas valide !");

    if ($validator->isValid()) {
        App::getAuth()->register($db, $_POST['name'], $_POST['firstname'], $_POST['pseudo'], $_POST['password'], $_POST['email']);
        Session::getInstance()->setFlash('success', "Un Email de confirmation vous a été envoyé pour valider votre compte !");
        App::redirect('login.php');
    }else{
        $errors = $validator->getErrors();
    }

}

?>

<?php require 'inc/header.php'; ?>

<br>
<h1>S'inscrire</h1>
<hr>

<?php if (!empty($errors)): ?>
<div class="alert alert-danger">
    <p>Vous n'avez pas rempli le formulaire correctement :</p>
    <ul>
    <?php foreach ($errors as $error): ?>
        <li><?= $error; ?></li>
    <?php endforeach; ?>
    </ul>   
</div>
<?php endif; ?>

<form action="" method="POST">

    <div class="form-group">
            <input type="text" name="name" class="form-control" placeholder="Nom" required>
    </div>

    <div class="form-group">
            <input type="text" name="firstname" class="form-control" placeholder="Prénom" required>
    </div>

    <div class="form-group">
            <input type="text" name="pseudo" class="form-control" placeholder="Pseudo" required>
    </div>

    <div class="form-group">
            <input type="text" name="email" class="form-control" placeholder="Email" required>
    </div>

    <div class="form-group">
            <input type="password" name="password" class="form-control" placeholder="Mot de passe" required>
    </div>

    <div class="form-group">
            <input type="password" name="password_confirm" class="form-control" placeholder="Confirmez le mot de passe" required>
    </div>

    <button type="submit" class="btn btn-primary">S'inscrire</button>

</form>

<?php require 'inc/footer.php'; ?>

Voici le confirm.php

<?php
require 'inc/bootstrap.php';
$db = App::getDatabase();
$auth = new Auth();

if(App::getAuth()->confirm($db, $_GET['id'], $_GET['token'], Session::getInstance())){
    Session::getInstance()->setFlash('success', "Votre compte a bien été validé !");
    App::redirect('account.php');
}else{
    Session::getInstance()->setFlash('danger', "Ce token n'est plus valide...");
    App::redirect('login.php');
}

Voici le Auth.php

<?php
class Auth{

    private $options = [
        'restriction_msg' => "Vous n'avez pas le droit d'accéder à cette page !"
    ];
    private $session;

    public function __construct($session, $options = []){
        $this->options = array_merge($this->options, $options);
        $this->session = $session;
    }

    public function hashPassword($password){
        return password_hash($password, PASSWORD_BCRYPT);
    }

    public function register($db, $name, $firstname, $pseudo, $password, $email){
        $password = $this->hashPassword($password);
        $token = Str::random(60);
        $db->query("INSERT INTO membres SET name = ?, firstname = ?, pseudo = ?, password = ?, email = ?, confirmation_token = ?", [
            $name, 
            $firstname,
            $pseudo, 
            $password, 
            $email, 
            $token
        ]);
        $user_id = $db->lastInsertId();
        mail($email, 'Confirmation de votre compte', "Afin de valider votre compte merci de cliquer sur ce lien\n\nhttp://localhost/forum_blog/comptes/confirm.php?id=$user_id&token=$token");  
    }

    public function confirm($db, $user_id, $token){
        $user = $db->query('SELECT * FROM membres WHERE id = ?', [$user_id])->fetch();

        if($user && $user->confirmation_token == $token){
            $db->query('UPDATE membres SET confirmation_token = NULL, confirmed_at = NOW() WHERE id = ?', [$user_id]);
            $this->session->write('auth', $user);
            return true;
        }
        return false;
    }

    public function restrict(){
        if (!$this->session->read('auth')) {
            $this->session->setFlash('danger', $this->options['restriction_msg']);
            header('Location: login.php');
            exit();
        }
    }

    public function user(){
        if (!$this->session->read('auth')) {
            return false;
        }
        return $this->session->read('auth');
    }

    public function connect($user){
        $this->session->write('auth', $user);
    }

    public function connectFromCookie($db){
        if (isset($_COOKIE['remember']) && !$this->user()) {
            $remember_token = $_COOKIE['remember'];
            $parts = explode('==', $remember_token);
            $user_id = $parts[0];
            $user = $db->query('SELECT * FROM membres WHERE id = ?', [$user_id])->fetch();
            if ($user) {
                $expected = $user_id . '==' . $user->remember_token . sha1($user_id . 'ratonlaveurs');
                if ($expected == $remember_token) {
                    $this->connect($user);
                    setcookie('remember', $remember_token, time() + 60 * 60 * 24 * 7);
                }else{
                    setcookie('remember', null, -1);
                }
            }else{
                setcookie('remember', null, -1);
            }
        }
    }

    public function login($db, $email, $password, $remember = false){
        $user = $db->query('SELECT * FROM membres WHERE (email = :email) AND confirmed_at IS NOT NULL', ['email' => $email])->fetch();
        if(!empty($user) && password_verify($password, $user->password)){
            $this->connect($user);
            if ($remember) {
                $this->remember($db, $user->id);
            }
            return $user;
        }else{
            return false;
        }
    }

    public function remember($db, $user_id){
        $remember_token = Str::random(250);
        $db->query('UPDATE membres SET remember_token = ? WHERE id = ?', [$remember_token, $user_id]);
        setcookie('remember', $user_id . '==' . $remember_token . sha1($user_id . 'ratonlaveurs'), time() + 60 * 60 * 24 * 7);
    }

    public function logout(){
        setcookie('remember', NULL, -1);
        $this->session->delete('auth');
    }

    public function resetPassword($db, $email){
        $user = $db->query('SELECT * FROM membres WHERE email = ? AND confirmed_at IS NOT NULL', [$email])->fetch();
        if($user){
            $reset_token = Str::random(60);
            $db->query('UPDATE membres SET reset_token = ?, reset_at = NOW() WHERE id = ?', [$reset_token, $user->id]);
            mail($_POST['email'], 'Réinitialisation de votre mot de passe', "Afin de réinitialiser votre mot de passe merci de cliquer sur ce lien\n\nhttp://localhost/forum_blog/comptes/reset.php?id={$user->id}&token=$reset_token");
            return $user;
        }
        return false;
    }

    public function checkResetToken($db, $user_id, $token){ 
        return $db->query('SELECT * FROM membres WHERE id = ? AND reset_token IS NOT NULL AND reset_token = ? AND reset_at > DATE_SUB(NOW(), INTERVAL 30 MINUTE)', [$user_id, $token])->fetch();
    }
}

Ce que je veux

Je voulais faire la même chose que dans la vidéo de Grafikart, sauf rajouté lors de l'inscription le prénom et un pseudo.

Ce que j'obtiens

Je reçois bien le mail avec le lien pour valider le compte, je le copies colle et voici l'erreur que j'ai :

Fatal error: Uncaught ArgumentCountError: Too few arguments to function Auth::__construct(), 0 passed in D:\wamp64\www\Forum_Blog\comptes\confirm.php on line 4 and at least 1 expected in D:\wamp64\www\Forum_Blog\comptes\class\Auth.php on line 9
( ! ) ArgumentCountError: Too few arguments to function Auth::__construct(), 0 passed in D:\wamp64\www\Forum_Blog\comptes\confirm.php on line 4 and at least 1 expected in D:\wamp64\www\Forum_Blog\comptes\class\Auth.php on line 9

Ca fait 2 jours que j'essaie de trouver une solution mais je ne trouve rien.
Si je comprends bien il n'y a pas assez d'argument pour la fonction construct mais je ne comprends pas ce qu'il me manque...

Merci de votre aide ! Bonne journée à vous :)

AltoRouter et l'Ajax

$
0
0

Bonjour, j'ai une petite préoccupation avec AltoRouter.
En fait j'essaie de faire de l'asynchrone, normalement tous mes scripts fonctionnes mais le truc c'est que comme toutes fichiers se charge dans la page default.php (où je require le header.php et le footer.php) quand j'essaye de récupérer le résultat de mes requêtes toute la page est chargée.

S'il vous plaît comment récupérer uniquement le message généré part la requête asynchrone et non toute la page.

Erreur SQLSTATE[HY000]

$
0
0

Bonjour,

je rencontre un problème avec mon blog et je sais pas à quoi cela est dû. je suis à la 32minute chapitre BACK-END de la formation POO en PHP, je suis suis confronté à ce message d'erreur après la soumission de mon formulaire pour effectuer un UPDATE.. je tiens à préciser que la modification s'effectue bien dans la base de donnée mais ce reçois le message d'erreur ci dessous..

Ce que je fais

edit.php

Entourez votr<?php
use \Core\html\BootstrapForm;


$postTable = App::getInstance()->getTable('Post');

if(!empty($_POST)){
  $result = $postTable->update($_GET['id'], [
        'titre' => $_POST['titre'],
        'contenu' => $_POST['contenu']
    ]);
  if($result){
?>
      <div class="alert alert-success">L'article a bien été modifié</div>

<?php
  }

}

$post = $postTable->find($_GET['id']);
$form = new BootstrapForm($post);

?>

<form method="post">
    <?= $form->input('titre', 'Titre de l\'article'); ?>
    <?= $form->input('contenu', 'Contenu',['type' => 'textarea']); ?>
    <button class="btn btn-primary">Modifier</button>

</form>e code pour bien le mettre en forme

<?php

namespace Core\Database;

use \PDO;

class MysqlDatabase extends Database
{
private $db_name;
private $db_user;
private $db_pass;
private $db_host;
private $pdo;

public function __construct($db_name, $db_user = 'root', $db_pass ='', $db_host ='locahost')
{
    $this->db_name = $db_name;
    $this->db_user = $db_user;
    $this->db_pass = $db_pass;
    $this->db_host = $db_host;
}

private function getPDO(){
    if($this->pdo === null){
        $pdo = new PDO('mysql:dbname=blog_poo;host=localhost', 'root', '' );
        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $this->pdo = $pdo;
    }
    return $this->pdo;
}

public function query($statement, $class_name = null, $one = false){
    $req = $this->getPDO()->query($statement);
    if(
        strpos($statement, 'UPDATE') === 0 ||
        strpos($statement, 'INSERT') === 0 ||
        strpos($statement, 'DELETE') === 0
    ) {
        return $req;
    }
    if($class_name === null){
        $req->setFetchMode(PDO::FETCH_OBJ);
    }else{
        $req->setFetchMode(PDO::FETCH_CLASS, $class_name);
    }

    if($one){
        $datas = $req->fetch();
    }else {
        $datas = $req->fetchAll();
    }
    return $datas;
}

public function prepare($statement, $attributes, $class_name = null, $one = false){
    $req = $this->getPDO()->prepare($statement);
    $res = $req->execute($attributes);
    if(
        strpos($statement, 'UPDATE') === 0 ||
        strpos($statement, 'INSERT') === 0 ||
        strpos($statement, 'DELETE') === 0
    ) {
        return $res;
    }
    if($class_name === null){
        $req->setFetchMode(PDO::FETCH_OBJ);
    }else{
        $req->setFetchMode(PDO::FETCH_CLASS, $class_name);
    }
    if($one){
        $datas = $req->fetch();
    }else {
        $datas = $req->fetchAll();
    }
    return $datas;

}

}

Ce que je veux

voir vidéo 32:13 min du chapitre back-end

Ce que j'obtiens

Fatal error: Uncaught PDOException: SQLSTATE[HY000]: General error in C:\xampp\htdocs\PooPhpComplet\core\database\MysqlDatabase.php:71 Stack trace: #0 C:\xampp\htdocs\PooPhpComplet\core\database\MysqlDatabase.php(71): PDOStatement->fetch() #1 C:\xampp\htdocs\PooPhpComplet\core\table\Table.php(51): Core\Database\MysqlDatabase->prepare(' UPDATE article...', Array, 'App\Entity\Post...', true) #2 C:\xampp\htdocs\PooPhpComplet\core\table\Table.php(38): Core\Table\Table->query(' UPDATE article...', Array, true) #3 C:\xampp\htdocs\PooPhpComplet\pages\admin\posts\edit.php(10): Core\Table\Table->update('1', Array) #4 C:\xampp\htdocs\PooPhpComplet\public\admin.php(27): require('C:\xampp\htdocs...') #5 {main} thrown in C:\xampp\htdocs\PooPhpComplet\core\database\MysqlDatabase.php on line 71

Récupérer checkbox dans phpmyadmin

$
0
0

Bonjour,

Voila je rencontre un petit problème avec mon code.

J'ai créé un questionnaire. Il fonctionnait correctement jusqu'à ce que je veuille rajouter une question avec des checkbox. J'ai choisi de leur attribuer le même name que j'ai nommé comme ceci name=connaitre[]. J'utilise donc array puis implode afin d'insérer mes données en les séparant par une virgule si la personne coche plusieurs cases.

Code HTML

<form method="post" action="reponses.php">


    <h2> 1. Comment avez-vous connu la visite ?</h2>
    <p>
        <input type="checkbox" name="connaitre[]" value="Site" id="site" /> <label for="site">Site internet </label><br />
        <input type="checkbox" name="connaitre[]" value="Office de tourisme" id="tourisme" /> <label for="tourisme">Office de tourisme</label><br />
        <input type="checkbox" name="connaitre[]" value="Réseaux sociaux" id="rs" /> <label for="rs">Réseaux sociaux</label><br />
        <input type="checkbox" name="connaitre[]" value="Brochure" id="brochure" /> <label for="brochure">Brochure</label><br />
        <input type="checkbox" name="connaitre[]" value="Autre" placeholder="Ex : Bouche à oreille" id="brochure"/><label for="autre"> Autre</label> <textarea id="texta1" name="autre" id="autre"></textarea> 
    </p>

Code PHP

<?php
// ouverture d'une connexion à la bdd viste

try{

$objetPdo = new PDO ('mysql:host=localhost;dbname=questionnaire','root','');

// activation des erreurs PDO

$objetPdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

}
catch(PDOException $e){   
    die('Erreur : '.$e->getMessage());
   }   

   if (isset($_POST['validform']))
   {
       $connaitre_array = ( isset($_POST['connaitre']) )? $_POST['connaitre'] : ''; 
       $connaitre_list = implode( ',', $connaitre_array); // implode pour mettre à la suite les pièces de ton tableau dans une chaine de caractères en les séparant par un délimiteur

       $ouinon = $_POST['ouinon'];
       $degre = $_POST['degre'];
       $amelioration = $_POST['amelioration'];
       $ouireanon = $_POST['ouireanon'];
       $departement = $_POST['departement'];
   }

   var_dump( $connaitre_array ); // TEST
   echo $connaitre_list;

// préparation de la requête d'insertion

$pdoStat = $objetPdo->prepare('INSERT INTO visite (question1, question2, question3, question4, question5, question6) VALUES (:question1, :question2, :question3, :question4, :question5, :question6)');

// on lie chaque marqueur à une valeur
$pdoStat->bindValue(':question1', $_POST['connaitre'], PDO::PARAM_STR);

$pdoStat->bindValue(':question2', $_POST['ouinon'], PDO::PARAM_STR); 

$pdoStat->bindValue(':question3', $_POST['degre'], PDO::PARAM_STR); 

$pdoStat->bindValue(':question4', $_POST['amelioration'], PDO::PARAM_STR); 

$pdoStat->bindValue(':question5', $_POST['ouireanon'], PDO::PARAM_STR); 

$pdoStat->bindValue(':question6', $_POST['departement'], PDO::PARAM_STR); 


//execution de la requête préparée 

$insertIsOk = $pdoStat->execute();

if($insertIsOk){

    $message = "Vos réponses ont bien été envoyées !";
}

else{
    $message = "Erreur";
}
?>

<!DOCTYPE html>
<html lang='fr'>
<head> 

<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no">
<link rel="stylesheet" href="style.css">
<title> titre doc </title>

</head>

<body id="body2">

<div id="divpara">
<p class="parafinal"><?php echo $message; ?></p>
</div>

</body>
</html>

J'obtiens ceci lors de l'envoi de mon formulaire.

array(2) { [0]=> string(4) "Site" [1]=> string(18) "Office de tourisme" } Site,Office de tourisme
Notice: Array to string conversion in C:\Program Files (x86)\EasyPHP-Devserver-17\eds-www\for\reponses.php on line 35
Vos réponses ont bien été envoyées !

Sur phpmyadmin, la réponse à la question 1 est complété par "Array".

Merci.

POO this dans fonction statique

$
0
0

Bonjour,

Ce que je fais

Je veux afficher une liste d'éléments sans instancier la classe Calls à l'aide des fonctions statiques. Or, ici je rencontre un pb car lorsque j'essaie de mettre static à ma seconde fonction ci-jointe, mon editeur (PHP STORM) m'indique une erreur au niveau de $this ... Je ne comprends pas et ne trouve pas comment résoudre mon pb. Pourriez-vous s'il vous plait me donner une piste de recherche ?

class Calls
{
    protected $pdo;
    protected $o;

    public function __construct()
    {
        $this->pdo = Database::getPDO();
    }

     public function getCalls(){
     $rest = $this->pdo->prepare(...);
        ...
     }
}

Ce que je veux

class Calls
{
    protected $pdo;
    protected $o;

    public function __construct()
    {
        $this->pdo = Database::getPDO();
    }

     public static function getCalls(){
     $rest = $this->pdo->prepare(...);
        ...
     }
}

Merci d'avance !


Créer un sous menu dynamique

$
0
0

Bonjour,

Voila je rencontre un petit problème avec mon code. J'ai deux tables dans ma base de données :
la table catégories
la table produits

Ensuite je veux faire un menu hierarchisé comme ceci :
Menu principal : le nom de la catégorie
Sous menu : liste des produits associés
*A noter que j'utilise une structure MVC *

Ce que je fais

Je cherche à faire une boucle qui dispatcherait automatiquement les bons produits dans la catégorie adéquate.

<ul id="liste-categories">
                <?php foreach ( $categories as $cat ): ?>
                    <li class="titre-categorie"><?php echo $cat['c_name'] ?>
                        <a class="btn_category" href="index.php?action=category&id=<?php echo $cat['c_id']?>"><i class="fas fa-plus fleche" data-id=<?php echo $cat['c_id'] ?>></i></a>
                    </li>

                    <ul class="ss-titre-categorie" data-id=<?php echo $cat['c_id'] ?>>
                        <?php foreach ( $produits as $p ) : ?>
                                <li data-id=<?php echo $p['c_id'] ?>><?php echo $p['p_name'] ?></li>
                        <?php endforeach; ?>
                    </ul>
                <?php endforeach; ?>
            </ul>

Ce que je veux

Pour l'instant j'ai 6 catégories et seulement 2 produits : crème hydratante reliée à la catégorie Crème, et un sérum lissant reliée à la catégorie Sérums.
Quand je déroule le menu Crème, je voudrais juste qu'apparaisse crème hydratante

Ce que j'obtiens

Or pour l'instant, quand je clique sur Crème (le premier item de mon menu), les deux produits apparaissent.

Altorouter et paramètres optionnels

$
0
0

Bonjour,

J'utilisa Altorouter pour gérer mes routes, pas de souci là dessus, et j'ai utilisé parfois l'option "?" pour qu'un paramètre soit optionnel.

J'ai une route avec comme chemain ceci: /admin/groups/manage/[i:id]-[*:slug]
Je souhaiterais rendre les 2 paramètres optionnels (ça ok), mais aussi le tiret qui se trouve entre les 2. Si je me contente de mettre un "?" à chaque paramètre, si j'envois simplement l'URL "/admin/groups/manage/" alors ma route n'est plus reconnue.

Comment faire ceci SVP?

Merci!

Executé du Python en PHP

$
0
0

Bonjour !

C'est mon premier post ici, je viens vers vous car après avoir épluché tout internet je ne sais pas comment faire pour exécuté du python en php, beaucoup de personnes ont des solutions cependant après avoir tout essayer m'as page php charge un peut mais ne fais rien, j'ai vue que ça pouvais être une histoire d'autorisation mais je ne m'y connais pas trop :/

Merci d'avance pour votre aide.

Problème pour afficher les tableaux multidimensionnels

$
0
0

****Bonjour,

Voila je rencontre un petit problème avec mon code.

Ce que je fais

les utilisateurs devront passer par un formulaire de contact pour la mise en relation. L’utilisateur doit choisir sa ville de départ dans une liste, en fonction de la ville choisie, les différents itinéraires seront proposés.

<?php
error_get_last(-1);
ini_set('display_errors', 1);
$firstName = $_POST['prenom'];
$name = $_POST['nom'];
$email = $_POST['email'];
$phoneNumber =$_POST['telephone'];
$city=$_POST['ville'];
$validation =$_POST['recherche'];
$erreur="";
if (isset($validation))
 {
  if (empty($firstName))
  {
  $erreur = 'Veuillez remplire le champ Prenom';
  }
  elseif (empty($name))
   {
    $erreur='Veuillez remplire le champ nom';
  }
  elseif (empty($email))
  {
    $erreur='Veuillez entrer une adresse email';
  }
  elseif (!is_numeric($phoneNumber))
   {
    $erreur='Veuillez entrer un numero valide';
  }
else
{
  echo '<p> Non :'.''. htmlspecialchars($name).'</p>';
  echo '<p> Prenom :'.''. htmlspecialchars($firstName).'</p>';
  echo '<p> Email :'.''. htmlspecialchars($email).'</p>';
  echo '<p> Telephone :'.''. htmlspecialchars($phoneNumber).'</p>';
  echo '<p> Ville de départ :'.''. htmlspecialchars($city).'</p>';
}
}
echo $erreur;

$travels=[
'id'=>0, [
          'departure' => 'Paris',
          'arrival' => 'Nantes',
          'departureTime' => '11:00',
          'arrivalTime' => '12:34',
          'driver' =>'Thomas'
         ],
'id'=>1, [
          'departure' => 'Orléans',
          'arrival' => 'Nantes',
          'departureTime' => '05:15',
          'arrivalTime' => '09:32',
          'driver' =>'Mathieu'
         ],
'id'=>2, [
          'departure' => 'Dublin',
          'arrival' => 'Tours',
          'departureTime' => '07:23',
          'arrivalTime' => '08:50',
          'driver' =>'Nathanaël'
         ],
'id'=>3, [
          'departure' => 'Paris',
          'arrival' => 'Orléans',
          'departureTime' => '03:00',
          'arrivalTime' => '05:26',
          'driver' =>'Clément'
         ],
'id'=>4, [
          'departure' => 'Paris',
          'arrival' => 'Nice',
          'departureTime' => '10:00',
          'arrivalTime' => '12:00',
          'driver' =>'Audrey'
        ],
'id'=>5, [
          'departure' => 'Nice',
          'arrival' => 'Nantes',
          'departureTime' => '10:40',
          'arrivalTime' => '13:00',
          'driver' =>'Pollux'
         ],
'id'=>6, [
          'departure' => 'Nice',
          'arrival' => 'Tours',
          'departureTime' => '11:00',
          'arrivalTime' => '16:10',
          'driver' =>'Edouard'
         ],
'id'=>7, [
          'departure' => 'Tours',
          'arrival' => 'Amboise',
          'departureTime' => '16:00',
          'arrivalTime' => '18:40',
          'driver' =>'Priscilla'
         ],
'id'=>8, [
          'departure' => 'Nice',
          'arrival' => 'Nantes',
          'departureTime' => '12:00',
          'arrivalTime' => '16:00',
          'driver' =>'Charlotte'
          ],
]; //les destination correspondantes à sa ville de départ sont proposéess.

print_r($travels[2]);
foreach ($travels as  $travel) {
  echo $travel['departure'] .'</br>';
}
 ?>

Ce que je veux

Lorsque l’utilisateur clique sur « Rechercher », les destinations correspondantes à sa ville de départ sont proposées.

Ce que j'obtiens

Array Array Array Array Array Array Array Array Array Array Array Array Array Array

Moteur de recherche dans un MVC

$
0
0

Bonjour,

Voila je rencontre un petit problème avec mon code.

Ce que je fais

Dans la suite du tutoriel un site de A à Z, j'essaye d'implémenter un moteur de recherche simple qui irait chercher dans les posts de la base de données.

J'ai modifié mon objet Request comme ci-après en y implementant un isset($_GET)

<?php

class Request{

    var $url;
    public $page = 1;
    public $prefix = false;
    public $data = false;
    public $drop = false;
    public $search = false;

    function __construct(){
        $this->url = isset($_SERVER['PATH_INFO'])?$_SERVER['PATH_INFO']:'/';
        if(isset($_GET['page'])){// si on détecte une page
            if(is_numeric($_GET['page'])){
                if($_GET['page'] > 0){//pour n'avoir que des valeurs >0
                    $this->page = round($_GET['page']);// on injecte la valeur
                }
            }
        }
        if(!empty($_POST)){// si des données de l'admin ont été envoyés
            $this->data = new stdClass();// création d'un nouvel objet vide
            foreach($_POST as $k=>$v){
                $this->data->$k=$v;//on insère les éléments dans l'objet data
            }
        }
        if(isset($_GET['search'])){// si des données de recherche ont été envoyés
                $this->search = new stdClass();// création d'un nouvel objet vide
        }   
    }
}

J'ai créé une fonction searchData (ci-après) dans le PostsController ci-après
Entourez votre code pour bien le mettre en forme

function searchData()
    {
        if(!empty($_GET))
        {
            if($this->request->search){
            $search = $_GET['search'];
            $perPage = 3;//nbre d'article par page
            $this->loadModel('Post');
            $condition = array('Post.online'=>1,'Post.type'=>'post');
            $d['posts'] = $this->Post->find(array(
            'conditions' => $condition,
            'fields'    => 'Post.id, Post.name, Post.slug, Post.content',
            'like'  => '%search%',
            'order' => 'Post.created DESC ',
            'limit' => ($perPage*($this->request->page-1)).','.$perPage// on décale l'index page de 1
            ));

            if(empty($d['posts'])){
            $this->e404('Page introuvable');
        }

            $d['total'] = $this->Post->findCount($condition);//donne le nombre d'article total
            $d['page'] = ceil($d['total'] / $perPage);//Nbre de page(Divise le nbre d'article total par le nbre d'article par page). ceil arrondi à l'entier supérieur.  
            $this->set($d);
            }
        }
    }

Enfin, j'ai créé la vue searchData ci-après

div class="row">

    <div class="col-sm-8">

    <div class="page-header">
        <h3><em>Résultat de votre recherche</em></h3>
    </div>

    <?php foreach ($posts as $k => $v): ?>
    <div class="clearfix">


        <h3><?php echo $v->name; ?></h3>
        <?php echo substr($v->content,0,200); ?>
        <p><a href="<?php echo Router::url("posts/view/id:$v->id/slug:$v->slug"); ?>" class="btn-primary"> Lire la suite</a></p>

    </div>  
    <?php endforeach; ?>

    <nav>
        <ul class="pagination">
            <?php for ($i = 1; $i <=$page; $i++): // si...nombre de page?>
            <li <?php if($i==$this->request->page) echo 'class="active"'; ?>><a href="?page=<?php echo $i; ?>"><?php echo $i; ?></a></li>
            <?php endfor; ?>
        </ul>
    </nav>
    </div>
</div>    

Ci-après le chemin qui figure dans mon layout

<li><form method="get" action="<?php echo Router::url('posts/searchData'); ?>" class="navbar-search pull-left">
                    <input type="text" class="form-control" placeholder="Search"></form></li>

Ce que je veux

Je cherche à avoir le résultat de la recherche dans une page

Ce que j'obtiens

J'ai bien mon formulaire de recherche dans mon menu, je suis bien redirigé vers la bonne page et suis notifié d'aucune erreur si ce n'est que je n'obtiens rien du tout quand je lance une recherche.

Merci d'avance pour votre aide.

Symfony 4 par l'exemple - Paginer les biens

$
0
0

Bonjour,

Voila je rencontre un petit problème avec mon code.

Ce que je fais

Chapitre : paginer les biens
Je suis au moment où après avoir renseigné le fichier PropertyFixture , on lance la ligne de commande php bin/console doctrine:fixtures:load pour charger dans la base de donnée les 100 biens (vers le début de la 5ème minute de la vidéo)
Ci-après mon code du fichier PropertyFixture :

<?php

namespace App\DataFixtures;

use App\Entity\Property;
use Doctrine\Bundle\FixturesBundle\Fixture;
use Doctrine\Common\Persistence\ObjectManager;
use Faker\Factory;

class PropertyFixture extends Fixture
{
    public function load(ObjectManager $manager)
    {
        $faker = Factory::create('fr_FR');
        for($i = 0; $i < 100; $i++)
        {
            $property = new Property();
            $property
            ->setTitle($faker->words(3, true))
            ->setDescription($faker->sentences(3, true))
            ->setSurface($faker->numberBetween(12, 400))
            ->setRooms($faker->numberBetween(1, 10))
            ->setBedrooms($faker->numberBetween(1, 10))
            ->setFloor($faker->numberBetween(0, 15))
            ->setPrice($faker->numberBetween(100000, 2000000))
            ->setHeat($faker->numberBetween(0, count(Property::HEAT) - 1))
            ->setCity($faker->city)
            ->setAdress($faker->adress)
            ->setPostalCode($faker->postcode)
            ->setSold(false);
        $manager->persist($property);
        }
        // $product = new Product();
        // $manager->persist($product);

        $manager->flush();
    }
}

Ce que je veux

Je cherche à injecter dans la BD 100 biens

Ce que j'obtiens

j'ai le message d'erreur suivant :
Argument 1 passed App\Entity\Property::setTitle must be of the type string. array given. Pourtant, j'ai bien porté words à true.
Au final, aucun élément n'a été chargé dans la base de données.

Merci par avance pour votre aide.

Effacer un cookie

$
0
0

Bonjour,

Je ne comprends pas pourquoi je n'arrive pas à supprimer un cookie qui vient d'être créé via un formulaire.
Pour ce faire, j'ai mis un lien de déconnexion, mais mon cookie reste présente jusqu'à son extinction.

<a href="cookie.php?action=deconnecter">Se déconnecter</a> <!-- Lien pour se déconnecter-->
<?php
if (!empty ($_GET['action']) && $_GET['action']==='deconnecter') {
    unset ($_COOKIE['utilisateur']);
}
 ?>

Si vous avez une idée car là, je cale....
Merci d'avance


"Protection" d'images

$
0
0

Bonjour,

Je ne sais pas trop dans quel forum poser ma question, mais comme je développe mon site en PHP je la mets donc ici...

Bref, Je développe un petit site où des visiteurs authentifiés peuvent déposer des images. Pour le moment celles-ci sont enregistrées toutes dans le même dossier avec comme nom l'ID de l'enregistrement correspondant dans la BDD.
Il est donc facile pour n'importe quel visiteur de changer le numéro dans le nom d'une image pour voir toutes les autres chargées, ce qui n'est pas top...

J'avais donc dans l'idée d'avoir pour chaque utilisateur une sorte de code unique, et de placer les images de chaque utilisateur dans un dossier à lui, nommé avec ce code.
Au lieu d'avoir "img/2.jpg", j'aurais donc "img/xDp57iY/2.jpg". Beaucoup plus difficile à trouver pour d'autres utilisateurs.

Cette méthode vous parait-elle bonne, y'a-t-il mieux?
Je suis preneur de toute idée. :)

Merci!

probleme espace membre

$
0
0

Bonjour,

j'ai un soucis avec la création de mon espace membre.
quand je valide le formulaire d'inscription j'obtiens l'erreur suivante:

Fatal error: Uncaught Error: Call to a member function prepare() on null in G:\Fred\Programmes_files\wamp64\www\social\model\functions.php:17 Stack trace: #0 G:\Fred\Programmes_files\wamp64\www\social\model\register.php(27): is_already_in_use('pseudo', 'alf233', 'users') #1 G:\Fred\Programmes_files\wamp64\www\social\controller\frontend.php(5): require('G:\Fred\Program...') #2 G:\Fred\Programmes_files\wamp64\www\social\index.php(12): home() #3 {main} thrown in G:\Fred\Programmes_files\wamp64\www\social\model\functions.php on line 17

donc je vous met ma page register:

<?php
require ('model/functions.php');
require ('config/db_connect.php');

//Si le formulaire a été soumis
if (isset($_POST['register'])) {
    //Si tous les champs ont été remplis
    if (not_empty(['pseudo', 'genre', 'email', 'password', 'confirm'])) {
        $errors = [];
        extract($_POST);

        if (mb_strlen($pseudo) < 3) {
            $errors[] = 'Pseudo trop court! (Minimum 3 caractères)';
        }
        if (empty($genre)) {
            $errors[] = 'Veuillez préciser votre genre!';
        }
        if (! filter_var($email, FILTER_VALIDATE_EMAIL)) {
            $errors[] = 'Adresse email invalide!';
        }
        if (mb_strlen($password) < 3) {
            $errors[] = 'mot de passe trop court! (Minimum 3 caractères)';
        }
        if ($password != $confirm) {
            $errors[] = 'Les deux mots de passe ne concordent pas!';
        }
        if (is_already_in_use('pseudo', $pseudo, 'users')) {
            $errors[] = 'Pseudo déjà utilisé!';
        }
        if (is_already_in_use('email', $email, 'users')) {
            $errors[] = 'Adresse email déjà utilisé!';
        }
        if (count($errors) == 0) {
            //envoie du mail d'actvation
            $to = $email;
            $subject = WEBSITE_NAME." - ACTIVATION DE COMPTE";
            $token = sha1($pseudo.$email.$password);

            ob_start();
            require ('/view/frontend/template/email/activation.tmpl.php');
            $activation = ob_get_clean();

            $headers = 'MIME-Version: 1.0' . "\r\n";
            $headers = 'Content-type: text/html; charset=iso-8859-1' . "\r\n";

            mail($to, $subject, $activation, $headers);

            echo "Mail d'activation envoyé!";

        }



    }
    else {
        $errors[] = 'Veuillez remplir tous les champs';
    }
}

et mon fichier functions.php

<?php
if (!function_exists('not_empty')) {
    function not_empty ($fields = []) {
        if (count($fields != 0)) {
            foreach ($fields as $field) {
                if (empty($_POST[$field]) || trim($_POST[$field]) == "") {
                    return false;
                }
            }
            return true;
        }
    }
}
if (!function_exists('is_already_in_use')) {
    function is_already_in_use($field, $value, $table) {
        global $db;
        $q = $db->prepare("SELECT id from $table WHERE $field = ?");
        $q->execute([$value]);
        $count = $q->rowCount();
        $q->closeCursor();
        return $count;
    }
}

si quelqu'un à une solution

message flash qui ne s'affiche pas

$
0
0

bonjour,

pour mon système d'inscription j'utilise les messages flash pour confirmer la validation de l'inscription cependant celui ci ne s'affiche pas
si je supprime le if et endif ça fonctionne, j'utilise wamp et php 7.1.9
voici ma page register

<?php
session_start();
require ('config/constants.php');
require ('model/functions.php');

//Si le formulaire a été soumis
if (isset($_POST['register'])) {
    extract($_POST);
    //Si tous les champs ont été remplis
    if (not_empty(['pseudo', 'genre', 'email', 'password', 'confirm'])) {
        $errors = [];

        if (mb_strlen($pseudo) < 3) {
            $errors[] = 'Pseudo trop court! (Minimum 3 caractères)';
        }
        if (empty($genre)) {
            $errors[] = 'Veuillez préciser votre genre!';
        }
        if (! filter_var($email, FILTER_VALIDATE_EMAIL)) {
            $errors[] = 'Adresse email invalide!';
        }
        if (mb_strlen($password) < 3) {
            $errors[] = 'mot de passe trop court! (Minimum 3 caractères)';
        }
        if ($password != $confirm) {
            $errors[] = 'Les deux mots de passe ne concordent pas!';
        }
        if (is_already_in_use('pseudo', $pseudo, 'users')) {
            $errors[] = 'Pseudo déjà utilisé!';
        }
        if (is_already_in_use('email', $email, 'users')) {
            $errors[] = 'Adresse email déjà utilisé!';
        }
        if (count($errors) == 0) {
            //envoie du mail d'actvation
            $to = $email;
            $subject = WEBSITE_NAME." - ACTIVATION DE COMPTE";
            $token = sha1($pseudo.$email.$password);

            ob_start();
            require ('view/frontend/template/emails/activation.tmpl.php');
            $activation = ob_get_clean();

            $headers = 'MIME-Version: 1.0' . "\r\n";
            $headers = 'Content-type: text/html; charset=iso-8859-1' . "\r\n";

            mail($to, $subject, $activation, $headers);

            set_flash("Mail d'activation envoyé!", "success");

        }



    }
    else {
        $errors[] = 'Veuillez remplir tous les champs';
    }
}

ma page functions.php

<?php
function dbConnect() {
    try {
        $db = new PDO("mysql:host=".DB_HOST.";dbname=".DB_NAME, DB_USERNAME, DB_PASSWORD);
        $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        return $db;
    } catch (PDOException $e) {
        die('Erreur: '.$e->getMessage());
    }
}
if (!function_exists('not_empty')) {
    function not_empty ($fields = []) {
        if (count($fields != 0)) {
            foreach ($fields as $field) {
                if (empty($_POST[$field]) || trim($_POST[$field]) == "") {
                    return false;
                }
            }
            return true;
        }
    }
}
if (!function_exists('is_already_in_use')) {
    function is_already_in_use($field, $value, $table) {
        $db = dbConnect();
        $q = $db->prepare("SELECT id from $table WHERE $field = ?");
        $q->execute([$value]);
        $count = $q->rowCount();
        $q->closeCursor();
        return $count;
    }
}
if (!function_exists('set_flash')) {
    function set_flash ($message, $type = 'info') {
        $_SESSION['notification']['message'] = $message;
        $_SESSION['notification']['type'] = $type;
    }
}

mon template flash.php

<?php if (isset($_SESSION['notifiaction']['message'])): ?>
<div class="alert alert-<?= $_SESSION['notification']['type'] ?>">
    <button type="button" class="close" data-dismiss="alert" aria-hidden="true">&times;</button>
    <?=
    $_SESSION['notification']['message'];
    //$_SESSION['notification'][''];
    ?>
</div>
<?php
endif;
?>

et la page qui gère les inscriptions:

<?php ob_start(); ?>
<main role="main" class="container">
    <div class="jumbotron col-sm-6">

        <?php
        include ('view/frontend/template/errors/errors_register.php');
        include ('view/frontend/template/flash.php');
        ?>

        <h1>Pas encore membre?</h1>
        <h2>Inscrivez vous maintenant!</h2>

        <P>

            <form method="post">
                <div class="form-group">
                    <label class="control-label" for="pseudo">Choisissez un pseudo:</label>
                    <input type="text" class="form-control" id="pseudo" name="pseudo" required="required"/>
                </div>

                <div class="form-group">
                    <label class="control-label" for="genre">Indiquez votre genre:</label>
                    <select class="form-control" name="genre" id="genre" required="required">
                        <option value=""></option>
                        <option value="homme">Je suis un homme</option>
                        <option value="femme">Je suis une femme</option>
                        <option value="couple">Nous sommes Un couple</option>
                    </select>
                </div>


            <div class="form-group">
                    <label class="control-label" for="email">Indiquez votre email:</label>
                    <input type="email" class="form-control" id="email" name="email" required="required"/>
                </div>

                <div class="form-group">
                    <label class="control-label" for="password">Choisissez un mot de passe:</label>
                    <input type="password" class="form-control" id="password" name="password" required="required"/>
                </div>
                <div class="form-group">
                    <label class="control-label" for="confirm">Confirmez votre mot de passe:</label>
                    <input type="text" class="form-control" id="confirm" name="confirm" required="required"/>
                </div>


            <input class="btn btn-primary" type="submit" name="register" value="Valider ces informations">




        </form>
        </P>


    </div>
</main>

<?php
$content = ob_get_clean();

require('template/accueil.php');

Création planning d'équipe à roulement

$
0
0

Bonjour,

Je dois établir un planning à roulement pour 5 équipes de travail sur 5 semaines et je ne vois pas comment aborder une partie du problème ...

J'explique :

Je sais ceci :

La première semaine de l'année, l'équipe n° 2 est dans le roulement 1
En sachant celà je peut déduire que :
L'équipe n° 1 est dans le roulement 5,
L'équipe n° 3 est dans le roulement 3,
L'équipe n° 4 est dans le roulement 4,
L'équipe n° 5 est dans le roulement 2

Ca c'est bon je gère. Mon soucis c'est comment faire pour savoir dans quel roulement se trouvent les équipes la semaine 34 par exmple ?

Le tout en PHP sous Laravel ...
Je n'arrive pas à trouver le raisonnement et surotut comment coder celà ... si une âme charitable à une idée à me donner : je prend !

En vous remerciant de m'avoir au moins lu ;-)

Aide sur téléchargement fichiers

$
0
0

Bonjour,

J'ai un soucis avec mon code, en effet, j'ai mit en place une gestion d'upload de fichiers qui fonctionne très bien en local dans le test mais qui une fois en ligne sur un serveur sous debian, celui ci ne fonctionne plus.

On visualise très bien les fichiers présents dans le dossier de stockage, mais on peut pas uploader un fichier, et je ne sais pas où c'est.

Voici mes deux fichiers (c'est du pu procédurale, ça sera améliorer par la suite, l'idée c'était de dev un espace de gestion pour avoir une base que j'améliorerais dans le temps.)

stockage.php

<?php
/*
Programme par : kiki67100
le mardi 27 novembre 2007
Mis à jour et modifié par Frez69 le 08/08/2019
*/

$i = null;
$dossier = (preg_match("@^(?:personal)@i", $d))?'./stockage/'.$user_pseudo.'/':'./stockage/';
$textFile = (preg_match("@^(?:personal)@i", $d))?'dans mon éspace':'dans l\'éspace familliale';
$urlretour = (preg_match("@^(?:personal)@i", $d))?'./index.php?d=personal&p=stockage':'./index.php?p=stockage';
// $dossier = './stockage/';
$nb_fichier = 0;

if(isset($dossier)&&!empty($dossier)&&file_exists($dossier)&&is_dir($dossier))/*Verifie la variable et bien un repertoire*/
{
    $rep=$dossier;
    $rep=str_replace("//","/",$rep);
    $handle = @opendir($rep);/* Ouvre le repertoire */
    if(!$handle)
      {
        Erreur('Erreur l\'ors de l\'ouverture de '.$rep.' !');
        exit;
    }
}
$action = isset($_GET['action'])?$_GET['action']:'';
switch ($action) {
/*uploader*/
    case "uploader":
        include ('uploadfile.php');
        break;
/*renommer*/
    case "renommer":
        include ('renamefile.php');
        break;
/*telecharger*/
    case "telecharger":
        include ('telechargerfile.php');
        break;
/*supprimer*/
    case "delet":
        include ('deletfile.php');
        break;
/*par défaut*/
    default:
?>
    <div class="mt-2"></div>
        <table class="table table-striped">
            <tbody>
<?php
ob_start();
    while ($f = readdir($handle)) { //Boucle qui enumere tout les fichier d'un repertoire
         // On incrémente le compteur de 1
        $lien=str_replace(" ",'%20',$f); /*Pour les espace fichier*/
        $replien=str_replace(" ",'%20',$rep);/*idem pour les dossier*/

        if(@is_dir($rep.'/'.$f)){ /*verifie si c'est un repertoire*/
            // echo '<a href="?dir='.$replien.'/'.$lien.'"><i class="   fas fa-folder-open"></i>'.$f.'</a><br />'; 
        }elseif(@is_file($rep.'/'.$f)){/*Verifie si c'est bien un fichier*/
            $nom=strrchr($f,'.');
            $extension=substr($nom,1);
            if($extension=="txt" || $extension=="doc" || $extension=="docx"|| $extension=="pdf")
            {
                $nb_fichier++;
                $fullurl = $replien.$f;
                $modal = '<a class="files viewPdf text-info" data-toggle="modal" data-target="#viewPdfModal" data-id="'.$fullurl.'" class="viewPdf" title="Apperçu"><i class="fas fa-search-plus"></i>';
                if ($extension=="txt"){
                    $ico = '<span class="fas fa-file-alt text-info"></span>';
                }
                if ($extension==="pdf"){
                    $ico = '<span class="fas fa-file-pdf text-danger"></span>';
                }
                if ($extension==="doc" || $extension=="docx"){
                    $ico = '<span class="fas fa-file-word text-primary"></span>';
                    $modal = '<i class="fas fa-search-plus text-muted"></i>';
                }
?>
                <tr>
                    <th scope="row"><i class=""><?= $ico.' '.$extension; ?></i></th>
                    <td><a><?= $f; ?><a></td>
                    <td><?= $modal; ?></td>
                    <td><a class="text-success" href="./index.php?p=stockage&action=telecharger&fichier=<?= $f; ?>" title="Télécharger"><i class="fas fa-download"></i></td>
                    <td><a class="files text-warning renameFile" data-toggle="modal" data-target="#renameFileModal" data-id="<?= $f ?>" title="Renommer"><i class="fas fa-edit"></i></a></td>
                    <td><a class="files text-danger deletFile" data-toggle="modal" data-target="#deletFileModal" data-id="<?= $f ?>" title="Supprimer"><i class="fas fa-trash"></i></a></td>
                </tr>
<?php
            } // fin if
        }
    } // fin while

    if ($nb_fichier===0){
?>
                <tr>
                    <th class="border-bottom-danger bg-gray-200 text-gray-700 text-center" scope="row">Aucun fichier <?= $textFile ?></th>
                </tr>
<?php
    }
    $content = ob_get_clean();
    if ($nb_fichier!=0){
        $s = ($nb_fichier>1)?'fichiers':'fichier';
?>
                <tr>
                    <th class="border-bottom-primary bg-gray-200 text-gray-700 text-center" colspan="6">Il y'a <?= $nb_fichier.' '.$s ?> <?= $textFile ?>.</th>
                </tr>
<?php
    }
    echo $content;
?>
            </tbody>
        </table>
<?php
    break;
}

uploadfile.php

<?php
function check_extension($ext,$ext_aut)
{
    if(in_array($ext,$ext_aut))
    {
        return true;
    }
}
if(!empty($_FILES))
{
    // $dossier=$dossier;
    $result_ext = '';
    $result_max = '';
    $result_valid = '';
    $result_upload = '';
    $redirect = false;
    if(is_array($_FILES)) 
    {
        foreach ($_FILES['fichier']['name'] as $name => $value) 
        {
            $valid_ext = false;
            $valid_max = false;
            $valid_valid = false;
            $file = $_FILES['fichier'];
            $fichier = explode(".", $_FILES['fichier']['name'][$name]);
            $fichier_name = basename(strtolower($_FILES['fichier']['name'][$name]));
            $ext = explode(".", strtolower($_FILES['fichier']['name'][$name]));

            $SourcePath = $_FILES['fichier']['tmp_name'][$name]; 
            $TargetPath = $dossier.$fichier_name;
            $extension_name = array('pdf','doc','docx','txt');

            $valid_ext .= (check_extension($ext[1],$extension_name)) ? true : false;
            $result_ext .= (!check_extension($ext[1],$extension_name)) ? '<p class="text-danger">L\'extention du fichier " <span class="font-weight-bold text-info">'.$fichier_name.'</span> " n\'est pas valide</p>' : '';

            $valid_max .= ($file['size']>900000) ? true : false;
            $result_max .= ($file['size']>900000) ? '' : '<p class="text-danger">Le fichier " <span class="font-weight-bold text-info">'.$fichier_name.'</span> " est trop gros</p>';

            $valid_valid .= ($file['error']>0) ?  true : false;
            $result_valid .= ($file['error']>0) ? '' : '<p class="text-danger">Le fichier " <span class="font-weight-bold text-info">'.$fichier_name.'</span> " n\'est pas valide</p>';
            var_dump($file['error']);
            // exit;   ( ! ) Notice: Undefined variable: nom in C:\wamp64\www\identifiants\content\uploadfile.php on line 53

            if($valid_ext && $valid_max && $valid_valid) 
            {
                if(move_uploaded_file($SourcePath, $TargetPath)){

                    $result_upload .= '<p>Le fichier " <span class="font-weight-bold text-info">'.$fichier_name.'</span> " est bien uploadé</p>';
                    $redirect = true;
                }
                else{
                    $result_upload .= '<p>Le fichier " <span class="font-weight-bold text-info">'.$fichier_name.'</span> " n\'a pas été uploadé</p>';
                    $redirect = false;
                }
            }
        }
    }
?>
            <div class="alert alert-info" role="alert">
                <h3 class="alert-heading">Resultat des téléchargements</h3>
                <?= $result_ext ?>
                <?= $result_max ?>
                <?= $result_valid ?>
                <?= $result_upload ?>
<?php
                if ($redirect){
?>
                <hr>
                <script type="text/javascript">
                    document.write('<p class="mb-0">Redirection automatique dans 3 secondes</p>');
                    window.setTimeout("location=('<?= $urlretour; ?>');",3000);
                </script>
                <noscript>
                    <p class="mb-0">
                        <a class="alert-link" class="text-light" href="<?= $urlretour; ?>">Revenir à la lite de mes fichiers.</a>
                    </p>
                </noscript>
<?php
                }
?>
            </div>
<?php
}

else{
?>
        <form action="" method="post" enctype="multipart/form-data">
            <div class="input-group">
                <div class="custom-file">
                    <input type="file" class="custom-file-input" id="inputGroupFile" name="fichier[]" multiple="multiple" required accept=".pdf,.doc,.docx,.txt" onchange="drop();"/>
                    <label class="custom-file-label" id="fileLabel" for="inputGroupFile">Sélectionner le(s) fichier(s)</label>
                </div>
                <div class="input-group-append">
                    <button type="submit" class="btn btn-primary btn-small">Télécharger</button>
                </div>
            </div>
        </form>
<?php
}
?>

Voila, je sais pas pourquoi en local cela fonctionne, alors qu'en ligne plus rien.

Merci à vous de votre aide.

Bien cordialement.

Viewing all 4861 articles
Browse latest View live