Bonjour,

J'ai suivis récemment le tuto sur le rooter php avec Altorouter.
Tous fonctionne parfaitement, sauf quand j'essais d'écrire dans ma base de données mysql.

sur mon blog, j'ai une page permettant d'écrire un nouvel article (new.php). Mon traitement s'effectue dans le fichier new_post.php.
lorsque je valide le formulaire, je suis bien redirigé vers la page de traitement, mais avec cette erreur :

Notice: Trying to access array offset on value of type bool in P:\sites\projet-astuces-informatique\v2\public\index.php on line 17

Notice: Trying to access array offset on value of type bool in P:\sites\projet-astuces-informatique\v2\public\index.php on line 20

Notice: Trying to access array offset on value of type bool in P:\sites\projet-astuces-informatique\v2\public\index.php on line 21

Warning: require(../templates/.php): failed to open stream: No such file or directory in P:\sites\projet-astuces-informatique\v2\public\index.php on line 21

Fatal error: require(): Failed opening required '../templates/.php' (include_path='.;C:\php\pear') in P:\sites\projet-astuces-informatique\v2\public\index.php on line 21

Donc, rien n'est enregistré en bdd.
Mais si j'accède directement à new_post.php sans remplir le formulaire, aucune erreur et l'enregistrement en bdd est fait, avec aucune données, mais l'entrée est créée.
j'ai essayé de supprimer le router, et là, tous fonctionne parfaitement ! Donc le blem' vient de altorouter, mais impossible de savoir où.

J'espère avoir été clair, n'hésitez pas si besoin de plus de précision
Merci de votre aide,
anttondev

Les codes

public/index.php (le router)

<?php
    require '../vendor/autoload.php';
    $uri = $_SERVER['REQUEST_URI'];
    $router = new AltoRouter();

    // Définition des routes
    $router->map('GET', '/', 'home', 'home');
    $router->map('GET', '/blog', 'blog/list', 'list');
    $router->map('GET', '/blog/[i:id]-[*:slug]', 'blog/view', 'view');
    $router->map('GET', '/blog/new', 'blog/new', 'new');
    $router->map('GET', '/blog/new_post', 'blog/new_post', 'new_post');

    $match = $router->match();
    if ($match !== null) {
        require '../layouts/header.php';

        if(is_callable($match['target'])) {
            call_user_func_array($match['target'], $match['params']);
        } else {
            $params = $match['params'];
            require "../templates/{$match['target']}.php";
        }

        require '../layouts/footer.php';
    }
?>

templates/blog/new.php (création d'un article)

<!-- New article -->

<h1>Nouveau</h1>
<form action="new_post" method="post">
    <input type="text" name="title" placeholder="Titre de l'article">
    <input type="text" style="width:400px;" name="author" placeholder="Auteur de l'article">
     <textarea name="body" rows="30" placeholder="Corps de l'article"></textarea>
        <button type="submit">Créer l'article</button>
</form>

templates/blog/new_post.php (traitement de l'article)

<?php
    // ! functions
    function slugify($string, $delimiter = '-') {
        $oldLocale = setlocale(LC_ALL, '0');
        setlocale(LC_ALL, 'en_US.UTF-8');
        $clean = iconv('UTF-8', 'ASCII//TRANSLIT', $string);
        $clean = preg_replace("/[^a-zA-Z0-9\/_|+ -]/", '', $clean);
        $clean = strtolower($clean);
        $clean = preg_replace("/[\/_|+ -]+/", $delimiter, $clean);
        $clean = trim($clean, $delimiter);
        setlocale(LC_ALL, $oldLocale);
        return $clean;
    }
?>

<?php
    try {
        $db = new PDO('mysql:host=localhost;dbname=projet-astuces-informatique', 'confidentiel', 'confidentiel');
    } catch (Exception $e) {
        die('Erreur : ' . $e->getMessage());
    }

    $title = htmlspecialchars($_POST['title']);
    $author = htmlspecialchars($_POST['author']); // ! provisoire
    $body = htmlspecialchars($_POST['body']);
    $slug = slugify($title, '-');

    $query = $db->prepare('INSERT INTO articles(title, author, slug, body, date_creation) VALUES(:title, :author, :slug, :body, NOW())');
    $query->execute(array(
        'title'  => $title,
        'author' => $author,
        'slug' => $slug,
        'body' => $body
    ));
?>

4 réponses


Bonsoir,
Un var_dump($match); pour voir ce qu'il contient avant le if
Ensuite pas de htmlspecialchars pour les données entrée en BDD, cela sert uniquement pour l'affichage

Merci de ta réponse !
voici ce que m'indique le var_dump :

array(3) { ["target"]=> string(8) "blog/new" ["params"]=> array(0) { } ["name"]=> string(3) "new" }

pour le htmlspecialchars, c'est noté, merci !

Personne n'a de solution ?

Bonjour,

L'utilsiation d'acollades dans le require "require "../templates/{$match['target']}.php"; ne me parrait pas du appropiée.

C'est surement ça qui provoque les erreurs "Warning: require(../templates/.php): failed to open stream: No such file or directory in P:\sites\projet-astuces-informatique\v2\public\index.php on line 21
Fatal error: require(): Failed opening required '../templates/.php' (include_path='.;C:\php\pear') in P:\sites\projet-astuces-informatique\v2\public\index.php on line 21"

Il vaudrait mieux concatener avec des points.

Au passage il y a autre chose qui me choque : le fait que le nom de la table soit collé à la liste des champs dans le INSERT INTO.