[PDO] Valeur par défaut

Ce sujet est résolu
138237
,

Bonjour,

Voila je rencontre un petit problème avec mon code.

Ce que je fais

J'ai créé un formulaire de contact, qui enregistre les messages envoyés dans une table sur phpmyadmin.

Le code du formulaire :

<div class="row" id="Contact"> 
      <div class="container">
            <h2 class="center">Contact :</h2>

            <?php
                if(isset($_POST['submit'])){
                    $name = htmlspecialchars(trim($_POST['name']));
                    $email = htmlspecialchars(trim($_POST['email']));
                    $email_again = htmlspecialchars(trim($_POST['email_again']));
                    $object = htmlspecialchars(trim($_POST['object']));
                    $message = htmlspecialchars(trim($_POST['message']));
                    $errors = [];
                    $success = [];

                    if(empty($name) || empty($email) || empty($object) || empty($message)){
                        $errors['empty'] = "Veuillez remplir tous les champs.";
                    }else{
                        if(!filter_var($email, FILTER_VALIDATE_EMAIL)){
                            $errors['email'] = "L'adresse email n'est pas valide.";
                        }
                    }

                    if($email != $email_again){
                        $errors['different'] = "Les adresses email ne correspondent pas.";
                    }

                    if(!empty($errors)){
                        ?>
                            <div class="card red">
                                <div class="card-content white-text">
                                    <?php
                                        foreach($errors as $error){
                                            echo $error."<br/>";
                                        }
                                    ?>
                                </div>
                            </div>
                        <?php
                    }else{
                        message($name,$email,$object,$message);

                        ?>
                            <div class="card green">
                                <div class="card-content white-text">
                                    <p>Votre message a bien été envoyé, nous vous répondrons d'ici 48h.</p>
                                </div>
                            </div>
                        <?php
                    }


                }

            ?>

            <form method="post">
                <div class="row">
                    <div class="input-field col s12">
                        <input type="text" name="name" id="name"/>
                        <label for="name">Nom</label>
                    </div>
                    <div class="input-field col s12 m6">
                        <input type="email" name="email" id="email"/>
                        <label for="email">Adresse email</label>
                    </div>
                    <div class="input-field col s12 m6">
                        <input type="email" name="email_again" id="email_again"/>
                        <label for="email_again">Répéter l'adresse email</label>
                    </div>
                    <div class="input-field col s12">
                        <input type="text" name="object" id="object"/>
                        <label for="object">Objet</label>
                    </div>
                    <div class="input-field col s12">
                        <textarea name="message" id="message" class="materialize-textarea"></textarea>
                        <label for="message">Message</label>
                    </div>

                    <div class="col s12">
                        <button type="submit" name="submit" class="btn waves-effect">
                            Envoyer
                        </button>
                    </div>
                </div>
            </form>
    </div>
</div>

Code regroupant la fonction nécessaire au fonctionnement du formulaire :

<?php 

function message($name,$email,$message){

    global $db;

    $object = htmlspecialchars(trim($_POST['object']));
    $message = htmlspecialchars(trim($_POST['message']));

    $c = array(
        'name'          => $name,
        'email'         => $email,
        'object'        => $object,
        'message'       => $message,
        'message_id'    => isset($_GET['id']) ? $_GET['id'] : ''
    );

    $sql = "INSERT INTO messages(name,email,object,message,message_id) VALUES(:name, :email, :object, :message, :message_id)";
    $req = $db->prepare($sql);
    $req->execute($c);

    $subject = 'Nouveau message de "'.$name.'" ';
            $message_user = '
                <html lang="en" style="font-family: sans-serif;">
                    <head>
                        <meta charset="UTF-8">
                    </head>
                    <body>
                        Vous avez un nouveau message de "'.$name.'"</a>:
                        <br/><br/>Objet: '.$object.'
                        <br/><br/>Message: '.$message.'
                        <br/><br/>Si vous souhaitez répondre à ce message de "'.$name.'", répondez à '.$email.'.
                    </body>
                </html>
            ';

            $header = "MIME-Version: 1.0\r\n";
            $header .= "Content-type: text/html; charset=UTF-8\r\n";
            $header .= 'From: no_reply@test.fr ' . "\r\n" . 'Reply-To: '.$email.' ' . "\r\n" . 'X-Mailer: PHP/' . phpversion();

            mail('test@test.fr',$subject,$message_user,$header);

}

Table sur PhpMyAdmin :

https://image.noelshack.com/fichiers/2017/46/2/1510682724-phpmyadmin-bug-message-id.png

Ce que j'obtiens

Avec le code que j'ai fait au dessus, je reçois bien le mail, mais la table dans phpmyadmin ne se rempli pas même si un message est envoyé, et j'obtiens cette avertissement que je souhaiterais régler sur le site :

Warning: PDOStatement::execute(): SQLSTATE[HY000]: General error: 1364 Field 'message_id' doesn't have a default value in C:\wamp64\www\Test\functions\home.func.php on line 19

Ce que je veux

Je voudrais régler l'avertissement, et que la table sur phpmyadmin se remplisse à chaque envoi d'un message, mais je n'y arrive pas :/ Qui peut m'aider à comprendre et à régler l'erreur ? :)

4 Réponse

48587
,

Si tu remplaces

'message_id' => isset($_GET['id']) ? $_GET['id'] : '' par 'message_id' => isset($_GET['id']) ? $_GET['id'] : '0'

ça dit quoi ?

Comme tu envois "vide" pour un champ numérique, sans avoir de valeur par défaut (0 par exemple) ni autorisé "null". C'est probablemenet une bonne explication.

Il y a aussi la version de mariadb (je suppose) que tu utilises, qui, potentiellement peut poser soucis, car elle définit le set_mode en stricte par défaut (ce qui n'était pas le cas avant) et qui provoque cette même erreur.

48587
,

J'ai pas compris l'intérêt de faire ça, tu as déjà un "id" autocrement, pourquoi ne pas l'utiliser ?

138237
, Il a répondu à ma question !

Ca fonctionne ! Je n'ai plus l'erreur ! Mais il y a quelque chose qui me dérange, l'id change bien et le message s'affiche dans la bdd, mais la valeur message_id reste à 0, et je voudrais que celle-ci augmente (par exemple le 1er message envoye a un message_id de 0, le 2e message a un message_id de 1, le 3e de 2 etc), comment je peux faire ça ?

138237
, Il a répondu à ma question !

Tu as raison, j'ai supprimé la ligne message_id, ça fonctionne aussi bien, merci beaucoup pour ton aide ^^