Je suis un jeune débutant, et je rencontre quelques soucis.
Je viens de finir mon site mail envoyé avec inscription doit rediriger l'utilisateur sur une page de remerciement. Le mail part mais la page n'est pas redirigé avec mon header location.
Merci de colorer votre code à l'aide du bouton Code
Les forums d'Openclassrooms disposent d'une fonctionnalité permettant de colorer et mettre en forme les codes source afin de les rendre plus lisibles et faciles à manipuler par les intervenants. Pour cela, il faut utiliser le bouton de l'éditeur, choisir un des langages proposés et coller votre code dans la zone prévue. Si vous utilisez l'éditeur de messages en mode Markdown, il faut utiliser les balises <pre class="brush: php;">Votre code ici</pre>.
Merci de modifier votre message d'origine en fonction.
Manque de recherche
La question que vous posez est très fréquente, cela démontre un manque de recherche évident. Internet et ce forum fourmillent de ressources répondant à votre besoin.
Je vous invite à effectuer de vraies recherches qui sont à la base d'un bon apprentissage…
Pas d'aide concernant le code par MP, le forum est là pour ça :)
déjà, tu fais un test pour savoir si tes variables existes (ligne 29) après les avoir récupérer (ligne 3 & Cie ), c'est l'inverse à faire
ensuite, pas de htmlspecialchars sur les données entrée en BDD (cf signature)
après, relis le cours sur la préparation d'une requête car elle ne l'est pas (il n'y pas de marqueur)
sans oublier c'est la fonction "header" et non "Header"
tu passes de "$header" à "$headers" ligne 52 et 53. du coup tu vas avoir 2 fois "From" après correction, donc la ligne 49 est inutile
ton "if" n'a pas l'air d'être fermer. Regarde comment on "indente" un code, c'est plus facile à lire et a debugger
Merci j'ai corrigé les petitds détails que tu viens d’énumérer. Ma requête fonctionne correctement les champs sont mis à jour dans la BDD et le formulaire. Mais la redirection ne marche pas..
Il faut tout de même dire que PHP/PDO n'est tout de même pas très bien foutu : sur sa requête préparée, mal utilisée donc, il fait des binds sauf que sa requête n'a aucun marqueur mais PDO n'émet aucune erreur pour autant. Personnellement, je m'attendrais au contraire d'autant que quand rien que le nombre de marqueurs figurant dans la requête et bindés ne correspond pas on obtient habituellement une SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens.
Or il semblerait (je ne sais pas s'il a activé les erreurs PDO/SQL mais ce n'est pas la première fois que je le remarque) que dans le cas où PDO ne trouve aucun (0) marqueur dans la requête il ignore totalement ce que l'on a bien pu binder au lieu de vérifier qu'il y a bien 0 binds. feature ? bug ?
Si je trouve le temps, je testerais pour confirmer (ou infirmer) cela voire creuser la question.
EDIT : il y a définitivement un bug :
pour PostgreSQL sans émulation (off, par défaut), l'excès de binds est détecté par PostgreSQL à l'exécution de la requête
pour PostgreSQL avec émulation forcée : ce même excès est totalement ignoré, ma requête préparée est exécutée avec succès
pour MySQL avec l'émulation (on, par défaut), idem, l'excédent est ignoré, la requête est exécutée normalement
en revanche, toujours pour MySQL mais sans émulation, ça devient bizarre : aucune erreur n'est reportée mais c'est comme si ma requête ne renvoyait rien
Ca devient encore plus étrange si au lieu de faire le bind de mon paramètre qui n'existe pas dans la requête par bindValue au lieu d'execute, le résultat de la requête est bon cette fois (et ce paramètre superflu est toujours silencieusement ignoré)
Pour l'émulation qui ne détecte pas ces binds superflus, je pense que :
if (!placeholders) {
/* nothing to do; good! */
return 0;
}
est fait trop tôt, même si aucun marqueur n'a été trouvé dans la requête préparée, il faudrait tout de même contrôler le nombre de binds pour s'assurer qu'il vaut également 0 (bindno != zend_hash_num_elements(params)).
Quant au bug MySQL sans émulation pour trop de binds, il s'avère finalement que ce n'est pas un bug : j'ai fait l'erreur de ne pas regarder ce que retournait PDOStatement::execute et de croire que j'aurais une erreur/exception suivant le mode d'erreur de PDO or il s'avère que PDOStatement::execute peut planter en retournant simplement FALSE sans aucune erreur/exception ! Sans émulation, c'est la fonction static int pdo_mysql_stmt_param_hook(pdo_stmt_t *stmt, struct pdo_bound_param_data *param, enum pdo_param_event event_type) qui est exécutée pour gérer les binds (potentiellement) à différents moments. On y trouve bien un test pour vérifier qu'on ne cherche pas à binder plus de paramètres et si c'est le cas retourne 0 :
if (!really_register_bound_param(&param, stmt, 1)) {
if (!Z_ISUNDEF(param.parameter)) {
zval_ptr_dtor(&param.parameter);
}
RETURN_FALSE;
}
Où en fait, PDOStatement::execute ne fait que renvoyer FALSE. Pour faire remonter l'erreur, noter qu'en plus le code de départ avait bien défini une erreur SQL HY093 mais il manque(rait) un appel à la macro PDO_HANDLE_STMT_ERR(); avant RETURN_FALSE;.
TL;DR/conclusion : méfiez-vous, vos requêtes préparées peuvent planter sans pour autant obtenir la moindre erreur ou exception. Et que ça manque totalement de cohérence (bon, je sais bien, ce n'est pas forcément évident dans le cas de PDO d'obtenir le même comportement pour tous les SGBD) : il est possible, même pour les erreurs, que suivant le SGBD/pilote, qu'il y ait émulation ou non, que le résultat obtenu puisse être totalement différent.
Comment sais-tu que la redirection ne fonctionne pas ? Tu as fait un echo + exit dans le script cible pour en être sûr ?
Oui, j'ai fait un echo + exit dans le script et ça marche, mais quand je fais le header location, ça ne redirige pas.
Si tu as un exemplaire, envoi moi je vais carrément le mettre en place. Je galère depuis 2 jours sur ça..
- Edité par FredDuss 16 octobre 2020 à 15:53:52
Probleme avec Header Location - Redirection
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Pas d'aide concernant le code par MP, le forum est là pour ça :)
Activer les erreurs PDO / (julp) htmlspecialchars / FAQ PHP / Pas d'aide par MP
Activer les erreurs PDO / (julp) htmlspecialchars / FAQ PHP / Pas d'aide par MP
Pas d'aide concernant le code par MP, le forum est là pour ça :)
Activer les erreurs PDO / (julp) htmlspecialchars / FAQ PHP / Pas d'aide par MP
Activer les erreurs PDO / (julp) htmlspecialchars / FAQ PHP / Pas d'aide par MP
Keep It Simple Stupid - SF4 conf Swift - Cours 1/4 SF4 - Exceptions PDO - Formes Normales
Activer les erreurs PDO / (julp) htmlspecialchars / FAQ PHP / Pas d'aide par MP
julp.fr ~ PHP < 8.0.0 : activer les erreurs PDO/SQL ~ PHP < 8.1.0 : activer les erreurs mysqli