Bonjour,

Je me suis trouvé avec un problème avec PDO

Ce que j'ai fais

Je cherche à pouvoir publié un "article" comme sur wordpress mais sur quelque chose que j'ai codé. Mais rien ne se passe, j'ai cherché (un peu) sur internet mais aucune erreur ne s'inscrit. Voilà mon code:

<form action="" method="POST">
      <?php
      if (isset($_POST['title']) || isset($_POST['video']) || isset($_POST['auteur']) || isset($_POST['min-desk']) || isset($_POST['desk'])) {
         $date = date('Y').'-'.date('M').'-'.date('D');
         $titre = $_POST['title'];
         $video = $_POST['video'];
         $auteur = $_POST['auteur'];
         $desk = $_POST['desk'];
    $db->exec("INSERT INTO `news` (`id`, `title`, `video`, `auteur`, `desk`, `disqus-name`, `date`) VALUES (null, ".$titre.", ".$video.", ".$auteur.", ".$desk.", ".$video.", ".$date.");");

      }
      ?>
          <div class="form-group">
            <label for="title" class="col-sm-2 control-label">Titre</label>
            <div class="col-sm-10">
              <input type="text" id="title" class="form-control" name="title" value="">
            </div>
          </div>
          <div class="form-group">
            <label for="video" class="col-sm-2 control-label">URI</label>
            <div class="col-sm-10">
              <input type="text" id="video" class="form-control" name="video" value="">
            </div>
          </div>
          <div class="form-group">
            <label for="auteur" class="col-sm-2 control-label">Auteur</label>
            <div class="col-sm-10">
              <input type="text" id="auteur" class="form-control" name="auteur" value="">
            </div>
          </div>
          <div class="form-group">
            <label for="desk" class="col-sm-2 control-label">Description</label>
            <div class="col-sm-10">
              <textarea type="text" rows="3" class="form-control" id="desk" name="desk"></textarea>
            </div>
          </div>
          <a href="" class="btn btn-default" data-dismiss="modal" style="text-align: left; float:left;">Fermer</a>
          <button type="submit" class="btn btn-primary" style="text-align: right; float:right;">Crée</button>
  </form>

17 réponses


Carouge10
Réponse acceptée

Oui c'est bien cela
Ajoute ceci en dessous pour afficher les erreurs pdo

$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

Et ceci en tout début de ton code pour affichers les erreurs

ini_set('display_errors','on');
error_reporting(E_ALL);
Ungarscool1
Auteur
Réponse acceptée

C'est bon en fait, après avoir vu l'erreur il y avait un problème avec disqus-name. Merci de m'avoir aidé

PHP:

$req = $db->prepare('INSERT INTO news (title, video, auteur, desk, disqus_name, date_article) VALUES(?, ?, ?, ?, ?, NOW())');
$req->execute(array($titre, $video, $auteur, $desk, $video));

SQL:

--
-- Structure de la table `news`
--

CREATE TABLE `news` (
  `id` int(11) NOT NULL,
  `title` varchar(255) CHARACTER SET latin1 NOT NULL,
  `video` varchar(255) CHARACTER SET latin1 NOT NULL,
  `auteur` varchar(255) CHARACTER SET latin1 NOT NULL DEFAULT 'Ungarscool1',
  `desk` varchar(255) CHARACTER SET latin1 NOT NULL,
  `disqus_name` varchar(255) COLLATE utf8_bin NOT NULL,
  `date_article` date NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

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

--
-- AUTO_INCREMENT pour les tables déchargées
--

--
-- AUTO_INCREMENT pour la table `news`
--
ALTER TABLE `news`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=32;COMMIT;

Je suis désolé mais je n'ai pas compris ce que tu as mis , en gros je dois testé comme ça ?

$req = $db->prepare('INSERT INTO `news` (`id`, `title`, `video`, `auteur`, `desk`, `disqus-name`, `date`) VALUES (null, ?, ?, ?, ? , ? , ? )');
$req->execute(array($titre, $video, $auteur... ));

J'ai vu quand tu as mis que il y a 2 fois le $video. Dans mon cas j'utilise l'id de la vidéo pour disqus.
Mais après ce que t'as mis il ne se passe rien...
Rien sur phpmyadmin, et rien sur le site.

Oui et en primary

Par contre les requêtes de suppression et d'update fonctionnent

La structure de la table pourrait aider à y voir plus claire.

Autre chose pour la récupération des variables via $_POST regarde la fonction filter_imput() associé à filter_var() et autres c'est bien mieux pour la sécurité.

Tu veux voir le fichier sql ou un screen (les lignes dans le fichier sql seront enlevé pour éviter les problèmes)

Bonjour,
Avez-vous consulté les fichiers logs pour déterminer l'erreur ?
Sinon adapté ce code pour afficher l'erreur:

$req = $bd->prepare('INSERT INTO news (title, video, auteur, desk, disqus_name, date_article) VALUES(?, ?, ?, ?, ?, NOW())');
$req->execute(array($titre, $video, $auteur, $desk, $disqus_name));
if (!$req) {
   echo "\nPDO::errorInfo():\n";
   print_r($bd->errorInfo());
}

Bien la structure en sql, histoire qu"on puisse faire un test nous même de ton code du genre:

<pre><code>
CREATE TABLE ma_table (
lala_id int(11) NOT NULL,
lala_title varchar(250) NOT NULL,
lala_content text NOT NULL,
lala_img varchar(255) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
</code></pre>

Pas besoin des données, juste la structure de la table.

Mon fichier SQL

CREATE TABLE `news` (
  `id` int(11) NOT NULL,
  `title` varchar(255) CHARACTER SET latin1 NOT NULL,
  `video` varchar(255) CHARACTER SET latin1 NOT NULL,
  `auteur` varchar(255) CHARACTER SET latin1 NOT NULL DEFAULT 'Ungarscool1',
  `desk` varchar(255) CHARACTER SET latin1 NOT NULL,
  `disqus-name` varchar(255) COLLATE utf8_bin NOT NULL,
  `date` date NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

Et pour répondre à Carouge10 "... mais aucune erreur ne s'inscrit", avec ton code tout disparait de la page mais rien ne se passe, pas une seul écriture.
--- EDIT ---
Quand je fait une verif php, je n'ai aucune erreur.


root@ungarscool1-1:~# php -l /var/www/html/modules/add.in.ungs.php
No syntax errors detected in /var/www/html/modules/add.in.ungs.php

Ton id n'est pas en auto-increment donc il faut soit le passer auto-increment, soit c'est à toi de le gérer.
"date" est réservé à SQL donc il vaut mieux le modifier comme "date_article".

Pourtant je le vois qu'il est en auto

Et bien très bien et pour le reste ?

J'ai ajouté ce que tu as mis mais rien ne s'affiche

if (!$req) {
   echo "\nPDO::errorInfo():\n";
   print_r($bd->errorInfo());
}

Je parlais de ceci : "date" est réservé à SQL donc il vaut mieux le modifier comme "date_article".

Il ne se passe toujours rien, rien. Et ça me le fait sur toute mes db. J'ai tenté de crée une nouvelle db avec un autre nom etc mais même ça ne fonctionne pas. Comment te connecte tu à mysql ?
Je me connecte comme ça :

 $db = new PDO('mysql:host=localhost;dbname=***', '***', '********');