Slug ne s’insère pas dans ma BDD

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Bonjour à tous !

alorq voila je vous expose mon probleme je voudrais mettre en place un system qui convertit le titre de l'article en supprimant tous les caractere spéciaux et en les remplacants par de " - " donc voilà ce que j'ai mis en place à partir de pas mal de sources que j'ai pu trouver :

(il s'agit de mon fichier post traitment)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
<?php
/* Remplace caractères accentués d'une chaine */
try

{


$bdd = new PDO('mysql:host=dropthdb;dbname=aornn;charset=utf8', 'aornn', 'mdp');
}

catch(Exception $e)

{

        die('Erreur : '.$e->getMessage());

}
function remove_accent($str)
{
  $a = array('À', 'Á', 'Â', 'Ã', 'Ä', 'Å', 'Æ', 'Ç', 'È', 'É', 'Ê', 'Ë', 'Ì', 'Í', 'Î', 'Ï', 'Ð',
                'Ñ', 'Ò', 'Ó', 'Ô', 'Õ', 'Ö', 'Ø', 'Ù', 'Ú', 'Û', 'Ü', 'Ý', 'ß', 'à', 'á', 'â', 'ã',
                'ä', 'å', 'æ', 'ç', 'è', 'é', 'ê', 'ë', 'ì', 'í', 'î', 'ï', 'ñ', 'ò', 'ó', 'ô', 'õ',
                'ö', 'ø', 'ù', 'ú', 'û', 'ü', 'ý', 'ÿ', 'A', 'a', 'A', 'a', 'A', 'a', 'C', 'c', 'C',
                'c', 'C', 'c', 'C', 'c', 'D', 'd', 'Ð', 'd', 'E', 'e', 'E', 'e', 'E', 'e', 'E', 'e',
                'E', 'e', 'G', 'g', 'G', 'g', 'G', 'g', 'G', 'g', 'H', 'h', 'H', 'h', 'I', 'i', 'I', 'i',
                'I', 'i', 'I', 'i', 'I', 'i', '?', '?', 'J', 'j', 'K', 'k', 'L', 'l', 'L', 'l', 'L', 'l',
                '?', '?', 'L', 'l', 'N', 'n', 'N', 'n', 'N', 'n', '?', 'O', 'o', 'O', 'o', 'O', 'o', 'Œ',
                'œ', 'R', 'r', 'R', 'r', 'R', 'r', 'S', 's', 'S', 's', 'S', 's', 'Š', 'š', 'T', 't', 'T',
                't', 'T', 't', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'W', 'w', 'Y',
                'y', 'Ÿ', 'Z', 'z', 'Z', 'z', 'Ž', 'ž', '?', 'ƒ', 'O', 'o', 'U', 'u', 'A', 'a', 'I', 'i',
                'O', 'o', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', '?', '?', '?', '?', '?', '?');

  $b = array('A', 'A', 'A', 'A', 'A', 'A', 'AE', 'C', 'E', 'E', 'E', 'E', 'I', 'I', 'I', 'I', 'D', 'N', 'O',
                'O', 'O', 'O', 'O', 'O', 'U', 'U', 'U', 'U', 'Y', 's', 'a', 'a', 'a', 'a', 'a', 'a', 'ae', 'c',
                'e', 'e', 'e', 'e', 'i', 'i', 'i', 'i', 'n', 'o', 'o', 'o', 'o', 'o', 'o', 'u', 'u', 'u', 'u',
                'y', 'y', 'A', 'a', 'A', 'a', 'A', 'a', 'C', 'c', 'C', 'c', 'C', 'c', 'C', 'c', 'D', 'd', 'D',
                'd', 'E', 'e', 'E', 'e', 'E', 'e', 'E', 'e', 'E', 'e', 'G', 'g', 'G', 'g', 'G', 'g', 'G', 'g',
                'H', 'h', 'H', 'h', 'I', 'i', 'I', 'i', 'I', 'i', 'I', 'i', 'I', 'i', 'IJ', 'ij', 'J', 'j', 'K',
                'k', 'L', 'l', 'L', 'l', 'L', 'l', 'L', 'l', 'L', 'l', 'N', 'n', 'N', 'n', 'N', 'n', 'n', 'O', 'o',
                'O', 'o', 'O', 'o', 'OE', 'oe', 'R', 'r', 'R', 'r', 'R', 'r', 'S', 's', 'S', 's', 'S', 's', 'S',
                's', 'T', 't', 'T', 't', 'T', 't', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'W',
                'w', 'Y', 'y', 'Y', 'Z', 'z', 'Z', 'z', 'Z', 'z', 's', 'f', 'O', 'o', 'U', 'u', 'A', 'a', 'I', 'i',
                'O', 'o', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'A', 'a', 'AE', 'ae', 'O', 'o');
  return str_replace($a, $b, $str);
}


/* Générateur de Slug (Friendly Url) : convertit un titre en une URL conviviale.*/
function Slug($str){
  return mb_strtolower(preg_replace(array('/[^a-zA-Z0-9 \'-]/', '/[ -\']+/', '/^-|-$/'),
  array('', '-', ''), remove_accent($str)));
}

$slug = $_POST[titre];
Slug($slug);

// Connexion à la base de données

// Insertion du message à l'aide d'une requête préparée
$req = $bdd->prepare('INSERT INTO actus (titre,auteur,contenu,genre,date_creation) VALUES(?, ?, ?, ?,CURDATE())');
$req->execute(array($_POST['slug'],$_POST['titre'],$_POST['auteur'], $_POST['contenu'],$_POST['genre'],));


header('Location: /acceuil.php');
?>

et voila mon php qui me permet d'ecrire :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<!DOCTYPE html>

<html>
    <head>
        <meta charset="utf-8"/>
        <title>Ecrire un article</title>
        <link rel="stylesheet" href="style.css"/>


        <script type="text/javascript" src="ckeditor/ckeditor.js"></script>



    </head>

        <h1>Ecrire un article</h1>

        <form method="POST" action="article_post.php">
            <p><label for="auteur">Entrez votre pseudo : </label><input type="text" name="auteur" id="auteur" /></p>

            <p><label for="titre">Entrez le titre de votre article : </label><input type="text" name="titre" id="titre" /></p>

            <p><label for="contenu">Ecrivez votre article :</label></br>
              <textarea cols="50" class="ckeditor" id="contenu" name="contenu" rows="10"></textarea></p>
<p>
          <select name="genre" id="genre">
           <option value="actus">Actus Général</option>
           <option value="tuto">Tuto</option>
           <option value="Edito">Edito</option>

       </select>

   </p>
            <input type="submit" name="envoyer_article" id="bouton_envoyer_article" value="Envoyer l'article"/>
        </form>
    </body>
</html>

donc en utilisant ces fichiers j'ai cette erreur :

Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens in /home/dropthebcc/www/article_post.php on line 61

donc si quelqu'un a une idée je suis preneur ! Merci beacoup !

Cette réponse a aidé l'auteur du sujet

INSERT INTO actus (titre,auteur,contenu,genre,date_creation) VALUES(?, ?, ?, ?,CURDATE())');

Regarde bien, ici tu veux insérer titre, auteur, contenu, genre. (On oublie le date_creation car il est directement attribué par CURDATE().

Ca nous fait donc un total de 4 paramètres, or toi tu fourni ($_POST['slug'],$_POST['titre'],$_POST['auteur'], $_POST['contenu'],$_POST['genre'], soit 5 paramètres.

Donc dans la préparation, tu n'insère pas le slug. Par conséquent l'erreur retourné te dit que tu n'as pas le bon nombre de paramètre entre la préparation et l'exécution.

Bonne journée, WinXaito ;)

+1 -0
Auteur du sujet

Merci beaucoup ! c'est ce que je pensais aussi (que j'ai reglé d'ailleurs) mais le truc c'est que il n'y a rien d'insérer dans ma bdd j'ai fais quelques changements(à partir de la ligne 54) :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
$slug =Slug($_POST['titre']); 
/* à la pace de 
$slug = $_POST[titre];
Slug($slug);

*/

$req = $bdd->prepare('INSERT INTO actus (slug,titre,auteur,contenu,genre,date_creation) VALUES(?, ?, ?, ?,CURDATE())');
$req->execute(array($_POST['slug'],$_POST['titre'],$_POST['auteur'], $_POST['contenu'],$_POST['genre'],));

header('Location: /acceuil.php');

Édité par Aornn

Selon les values, tu as 4 ? et 1 CURDATE(), soit 5 paramètres. Or tu as 6 champs, donc il te faut rajouter encore un ?.

Et concernant ta fonction Slug(), ça ne peux pas fonctionner:

1
2
3
4
5
6
7
function Slug($str){
  return mb_strtolower(preg_replace(array('/[^a-zA-Z0-9 \'-]/', '/[ -\']+/', '/^-|-$/'),
  array('', '-', ''), remove_accent($str)));
}

$slug = $_POST[titre];
Slug($slug);

tu devrais mettre $slug = Slug($slug) car tu as un return dans ta fonction. Car si tu voudrais faire comme tu fais la, tu devrais travailler sur une variable global sans return.

+0 -0
Auteur du sujet

c'est fait ! mais le soucis c'est que je n'ai pas d'erreur et que ca ne rentre pas dans la bdd :/ c'est possible d'activer les erreurs PDO sans avoir fait de PDO dans ce fichers ? ( je sais pas si c'est clair ^^ )

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
/* Générateur de Slug (Friendly Url) : convertit un titre en une URL conviviale.*/
function Slug($str){
  return mb_strtolower(preg_replace(array('/[^a-zA-Z0-9 \'-]/', '/[ -\']+/', '/^-|-$/'),
  array('', '-', ''), remove_accent($str)));
}

$slug = $_POST[titre];
$slug = Slug($slug);
// Connexion à la base de données

// Insertion du message à l'aide d'une requête préparée
$req = $bdd->prepare('INSERT INTO actus (slug,titre,auteur,contenu,genre,date_creation) VALUES(?,?, ?, ?, ?,CURDATE())');
$req->execute(array($_POST['slug'],$_POST['titre'],$_POST['auteur'], $_POST['contenu'],$_POST['genre']));

Édité par Aornn

Essaye uniquement ce code (Après ta connexion à la base de données):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
$slug = 'test';
$titre = 'titre';
$auteur = 'auteur';
$contenu = 'contenu';
$genre = 'genre';


$req = $bdd->prepare('
   INSERT INTO actus 
   (slug, titre, auteur, contenu, genre, date_creation) 
   VALUES
   (?, ?, ?, ?, ?, CURDATE())
');

$req->execute(array(
  $slug, 
  $titre, 
  $auteur, 
  $contenu, 
  $genre
));

Et contrôle bien que le nom de tes colonnes soit correcte. (Éventuellement une capture de phpmyadmin ?)

+0 -0

Cette réponse a aidé l'auteur du sujet

Alors essaye maintenant ceci. Après toutes tes informations tu rajotues ça:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
$req = $bdd->prepare('
   INSERT INTO actus 
   (slug, titre, auteur, contenu, genre, date_creation) 
   VALUES
   (?, ?, ?, ?, ?, CURDATE())
');

$req->execute(array(
  $slug, 
  $_POST['titre'], 
  $_POST['auteur'], 
  $_POST['contenu'], 
  $_POST['genre']
));

si ça ne fonctionne pas, avant l'insertion dans la base, vérifie en faisant des echo de tes variables si tout joue.

+0 -0

Excellent ca marche !! juste un eptiut soucis d'accent qui s'affiche en tant que "?" mais sinon tout est bon !

Aornn

Pour ça il faut voir l'encodage.

Lors de ta connexion il faut rajouter cette ligne: $bdd->exec("SET CHARACTER SET utf8");

1
2
3
4
5
6
7
try{
    $bdd = new PDO('mysql:host=dropthdb;dbname=aornn;charset=utf8', 'aornn', 'mdp');
    $bdd->exec("SET CHARACTER SET utf8");
}
catch(Exception $e) {
        die('Erreur : '.$e->getMessage());
}
+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte