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
<?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';
}
?>
<!-- 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>
<?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
));
?>
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 !
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.