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

[config_pdo.inc.php]
<?php

$servername = 'localhost';
$dbname = 'db_serie';
$username = 'username';
$password = 'password';

//On essaie de se connecter
try
{
    $conn = new PDO("mysql:host=$servername;dbname=$dbname;charset=utf8", "$username", "$password");
    //On définit le mode d'erreur de PDO sur Exception
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $conn->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
}
catch (PDOException $e)
{
    die('Erreur : '. $e->getMessage());
}
?>
-----------------------------------------------------------------------------------------
[add_serie.php]

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

if (isset($_POST['send']))
    {
    if (isset($_POST['titre']) AND isset($_POST['s01_ep']) AND isset($_POST['allocine']))
        {
        $title = htmlspecialchars($_POST['title']);
        $title_state = htmlspecialchars($_POST['title_state']);
        $s01_ep = htmlspecialchars($_POST['s01_ep']);
        $s01_state = htmlspecialchars($_POST['s01_state']);
        $s02_ep = htmlspecialchars($_POST['s02_ep']);
        $s02_state = htmlspecialchars($_POST['s02_state']);
        $s03_ep = htmlspecialchars($_POST['s03_ep']);
        $s03_state = htmlspecialchars($_POST['s03_state']);
        $s04_ep = htmlspecialchars($_POST['s04_ep']);
        $s04_state = htmlspecialchars($_POST['s04_state']);
        $s05_ep = htmlspecialchars($_POST['s05_ep']);
        $s05_state = htmlspecialchars($_POST['s05_state']);
        $s06_ep = htmlspecialchars($_POST['s06_ep']);
        $s06_state = htmlspecialchars($_POST['s06_state']);
        $s07_ep = htmlspecialchars($_POST['s07_ep']);
        $s07_state = htmlspecialchars($_POST['s07_state']);
        $s08_ep = htmlspecialchars($_POST['s08_ep']);
        $s08_state = htmlspecialchars($_POST['s08_state']);
        $s09_ep = htmlspecialchars($_POST['s09_ep']);
        $s09_state = htmlspecialchars($_POST['s09_state']);
        $s10_ep = htmlspecialchars($_POST['s10_ep']);
        $s10_state = htmlspecialchars($_POST['s10_state']);
        $s11_ep = htmlspecialchars($_POST['s11_ep']);
        $s11_state = htmlspecialchars($_POST['s11_state']);
        $s12_ep = htmlspecialchars($_POST['s12_ep']);
        $s12_state = htmlspecialchars($_POST['s12_state']);
        $s13_ep = htmlspecialchars($_POST['s13_ep']);
        $s13_state = htmlspecialchars($_POST['s13_state']);
        $s14_ep = htmlspecialchars($_POST['s14_ep']);
        $s14_state = htmlspecialchars($_POST['s14_state']);
        $s15_ep = htmlspecialchars($_POST['s15_ep']);
        $s15_state = htmlspecialchars($_POST['s15_state']);
        $s16_ep = htmlspecialchars($_POST['s16_ep']);
        $s16_state = htmlspecialchars($_POST['s16_state']);
        $s17_ep = htmlspecialchars($_POST['s17_ep']);
        $s17_state = htmlspecialchars($_POST['s17_state']);
        $s18_ep = htmlspecialchars($_POST['s18_ep']);
        $s18_state = htmlspecialchars($_POST['s18_state']);
        $s19_ep = htmlspecialchars($_POST['s19_ep']);
        $s19_state = htmlspecialchars($_POST['s19_state']);
        $s20_ep = htmlspecialchars($_POST['s20_ep']);
        $s20_state = htmlspecialchars($_POST['s20_state']);
        $allocine = htmlspecialchars($_POST['allocine']);
        }

        //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));

    }    
//fermeture de la connection SQL
$conn = null;
?>

<!doctype html>
<html lang="fr">
    <head>
        <meta charset="utf-8">
        <link href="./css/style.css" rel="stylesheet" type="text/css" />
        <title>Ajout d'une série</title>
    </head>
    <body>
        <header id="header">
            <h1>Ajouter une série</h1>
        </header>
        <section id="main">
            <br />
            <form action="" method="post">
                <table>
                    <tr>
                        <td class="">Titre* :</td><td class="saisie"><input type="text" name="title" size="35" maxlength="40" /></td><td><select name="title_state" id="title_state"><option value="open">Ouvert</option><option value="closed">Fermer</option></select></td>
                    </tr>
                    <tr>
                        <td class="">Saison 01 :</td><td class="saisie"><input type="text" name="s01_ep" size="2" maxlength="2" /></td><td><select name="s01_state" id="s01_state"><option value="voir">A voir</option><option value="vu">Vu</option><option value="closed">Fermer</option></select></td>
                    </tr>
                    <tr>
                        <td class="">Saison 02 :</td><td class="saisie"><input type="text" name="s02_ep" size="2" maxlength="2" /></td><td><select name="s02_state" id="s02_state"><option value="voir">A voir</option><option value="vu">Vu</option><option value="closed">Fermer</option></select></td>
                    </tr>
                    <tr>
                        <td class="">Saison 03 :</td><td class="saisie"><input type="text" name="s03_ep" size="2" maxlength="2" /></td><td><select name="s03_state" id="s03_state"><option value="voir">A voir</option><option value="vu">Vu</option><option value="closed">Fermer</option></select></td>
                    </tr>
                    <tr>
                        <td class="">Saison 04 :</td><td class="saisie"><input type="text" name="s04_ep" size="2" maxlength="2" /></td><td><select name="s04_state" id="s04_state"><option value="voir">A voir</option><option value="vu">Vu</option><option value="closed">Fermer</option></select></td>
                    </tr>
                    <tr>
                        <td class="">Saison 05 :</td><td class="saisie"><input type="text" name="s05_ep" size="2" maxlength="2" /></td><td><select name="s05_state" id="s05_state"><option value="voir">A voir</option><option value="vu">Vu</option><option value="closed">Fermer</option></select></td>
                    </tr>
                    <tr>
                        <td class="">Saison 06 :</td><td class="saisie"><input type="text" name="s06_ep" size="2" maxlength="2" /></td><td><select name="s06_state" id="s06_state"><option value="voir">A voir</option><option value="vu">Vu</option><option value="closed">Fermer</option></select></td>
                    </tr>
                    <tr>
                        <td class="">Saison 07 :</td><td class="saisie"><input type="text" name="s07_ep" size="2" maxlength="2" /></td><td><select name="s07_state" id="s07_state"><option value="voir">A voir</option><option value="vu">Vu</option><option value="closed">Fermer</option></select></td>
                    </tr>
                    <tr>
                        <td class="">Saison 08 :</td><td class="saisie"><input type="text" name="s08_ep" size="2" maxlength="2" /></td><td><select name="s08_state" id="s08_state"><option value="voir">A voir</option><option value="vu">Vu</option><option value="closed">Fermer</option></select></td>
                    </tr>
                    <tr>
                        <td class="">Saison 09 :</td><td class="saisie"><input type="text" name="s09_ep" size="2" maxlength="2" /></td><td><select name="s09_state" id="s09_state"><option value="voir">A voir</option><option value="vu">Vu</option><option value="closed">Fermer</option></select></td>
                    </tr>
                    <tr>
                        <td class="">Saison 10 :</td><td class="saisie"><input type="text" name="s10_ep" size="2" maxlength="2" /></td><td><select name="s10_state" id="s10_state"><option value="voir">A voir</option><option value="vu">Vu</option><option value="closed">Fermer</option></select></td>
                    </tr>
                    <tr>
                        <td class="">Saison 11 :</td><td class="saisie"><input type="text" name="s11_ep" size="2" maxlength="2" /></td><td><select name="s11_state" id="s11_state"><option value="voir">A voir</option><option value="vu">Vu</option><option value="closed">Fermer</option></select></td>                   
                    </tr>
                    <tr>
                        <td class="">Saison 12 :</td><td class="saisie"><input type="text" name="s12_ep" size="2" maxlength="2" /></td><td><select name="s12_state" id="s12_state"><option value="voir">A voir</option><option value="vu">Vu</option><option value="closed">Fermer</option></select></td>
                    </tr>
                    <tr>
                        <td class="">Saison 13 :</td><td class="saisie"><input type="text" name="s13_ep" size="2" maxlength="2" /></td><td><select name="s13_state" id="s13_state"><option value="voir">A voir</option><option value="vu">Vu</option><option value="closed">Fermer</option></select></td>
                    </tr>
                    <tr>
                        <td class="">Saison 14 :</td><td class="saisie"><input type="text" name="s14_ep" size="2" maxlength="2" /></td><td><select name="s14_state" id="s14_state"><option value="voir">A voir</option><option value="vu">Vu</option><option value="closed">Fermer</option></select></td>
                    </tr>
                    <tr>
                        <td class="">Saison 15 :</td><td class="saisie"><input type="text" name="s15_ep" size="2" maxlength="2" /></td><td><select name="s15_state" id="s15_state"><option value="voir">A voir</option><option value="vu">Vu</option><option value="closed">Fermer</option></select></td>
                    </tr>
                    <tr>
                        <td class="">Saison 16 :</td><td class="saisie"><input type="text" name="s16_ep" size="2" maxlength="2" /></td><td><select name="s16_state" id="s16_state"><option value="voir">A voir</option><option value="vu">Vu</option><option value="closed">Fermer</option></select></td>
                    </tr>
                    <tr>
                        <td class="">Saison 17 :</td><td class="saisie"><input type="text" name="s17_ep" size="2" maxlength="2" /></td><td><select name="s17_state" id="s17_state"><option value="voir">A voir</option><option value="vu">Vu</option><option value="closed">Fermer</option></select></td>
                    </tr>
                    <tr>
                        <td class="">Saison 18 :</td><td class="saisie"><input type="text" name="s18_ep" size="2" maxlength="2" /></td><td><select name="s18_state" id="s18_state"><option value="voir">A voir</option><option value="vu">Vu</option><option value="closed">Fermer</option></select></td>
                    </tr>
                    <tr>
                        <td class="">Saison 19 :</td><td class="saisie"><input type="text" name="s19_ep" size="2" maxlength="2" /></td><td><select name="s19_state" id="s19_state"><option value="voir">A voir</option><option value="vu">Vu</option><option value="closed">Fermer</option></select></td>
                    </tr>
                    <tr>
                        <td class="">Saison 20 :</td><td class="saisie"><input type="text" name="s20_ep" size="2" maxlength="2" /></td><td><select name="s20_state" id="s20_state"><option value="voir">A voir</option><option value="vu">Vu</option><option value="closed">Fermer</option></select></td>
                    </tr>
                    <tr>
                        <td class="">Lien Allociné:</td><td class="saisie"><input type="text" name="allocine" size="70" maxlength="70" /></td><td></td>
                    </tr>
                    <tr>
                        <td><input type="submit" name="send" value="Ajouter" /></td>
                    </tr>
                </table>
            </form>
            <br />
        </section>
        <?php
            require './inc/footer.php';
        ?>
    </body>
</html>

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

18 réponses


quenti77
Réponse acceptée

En même temps quand il t'a dis d'enlever les apostrophe c'était dans la requête pas le execute :D

// [] plutôt que array
$insert_sql->execute([
    ':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 fais exprès de mettre en multiligne pour bien montrer le problème de la répétition

bonjour.
enlève toutes les ' qui ne servent à rien et un espace en la ( et le nom de la table

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

Dans ces cas là je te laisse regarder ce code et me dire ce qui ne va pas dans TON code.

<?php

// database/connection.php

const DB_HOST = 'localhost';
const DB_NAME = 'db_series';
const DB_USER = 'root';
const DB_PASSWORD = 'root';

// Pas besoin de mettre un try catch ici
$dbConnection = new PDO(sprintf('mysql:host=%s;dbname=%s', DB_HOST, DB_NAME), DB_USER, DB_PASSWORD);
$dbConnection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$dbConnection->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);

// form_add_series.php
// Je sépare le traitement du formulaire de la vue du formulaire

$nbSeasons = $_GET['nb'] ?? null;

require __DIR__ . '/database/connection.php';
?>
<!-- Je ne mets pas tous le code HTML ici -->
<?php if ($nbSeasons === null): ?>
    <form action="form_add_series.php" method="get">
        <label for="nb">Nombre de saisons</label>
        <input type="number" name="nb" id="nb">
        <button type="submit">Valider</button>
    </form>
<?php else: ?>
    <form action="add_series.php">
        <label for="name">Nom de la série</label>
        <input type="text" name="name" id="name">
        <label for="description">Description</label>
        <textarea name="description" id="description"></textarea>
        <?php for ($i = 1; $i <= $nbSeasons; $i++): ?>
            <p>
                <label for="season-<?= $i ?>">Saison <?= $i ?></label>
                <input type="text" name="seasons[<?= $i ?>][name]" id="season-<?= $i ?>"><br>
                <label for="season-<?= $i ?>">Status <?= $i ?></label>
                <input type="text" name="seasons[<?= $i ?>][state]" id="season-<?= $i ?>">
            </p>
        <?php endfor; ?>
        <button type="submit">Valider</button>
    </form>
<?php endif; ?>
<?php

// add_series.php
require __DIR__ . '/database/connection.php';

if ($_SERVER['REQUEST_METHOD'] !== 'POST' || empty($_POST)) {
    header('Location: /', true, 302);
    exit();
}

$name = $_POST['name'] ?? null;
$description = $_POST['description'] ?? null;
$seasons = $_POST['seasons'] ?? [];

$errors = [];

if ($name === null || $description === null || empty($seasons)) {
    $errors[] = 'Il faut remplir les champs obligatoires';
}

if (count($errors) > 0) {
    header('Location: form_add_series.php', true, 302);
    exit();
}

$reqSerie = $dbConnection->prepare('SELECT id FROM series WHERE name = :name');
$reqSerie->execute(['name' => $name]);
$serie = $reqSerie->fetch();

if ($serie === false) {
    $reqSerie = $dbConnection->prepare('INSERT INTO series (name, description) VALUES (:name, :description)');
    $reqSerie->execute(['name' => $name, 'description' => $description]);
    $serieId = $dbConnection->lastInsertId();
} else {
    $serieId = $serie['id'];
}

$reqSeason = $dbConnection->prepare('INSERT INTO seasons (series_id, name, state) VALUES (:series_id, :name, :state)');

foreach ($seasons as $season) {
    $reqSeason->execute([
        'series_id' => $serieId,
        'name' => $season['name'],
        'state' => $season['state'],
    ]);
}

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'']

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

@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