Bonjour,

Je suis un petit nouveau sur le forum, je voulais en premier lieu remercier l'auteur pour ces super tutos.

Mon petit souci est que je n'arrive pas à faire un INSERT INTO avec PDO, je n'ai n'y erreur ni entrée dans la bdd, je vois pas ou se trouve l'erreur.

Index.php

<?php
session_start();

// Instance PDO
try
{
    $PDO = new PDO('mysql:host=localhost;dbname=sco','root','');
    $PDO->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_WARNING);
    $PDO->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE,PDO::FETCH_OBJ);
}
catch(PDOExeption $e)
{
    echo 'Connexion impossible';
}

// Class Auth
require "includes/class.auth.php";

if(!isset($_GET['p'])){$_GET['p']="home";}
if(!file_exists("content/".$_GET['p'].".php")){$_GET['p']="404";}
ob_start();
include "content/".$_GET['p'].".php";
$_content_for_layout=ob_get_contents();
ob_end_clean();
?>

<?php include('includes/header.php'); ?>
<?php include('includes/nav.php'); ?>

                <section>
                    <?php echo $_content_for_layout; ?>
                    <!--<h1>SESSION</h1>
                    <pre><?php /*print_r($_SESSION);*/ ?></pre>-->
                </section>

<?php include('includes/footer.php'); ?>

livreor.php

<?php if($Auth->user('role') >= 'admin'): ?>

                <article class="login">

                    <form class="form" id="login" method="POST" action="index.php?p=livreor">

                        <div id="error"><?php echo $error; ?></div>

                        <fieldset id="inputs">
                            <p class="">
                                <input type="text" placeholder="<?php echo $Auth->user('login'); ?>" autofocus required name="pseudo" id="pseudo" disabled="disabled" />
                            </p>
                            <p class="">
                                <label>Message</label> : <br />
                                <textarea name="message" id="message"></textarea><br />
                            </p>
                            <p class="submit">
                                <input type="submit" value="Envoyer" />
                            </p>
                        </fieldset>
                    </form>

                </article>

<?php endif; ?>

                <article>
<?php if(!$Auth->user('role') == 'member'): ?>
                <p>Pour poster un message, vous devez être connecter <a href="index.php?p=login">Se connecter</a></p>
<?php endif; ?>

<?php

$select = $PDO->prepare('SELECT pseudo, message, role_id, DATE_FORMAT(date, "%d-%m-%Y") AS datefr FROM livreor ORDER BY date');
$select->execute();
while($users = $select->fetch(PDO::FETCH_OBJ)){
    if($users->role_id == 1){
?>

                    <div class="oval-admin">
                        <p class="pseudo"><?php echo $users->pseudo; ?>
                        <span class="date"><?php echo $users->datefr; ?></span></p>
                        <p><?php echo $users->message; ?></p>
                    </div>
<?php }else{?>
                    <div class="oval-member">
                        <p class="pseudo"><?php echo $users->pseudo; ?>
                        <span class="date"><?php echo $users->datefr; ?></span></p>
                        <p><?php echo $users->message; ?></p>
                    </div>

<?php
        }
    };

?>          
                </article>

trait_livreor.php

<?php

$error="";

if(isset($_POST['submit']))
{
$pseudo=htmlspecialchars(trim($_POST['pseudo']));
$message=htmlentities(trim($_POST['message']));

    if($pseudo&&$message)
    {

        $insert = $PDO->prepare('INSERT INTO livreor (pseudo, message, role_id) 
        VALUES(:pseudo, :message, :role_id');
        $insert->execute(array(
            ':pseudo' => $pseudo,
            ':message' => $message,
            ':role_id' => $Auth->user('id')
        ));

        /*header('Location:index.php?p=livreor');*/

    }else $error = "Veuillez saisir tous les champs";

}

?>

Merci pour votre aide.

18 réponses


elfefe
Auteur
Réponse acceptée

Merci Crisou, j'ai réécrit 4 fois ma requête et 4 fois la même erreur. manque de concentration.
Merci beaucoup, ça fonctionne.

Yop, sans avoir utilisé ton code, je vois que tu fais une vérification sur $_POST['submit'] (trait_livreor.php) ok mais je ne vois aucune balises dans ton <form> qui contient l'attribut name="submit". Le soucis est là ,)

elfefe
Auteur

Salut PhiSyX,

Merci, effectivement oubli de ma part, cependant mon code ne fonctionne toujours et je ne vois aucunes erreurs.

Merci d'avance.

l'id est pas en autoincremente et clé primaire dans ta base de données ?
si c'est le cas tu peux pas inserer une valeur je pense. sinon je pense que c'est pas un insert into qu'il faut faire mais un update.

Autant pour moi je suis hors sujet :) tu précises pas l'id.

Est-ce que tu inclus ton fichier trait_livreor.php ou pas?
Sinon peut-être que tu dois modifier ton action (du formulaire) et y mettre le chemin accessible vers trait_livreor.php

elfefe
Auteur

Dans action du form je mets index.php?p=trait_livreor,j'ai essayer de touts mettre sur la même page et que le traitement ce fasse dans le même fichier mais j'ai exactement le même problème.
Merci d'avance.

elfefe
Auteur

Merci Seenok,
l'id est en autoincrément mais par sécurité j'ai vérifier :-)
Merci quand même

if($pseudo&&$message)

Es tu sur de pouvoir l'écrire comme ça ? Et non pas :

if(!empty($pseudo) && !empty($message))

De plus j'ai cru voir quelques problèmes dans ce bout de code :

<?php if($Auth->user('role') >= 'admin'): ?>
                    <form class="form" id="login" method="POST" action="index.php?p=livreor">
                                <input type="text" placeholder="<?php echo $Auth->user('login'); ?>" autofocus required name="pseudo" id="pseudo" disabled="disabled" />
                                <textarea name="message" id="message"></textarea><br />
                    </form>

<?php endif; ?>
  • dans ta vérification (id) tu vérifie si 'role' est supérieur ou égale à 'admin', or il s'agit ici de chaines de caractères, je ne crois pas que tu puisse comparer deux string.
  • dans ton input (pseudo), tu lui a mis l'attribut disabled ce qui signifie que l'utilisateur ne peut pas le remplir. Mais aucune valeur (value) ne lui est attribué. l'attribut 'placeholder' ne sera pas transmis, il indique simplement une valeur par défaut.
elfefe
Auteur

Salut Benjamin Derepas,
Merci pour ta réponse.
Oui je peux écrire comme ça :
ce bout d ecode fonctionne.

if($pseudo&&$message)

ce bout de code fonctionne.

pour la partie Auth, j'ai effectivement ce code, si je me logue en admin j'ai le formulaire de saisi qui s'affiche sinon il me demande de me connecter.
ce bout de code fonctionne.

<?php if($Auth->user('role') >= 'admin'): ?>
                    <form class="form" id="login" method="POST" action="index.php?p=livreor">
                                <input type="text" placeholder="<?php echo $Auth->user('login'); ?>" autofocus required name="pseudo" id="pseudo" disabled="disabled" />
                                <textarea name="message" id="message"></textarea><br />
                    </form>

<?php endif; ?>

oui effectivement j'ai remis en ordre mon bout de code (petite erreur)

<p class="">
    <input type="text" name="pseudo" id="pseudo" value="<?php echo $Auth->user('login'); ?>" />
</p>

je ne trouve pas ce qui cloche.

Merci d'avance.

elfefe
Auteur

J'ai tous mis sur une seul page traitement compris pour voir ce qui cloche :

<?php if($Auth->user('role') >= 'admin'): ?>

<?php

$error="";

if(isset($_POST['submit']))
{
$pseudo=htmlspecialchars(trim($_POST['pseudo']));
$message=htmlentities(trim($_POST['message']));

    if($pseudo&&$message)
    {

        $insert = $PDO->prepare('INSERT INTO livreor (pseudo, message, role_id) 
        VALUES(:pseudo, :message, :role_id');
        $insert->execute(array(
            ':pseudo' => $pseudo,
            ':message' => $message,
            ':role_id' => $Auth->user('id')
        ));

        /*header('Location:index.php?p=livreor');*/

    }else $error = "Veuillez saisir tous les champs";

}

?>

                <article class="login">

                    <form class="form" id="login" method="POST" action="index.php?p=livreor">

                        <div id="error"><?php echo $error; ?></div>

                        <fieldset id="inputs">
                            <p class="">
                                <input type="text" name="pseudo" id="pseudo" value="<?php echo $Auth->user('login'); ?>" />
                            </p>
                            <p class="">
                                <label>Message</label> : <br />
                                <textarea name="message" id="message"></textarea><br />
                            </p>
                            <p class="submit">
                                <input id="submit" type="submit" value="Envoyer" name="submit" />
                                <div id="error"><?php echo $error; ?></div>
                            </p>
                        </fieldset>
                    </form>

                </article>

<?php endif; ?>

                <article>
<?php if(!$Auth->user('role') == 'member'): ?>
                <p>Pour poster un message, vous devez être connecter <a href="index.php?p=login">Se connecter</a></p>
<?php endif; ?>

<?php

$select = $PDO->prepare('SELECT pseudo, message, role_id FROM livreor');
$select->execute();
while($users = $select->fetch(PDO::FETCH_OBJ)){
    if($users->role_id == 1){
?>

                    <div class="oval-admin">
                        <p class="pseudo"><?php echo $users->pseudo; ?>
                        <span class="date"><?php echo $users->datefr; ?></span></p>
                        <p><?php echo $users->message; ?></p>
                    </div>
<?php }else{?>
                    <div class="oval-member">
                        <p class="pseudo"><?php echo $users->pseudo; ?>
                        <span class="date"><?php echo $users->datefr; ?></span></p>
                        <p><?php echo $users->message; ?></p>
                    </div>

<?php
        }
    };

?>          
                </article>

et ma table sql "livreor"

-- phpMyAdmin SQL Dump
-- version 4.4.7
-- http://www.phpmyadmin.net
--
-- Client :  localhost
-- Généré le :  Ven 04 Mars 2016 à 21:23
-- Version du serveur :  5.5.44-MariaDB
-- Version de PHP :  5.5.31

SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;

--
-- Base de données :  `sco`
--

-- --------------------------------------------------------

--
-- Structure de la table `livreor`
--

CREATE TABLE IF NOT EXISTS `livreor` (
  `id` int(11) NOT NULL,
  `pseudo` varchar(255) NOT NULL,
  `message` text NOT NULL,
  `role_id` int(11) NOT NULL
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8;

--
-- Contenu de la table `livreor`
--

INSERT INTO `livreor` (`id`, `pseudo`, `message`, `role_id`) VALUES
(11, 'admin', 'tes tes ttest est set set', 1);

--
-- Index pour les tables exportées
--

--
-- Index pour la table `livreor`
--
ALTER TABLE `livreor`
  ADD PRIMARY KEY (`id`);

--
-- AUTO_INCREMENT pour les tables exportées
--

--
-- AUTO_INCREMENT pour la table `livreor`
--
ALTER TABLE `livreor`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=12;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

Merci d'avance

elfefe
Auteur

Bonjour,
je suis toujours bloqué sur ce INSERT INTO et je ne sais pas du tout quoi faire.
j'ai mis un print_r de :

  • $insert : PDOStatement Object ( [queryString] => INSERT INTO livreor (pseudo, message, role_id) VALUES(:pseudo, :message, :role_id )
  • $_POST : Array ( [pseudo] => membre [message] => salut [submit] => Envoyer )

J'ai comme l'impression qu'il ne prend pas en compte :

$insert->execute(array(
            ':pseudo' => $pseudo,
            ':message' => $message,
            ':role_id' => $Auth->user('id')
        ));

Merci pour votre aide.

Si tu remplaces ceci

$PDO->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_WARNING);

par cela

$PDO->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTIONWARNING);

(enleve le derniere WARNING, je n'arrive pas a l'editer avec mon telephone....)
Et que tu rajoutes ceci avant ton code

error_reporting(E_ALL);
ini_set("display_errors", "on");

As-tu des erreurs d'affichés ?

elfefe
Auteur

Salut Crisou,
Merci pour ton aide, j'ai remplacé comme ci-dessu et j'ai le message suivant :

Fatal error: Uncaught exception 'PDOException' with message '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 '' at line 2' in /volume1/web/sco/content/livreor.php:24 Stack trace: #0 /volume1/web/sco/content/livreor.php(24): PDOStatement->execute(Array) #1 /volume1/web/sco/index.php(22): include('/volume1/web/sc...') #2 {main} thrown in /volume1/web/sco/content/livreor.php on line 24 

la ligne 24 correspond à la fermeture du code ci-dessous :

$insert->execute(array(
            ':pseudo' => $pseudo,
            ':message' => $message,
            ':role_id' => $Auth->user('id')
        )); /* La ligne 24 */
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 '' at line 2

montre nous ta requete SQL car defois l'erreur vient d'une des lignes précédente q la ligne indiquée

elfefe
Auteur

fichier index :

<?php
session_start();

// Instance PDO
try
{
    $PDO = new PDO('mysql:host=localhost;dbname=sco','root','');
    $PDO->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
    $PDO->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE,PDO::FETCH_OBJ);
}
catch(PDOExeption $e)
{
    echo 'Connexion impossible';
}

// Class Auth
require "includes/class.auth.php";

if(!isset($_GET['p'])){$_GET['p']="home";}
if(!file_exists("content/".$_GET['p'].".php")){$_GET['p']="404";}
ob_start();
include "content/".$_GET['p'].".php";
$_content_for_layout=ob_get_contents();
ob_end_clean();
?>

<?php include('includes/header.php'); ?>
<?php include('includes/nav.php'); ?>

                <section>
                    <?php echo $_content_for_layout; ?>
                    <!--<h1>SESSION</h1>
                    <pre><?php /*print_r($_SESSION);*/ ?></pre>-->
                </section>

<?php include('includes/footer.php'); ?>

fichier livreor :

<?php
error_reporting(E_ALL);
ini_set("display_errors", "on");

$error="";

if(isset($_POST['submit']))
{
$pseudo=htmlspecialchars(trim($_POST['pseudo']));
$message=htmlentities(trim($_POST['message']));

    if($pseudo&&$message)
    {

        $insert = $PDO->prepare('INSERT INTO livreor (pseudo, message, role_id) 
        VALUES(:pseudo, :message, :role_id');
        $insert->execute(array(
            ':pseudo' => $pseudo,
            ':message' => $message,
            ':role_id' => $Auth->user('id')
        ));

        echo "Insertion réussi";
        /*header('Location:index.php?p=livreor');*/

    }else $error = "Veuillez saisir tous les champs";

}

?>

Merci pour ton aide.

Vous avez vérifier que $Auth->user('id') n'était pas vide ?

il manque une parenthèse a la fin de ta requete SQL.