IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Créer une nouvelle ligne uniquement si elle n'existe pas encore


Sujet :

Langage PHP

  1. #1
    Membre habitué Avatar de Alexandrebox
    Profil pro
    Inscrit en
    Août 2006
    Messages
    635
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2006
    Messages : 635
    Points : 153
    Points
    153
    Par défaut Créer une nouvelle ligne uniquement si elle n'existe pas encore
    Bonjour,

    J'ai une donnée 1:
    ID=1, identifiant=20, lang='fr', tire='titre français', contenu='contenu français';
    J'essaie de traduire en anglais. Je fais :

    est ce que donnée dont l'identifiant est 20 et la lang est en existe?
    si oui alors modifier
    sinon alors le créer et l'ouvrir en modification
    A la fin nous devrons avoir dans la table ceci :
    ID=1, identifiant=20, lang='fr', tire='titre français', contenu='contenu français', photo='photo.jpg', statut='visible';

    ID=2, identifiant=20, lang='en', tire='titre anglais', contenu='contenu anglais', photo='photo.jpg', statut='visible';
    Le problème, c'est qu'avec le code que vous verrez ci-dessous, le résultat me donne toujours ceci :

    ID=1, identifiant=20, lang='fr', tire='titre français', contenu='contenu français', photo='photo.jpg', statut='visible';

    ID=2, identifiant=20, lang='en', tire='titre anglais', contenu='contenu anglais', photo=' ', statut=' ';
    Peut-être mon algorithme mysql n'est pas bien et du coup je perd des variables pendant le traitement. Quel algorithme me conseillez-vous?
    D'avance je vous remercie pour votre aide.

    Code complet :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    66
    67
    68
    69
    70
    71
    72
    73
    74
    <?php
    $moncompteur = 0;
    $varID = $_GET['varID'];// identifiant commun exemple varID => FR = 20, varID => EN = 20 etc.
    $lang_traduit = $_GET['lang_traduit']; // ICI $lang_traduit = 'en';
     
    //CREER LA PAGE anglaise du texte français SI ELLE EXIXTE PAS ENCORE
    if($moncompteur == 0)
    {
    $variableDeControle = "SELECT * FROM matable WHERE identifiant ='$varID' AND lang='$lang_traduit' ";
    $monchampSql = mysql_query($variableDeControle);
    $monTotal =  mysql_num_rows($monchampSql);
    if($monTotal  == 0)
    {
    $moncompteur += 1;
    $controleSql = "INSERT INTO matable(identifiant, lang)VALUES('$varID', '$lang_traduit')";
    $linkQuery = mysql_query($controleSql);
    }
     
    }//Fin de controle et de création de la page
     
    //Nous sélectionnons les données de la langue par défaut à traduire
    $requete_original = "SELECT * FROM matable WHERE identifiant ='$varID' AND lang='fr' ";
    $champSql_original = mysql_query($requete_original);
    $donnee_orginal = mysql_fetch_assoc($champSql_original);
     
    //Nous sélectionnons la donnée à mettre à jour : nous voullons copier certains champs de la donnée FR vers la donnée EN
    $requete_traduit = "SELECT * FROM matable WHERE identifiant ='$varID' AND lang='$lang_traduit' ";
    $champSql_traduit = mysql_query($requete_traduit);
    $donnee_traduit = mysql_fetch_assoc($champSql_traduit);
     
    //Le formulaire
    $varialbe_formulaire = '
      <form name="form1" method="POST" action="#">
      <input name="titre" type="text" id="titre" value="'.$donnee_traduit['titre'].'">
      <textarea name="contenu" id="contenu">'.$donnee_traduit['contenu'].'</textarea>
      <input name="lang" type="hidden" id="lang" value="'.$donnee_traduit['lang'].'">
      <input name="ID" type="hidden" id="ID" value="'.$donnee_traduit['ID'].'">
      <input name="photo" type="hidden" id="photo" value="'.$donnee_orginal['photo'].'">
      <input name="statut" type="hidden" id="statut" value="'.$donnee_orginal['statut'].'">
      <input name="valider" type="hidden" id="valider" value="modifier">
      <input name="submit" type="submit" id="submit"  value="Modifier" >
      ';
     
    //Traiter la réception des données issues du formulaire
    if( (isset($_POST['valider'])) &&($_POST['valider'] == 'modifier')  )
    {
    $titre = mysql_real_escape_string($_POST['titre']);
    $contenu = mysql_real_escape_string($_POST['contenu']);
    $photo = mysql_real_escape_string($_POST['photo']);
    $statut = mysql_real_escape_string($_POST['statut']);
    $lang = mysql_real_escape_string($_POST['lang']);
    $ID = $_POST['ID'];
    }
     
    //Ici nous mettons à jour la nouvelle donnée anglaise avec certains champs français copiés
    $sql = "UPDATE matable SET titre='$titre', contenu='$contenu',statut='$statut', photo='$photo' WHERE ID = '$ID'";
    if(mysql_query($sql))
    {
    //Si mise a jour réussie, on retourne sur la page actuelle pour actualiser les nouvelles données du formulaire. On affiche le texte : ça a marché
    header('Location: http://www.monsite.com/admin/traduire.php?varID=$ID&lang_traduit=$lang');
    echo '<div>Traitement réussi</div><br />';
    }
    else{
    echo '<div>Traitement échoué</div><br />';
    }
    echo $varialbe_formulaire;
     
    }//Fin de if isset post valider
     
    else
    {
    echo $varialbe_formulaire;
    }
    ?>

  2. #2
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    Je vois un problème de modélisation des données !

    A la fin nous devrons avoir dans la table ceci :
    Citation:
    ID=1, identifiant=20, lang='fr', tire='titre français', contenu='contenu français', photo='photo.jpg', statut='visible';

    ID=2, identifiant=20, lang='en', tire='titre anglais', contenu='contenu anglais', photo='photo.jpg', statut='visible';
    Les colonnes photo et statut ne devraient pas être répétées si elles sont identiques pour toutes les langues. Il y a redondance de données.

    Tu devrais avoir une table donnant les caractéristiques des contenus et une autre pour les parties à traduire.
    Contenu (c_id, c_photo, c_statut)
    Langue (l_id, l_code, l_libelle)
    Traduction_contenu (tc_id_contenu, tc_id_langue, tc_titre, tc_contenu)

    est ce que donnée dont l'identifiant est 20 et la lang est en existe?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT COUNT(*)
    FROM Traduction_contenu As tc
    INNER JOIN Langue As l ON tc.tc_id_langue = l.l_id
    WHERE tc.tc_id_contenu = 20
      AND l.l_code = 'fr'

  3. #3
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Avec Mysql, il existe REPLACE qui s'utilise comme INSERT.
    Si aucune contrainte n'est rencontrée (ligne n'existe pas) , cela fait un INSERT.
    Si une contrainte est rencontrée (ligne existant déjà), cela fait un DELETE/INSERT ; attention ce n'est donc pas un UPDATE : les index autoincrementés changent de valeur.

    Il faut bien sur que la table est un index UNIQUE sur les champs qui doivent l'être.

  4. #4
    Membre habitué Avatar de Alexandrebox
    Profil pro
    Inscrit en
    Août 2006
    Messages
    635
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2006
    Messages : 635
    Points : 153
    Points
    153
    Par défaut
    Ouais, d'abord merci de ta réponse, mais ça ne résoud pas le problème.

    Quelqu'un pourra t- il m'aider à voir plus clair dans mon code?

    D'avance je vous remercie

  5. #5
    Membre habitué
    Inscrit en
    Décembre 2009
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 79
    Points : 152
    Points
    152
    Par défaut
    Salut,

    L'erreur est très très simple (attention, tu vas pleurer).

    <input name="photo" type="hidden" id="photo" value="'.$donnee_orginal['photo'].'">
    <input name="statut" type="hidden" id="statut" value="'.$donnee_orginal['statut'].'">

    Tu écris $donnees_orginal au lieu de $donnees_original comme plus haut dans le script.

    Bonne journée

  6. #6
    Invité
    Invité(e)
    Par défaut
    Hello,

    De plus,

    Si ton champ "identifiant" est de type numérique, Il ne faut pas encadrer la valeur de ce champ par des apostrophes.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $requete_original = "SELECT * FROM matable WHERE identifiant = $varID AND lang='fr' ";
     
    $controleSql = "INSERT INTO matable(identifiant, lang)VALUES($varID, '$lang_traduit')";

  7. #7
    Membre habitué
    Inscrit en
    Décembre 2009
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 79
    Points : 152
    Points
    152
    Par défaut
    Pour le coup Mygale, tu as raison dans l'absolu, mais dans la pratique ça ne change absolument rien.

  8. #8
    Membre habitué Avatar de Alexandrebox
    Profil pro
    Inscrit en
    Août 2006
    Messages
    635
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2006
    Messages : 635
    Points : 153
    Points
    153
    Par défaut
    Bon merci pour tout ça mais mes chers potes, vous n'avez pas trouvé quelque chose dans mon algorithme qui cloche, quelque chose pouvant m'aider? Je ne comprends pas pourquoi ces variables ne sont pas insérées dans la base de données. J'ai revu mille fois mon code et je ne vois pas d'erreur. Tout me parait normal mais pourtant...

  9. #9
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Je ne suis pas sur de bien comprendre ton problème : visiblement ca serait que photo et statut ne sont pas remplis dans la ligne inseré mais vu qu'ils ne sont pas indiqué dans ta requete INSERT, ca me parrait assez simple et normale non ?

  10. #10
    Membre habitué Avatar de Alexandrebox
    Profil pro
    Inscrit en
    Août 2006
    Messages
    635
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2006
    Messages : 635
    Points : 153
    Points
    153
    Par défaut
    On voit Sabotage que tu n'as pas lu le code toi sinon tu verras que ces données sont écrites dans la mise à jour UPDATE.

    Quelqu'un qui aurait lu le code pourra-t-il m'aider SVP?

    D'avance je vous remercie

  11. #11
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Je l'aurais bien testé ton code mais comme tu n'as toi même pas pris le temps de nous le fournir sans faute de syntaxe ...


    Bref, quand tu arrives la premiere fois sur la page, tu as bien varID et langtraduit dans le $_GET.
    Mais apres avoir validé le formulaire, tu ne les as plus, donc ta requete $requete_original ne renvoit plus rien.

    Il faut soit les passer dans l'action de ton formulaire et rester sur $_GET, soit les passer dans les champs hidden et utiliser $_REQUEST.

  12. #12
    Membre habitué Avatar de Alexandrebox
    Profil pro
    Inscrit en
    Août 2006
    Messages
    635
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2006
    Messages : 635
    Points : 153
    Points
    153
    Par défaut
    Merci Sabotage de t'avoir donné la peine de regarder birèvement le code.
    Cependant voici la réponse à ta question :

    Etape 1
    La première fois qu'on est sur la page, on a les variables $varID et $lang_traduit.
    les requetes : $donnee_original et $donnee_traduit sont faites en ce moment là

    Etape 2
    les varialbes récupérées de ces requetes sont passées au formulaire.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    //Le formulaire
    $varialbe_formulaire = '
      <form name="form1" method="POST" action="#">
      <input name="titre" type="text" id="titre" value="'.$donnee_traduit['titre'].'">
      <textarea name="contenu" id="contenu">'.$donnee_traduit['contenu'].'</textarea>
      <input name="lang" type="hidden" id="lang" value="'.$donnee_traduit['lang'].'">
      <input name="ID" type="hidden" id="ID" value="'.$donnee_traduit['ID'].'">
      <input name="photo" type="hidden" id="photo" value="'.$donnee_orginal['photo'].'">
      <input name="statut" type="hidden" id="statut" value="'.$donnee_orginal['statut'].'">
      <input name="valider" type="hidden" id="valider" value="modifier">
      <input name="submit" type="submit" id="submit"  value="Modifier" >
      ';
    Etape 3
    Les variables du formulaire sont récupérées.

    Etape 4
    La table est mise à jour et le résultat "Information réussie" est emvoyé à la page.

    J'espère qu'à part mes précédents codes bien commentés et cette fois ci la synthase donnée, quelqu'un me mettra sur la bonne route.

    D'avance je vous remercie toutes et tous.

  13. #13
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Est-ce que dans le formulaire tu vois bien les données attendues ?
    Si oui, fais ajoute print_r($_POST) et un echo de ta requete UPDATE, on y verra peut etre quelque chose.

    Et ajoute le </form>.

  14. #14
    Membre habitué
    Inscrit en
    Décembre 2009
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 79
    Points : 152
    Points
    152
    Par défaut
    Alexandrebox : je répète mon message qui t'explique l'erreur de syntaxe qui cause ton problème actuellement.


    Citation Envoyé par OlgarK Voir le message
    Salut,

    L'erreur est très très simple (attention, tu vas pleurer).

    <input name="photo" type="hidden" id="photo" value="'.$donnee_orginal['photo'].'">
    <input name="statut" type="hidden" id="statut" value="'.$donnee_orginal['statut'].'">

    Tu écris $donnees_orginal au lieu de $donnees_original comme plus haut dans le script.

    Bonne journée

  15. #15
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Il y a partout $donnee_orginal donc ce n'est pas ça.

  16. #16
    Membre habitué Avatar de Alexandrebox
    Profil pro
    Inscrit en
    Août 2006
    Messages
    635
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2006
    Messages : 635
    Points : 153
    Points
    153
    Par défaut
    Mes chers amis, après plusieurs jours à me tirer les cheveux et à demander votre aide qui m'a d'ailleurs été très précieuse, puisque j'ai fait ce que vous m'avez dit : faire echo des requetes. J'ai pu trouver qu'une variable (idenfitifant) n'était pas récupérée correctement Get au premier tour et POST au deuxième tour.
    Maintenant tout fonctionne bien.

    Merci beaucoup pour votre aide.
    Bonnes fêtes mes amis

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Créer une nouvelle ligne dans un DBgrid
    Par znathan dans le forum Débuter
    Réponses: 3
    Dernier message: 01/12/2011, 17h49
  2. Créer une variable de session si elle n'existe pas
    Par Augustule dans le forum Langage
    Réponses: 2
    Dernier message: 09/05/2011, 17h46
  3. Réponses: 82
    Dernier message: 05/02/2011, 14h34
  4. Comment créer une nouvelle ligne (\n) dans un StringBuffer
    Par publicStaticVoidMain dans le forum Langage
    Réponses: 5
    Dernier message: 05/11/2009, 18h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo