bonjour.
enlève toutes les ' qui ne servent à rien et un espace en la ( et le nom de la table
Bonjour à tous,
Je viens vers vous car après avoir retourné Internet sur le problème que je vais vous exposer, je n'ai pas trouver l'explication de ce non fonctionnement.
Je débute et je me suis mis dans l'idée d'écrire une application simple pour suivre les séries que je regardes (j'ai regardé et que je regarderai).
Pour faire simple, affichage dans un tableau du titre et du nombre d'épisode pour chacune des saisons disponibles et pour finir un lien vers la page allociné de cette série.
La page d'affichage fonctionne parfaitement (select en BDD)
J'ai réalisé une autre page pour ajouter de nouvelles séries et c'est là que ça coince
Ce que je veux
Que l'INSERT fonctionne correctement
Ce que j'obtiens
Fatal error: Uncaught PDOException: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ''tb_serie'('title', 'title_state', 's01_ep', 's01_state', 's02_ep', 's02_stat...' at line 1 in /var/www/html/serie/add_serie.php:54 Stack trace: #0 /var/www/html/serie/add_serie.php(54): PDO->prepare() #1 {main} thrown in /var/www/html/serie/add_serie.php on line 54
Je n'ai malheuresement pas réussi a trouver une explication me permettant de résoudre mon problème seul, mais avec votre aide ... j'imagine que l'on va trouver la solution ;)
Merci à vous
19 réponses
Merci Carouge10 pour ta réponse.
J'ai donc suivi ta préco j'ai donc supprimé les 'quotes' autour de la "table" et laissé un espace avant la parenthèse ( , j'ai supprimé les 'quotes' autour des variables mais j'ai toujours une erreur :
Parse error: syntax error, unexpected ':', expecting ')' in /var/www/html/serie/add_serie.php on line 57
voici la ligne 57:
$insert_sql->execute(array(:title=>$title, :title_state=>$title_state, :s01_ep=>$s01_ep, :s01_state=>$s01_state, :s02_ep=>$s02_ep,: s02_state=>$s02_state, :s03_ep=>$s03_ep, :s03_state=>$s03_state, :s04_ep=>$s04_ep, :s04_state=>$s04_state, :s05_ep=>$s05_ep, :s05_state=>$s05_state, :s06_ep=>$s06_ep, :s06_state=>$s06_state, :s07_ep=>$s07_ep, :s07_state=>$s07_state, :s08_ep=>$s08_ep, :s08_state=>$s08_state, :s09_ep=>$s09_ep, :s09_state=>$s09_state, :s10_ep=>$s10_ep, s10_state=>$s10_state, :s11_ep => $s11_ep, :s11_state => $s11_state, :s12_ep => $s12_ep, :s12_state => $s12_state, :s13_ep => $s13_ep, :s13_state => $s13_state, :s14_ep => $s14_ep, :s14_state => $s14_state, :s15_ep => $s15_ep, :s15_state => $s15_state, :s16_ep => $s16_ep, :s16_state => $s16_state, :s17_ep => $s17_ep, :s17_state => $s17_state, :s18_ep => $s18_ep, :s18_state=>$s18_state, :s19_ep=>$s19_ep, :s19_state=>$s19_state, :s20_ep=>$s20_ep, :s20_state=>$s20_state, :allocine=>$allocine));
}
je ne pensais pas que tu ferais aussi dans le execute ou la c'est nécessaire.
en revanche tous tes htmlspecialchars ne servent à rien.
il sert uniquement a l'affichage. ne pas contre faille Xss et injections sql
par contre je viens de penser à un truc. Si je veux mettre une serie avec plus de 20 saisons je fais comment ?
Je pense que la conception de la bdd n'est pas bonne. il te faudrait séparer la série des saisons dans 2 tables (au moins de ce que je vois)
et pas sympa de modifier ton 1er post a la suite de mes remarques car on perd tous le sens de la conversation
@Carouge10 : ok, je viens de vérifier* les sons de cloches et effectivement PDO suffit a se protéger pour les insert en BDD, htmlspecialchars est essentiellement utilisé pour l'affichage de variable. Noté
@quenti77 : J'ai fais avec mes compétences actuelles, c'est un premier projet comme on dit. Rien m'empéchera de le faire évoluer vers une v2...v3...v... avec plus ou moins de fonctions avancés (jointures de tables comme tu le proposes ou autres, ...)
@Carouge10 : Désolé, c'était pas le but recherché. J'essayé juste d'éviter de remettre dans chaque nouveau post l'ensemble du code amélioré et alourdir le topic.
*le but n'était pas de mettre en doute ton propos, mais pour moi de comprendre comment se protéger des insert. DOnc au final cela dépend de ce que nous voulons faire
En fait le soucis c'est que ça aurai du te choquer assez rapidement.
Quand tu commence à avoir X fois la même chose (comme la 20 fois le même input, 20 fois la colonne pour la même donnée, etc) c'est qu'il y a moyen de faire mieux.
Et en vrai regarde comment avoir plusieurs table car c'est dans les basiques de la manipulation de données avec SQL.
@quenti77 : On est d'accord, mais dans les fait je n'ai pas de série qui va au dela de 20 saisons, mon podium est tenu par Grey's Anatomy sinon, je suis largement en dessous. Mais j'ai bien compris le problème de la répétition x fois. Le problème dont tu parles est de la conception de l'appli, là je voudrais juste réussir a faire un simple insert dans la table et enfin avoir réussi a passer cette phase.
Merci pour les conseils
@Carouge10 : j'ai effectivement ajouté les quotes autour des marqueurs dans l'execute comme @quenti77 l'avait proposé dans son code (pastbin), je m'en suis donc inspiré et ça fonctionne. Je vais maintenant améliorer la requète pour prendre en compte les serie ayant moins de 20 saisons.
Merci à vous
avec plaisir
bon courage
Dans ces cas là je te laisse regarder ce code et me dire ce qui ne va pas dans TON code.
Car OK je suis d'accord avec le fait qu'il faut bien commencer par une V0 mais le soucis c'est que tu n'utilise même pas les bases (ou pas bien) de php, sql, etc.
Désolé si ça va être dur mais, si tu n'es pas là pour apprendre correctement (et comprendre aussi) alors ne commence pas. (Pour info ça m'a pris 20 minutes et encore j'ai du vérifier un truc sur les formulaires, pour faire un ajout potable)
du coup tu as résolu ton problème ?
Mon message n'est pas passé : voici le message : https://pastebin.com/fiyBVc67
Carouge10 : Mon problème est toujours d'actualité
quenti77 : Merci, j'ai copié ton code dans un coin, car je ne maitrise pas ton ce que tu as mis dedans donc je le reprendrai a tête reposé.
tu peux reposter ton code ? (juste la partie qui fait l'instertion avec le message d'erreur)
je vois qu'il y a $_POST['titre'] dans le if et ensuite $_POST['title']... le 1er est faux car je ne le vois pas dans le formulaire
Erreur:
Parse error: syntax error, unexpected ':', expecting ')' in /var/www/html/serie/add_serie.php on line 57
//création de la requête
$insert_sql = $conn->prepare("INSERT INTO tb_serie (title, title_state, s01_ep, s01_state, s02_ep, s02_state, s03_ep, s03_state, s04_ep, s04_state, s05_ep, s05_state, s06_ep, s06_state, s07_ep, s07_state, s08_ep, s08_state, s09_ep, s09_state, s10_ep, s10_state, s11_ep, s11_state, s12_ep, s12_state, s13_ep, s13_state, s14_ep, s14_state, s15_ep, s15_state, s16_ep, s16_state, s17_ep, s17_state, s18_ep, s18_state, s19_ep, s19_state, s20_ep, s20_state, allocine)
VALUES (:title, :title_state, :s01_ep, :s01_state, :s02_ep, :s02_state, :s03_ep, :s03_state, :s04_ep, :s04_state, :s05_ep, :s05_state, :s06_ep, :s06_state, :s07_ep, :s07_state, :s08_ep, :s08_state, :s09_ep, :s09_state, :s10_ep, :s10_state, :s11_ep, :s11_state, :s12_ep, :s12_state, :s13_ep, :s13_state, :s14_ep, :s14_state, :s15_ep, :s15_state, :s16_ep, :s16_state, :s17_ep, :s17_state, :s18_ep, :s18_state, :s19_ep, :s19_state, :s20_ep, :s20_state, :allocine)");
$insert_sql->execute(array(:title => $title, :title_state => $title_state, :s01_ep => $s01_ep, :s01_state => $s01_state, :s02_ep => $s02_ep, :s02_state => $s02_state, :s03_ep => $s03_ep, :s03_state => $s03_state, :s04_ep => $s04_ep, :s04_state => $s04_state, :s05_ep => $s05_ep, :s05_state => $s05_state, :s06_ep => $s06_ep, :s06_state => $s06_state, :s07_ep => $s07_ep, :s07_state => $s07_state, :s08_ep => $s08_ep, :s08_state => $s08_state, :s09_ep => $s09_ep, :s09_state => $s09_state, :s10_ep => $s10_ep, :s10_state => $s10_state, :s11_ep => $s11_ep, :s11_state => $s11_state, :s12_ep => $s12_ep, :s12_state => $s12_state, :s13_ep => $s13_ep, :s13_state => $s13_state, :s14_ep => $s14_ep, :s14_state => $s14_state, :s15_ep => $s15_ep, :s15_state => $s15_state, :s16_ep => $s16_ep, :s16_state => $s16_state, :s17_ep => $s17_ep, :s17_state => $s17_state, :s18_ep => $s18_ep, :s18_state => $s18_state, :s19_ep => $s19_ep, :s19_state => $s19_state, :s20_ep => $s20_ep, :s20_state => $s20_state, :allocine => $allocine));
}
la ligne 57 correspond à l'execute mais j'ai quand même ajouter le prepare au cas ou
PS : J'ai corrigé la variable $POST['titre''] en $POST['title'']
En même temps quand il t'a dis d'enlever les apostrophe c'était dans la requête pas le execute :D
Je fais exprès de mettre en multiligne pour bien montrer le problème de la répétition
Le code fonctionne en remplaçant la fonction "array" par les "[ ]", merci à vous deux.
Sinon, j'ai juste a résoudre un autre problème masi de conception cette fois, c'est que le code attend une valeur pour chacune des variables et donc quand j'ai moins de 20 saisons il n'aime pas que je laisse vide certains champs. Mais sinon c'est fonctionnel.
mouais j'ai un doute. il manque les ' autour des marqueurs dans le execute.
il va falloir construire ta requête en fonction des valeurs que tu as. et mettre une valeur par défaut à ceux que tu n'as pas.
c'est une solution pour ne pas passer par une table intermédiaire comme dit plus