Problème de récupération de données dans une base SQL

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Problème de récupération de données dans une base SQL

par Marjerem » 16 nov. 2007, 20:05

C'est exactement ce qu'il me faut ! ça marche nickel.
Merci beaucoup pour ton aide :D

Bonne soirée :!:

par sadeq » 16 nov. 2007, 19:58

Tu peux virer le test
if ($sql = '1062')
echo "Vous avez déjà répondu au questionnaire";
Car, tu peux le gérer en bas du script avec le test sur mysql_errno(), comme ça:
// si un champ est vide, on affiche le message d'erreur
if (strlen($message) > strlen($msg_erreur)) {
        echo $message;
// sinon c'est ok
} 
else {
        foreach($_POST as $index => $valeur) {
              $$index = mysql_real_escape_string(trim($valeur));
        }

      $computername=$_POST['computername'];
      $computername = $_ENV["COMPUTERNAME"];;

      $rubriquesconsult = $_POST['rubriquesconsult'];
      $sqlrubriquesconsult = '';
      $rubriquesconsult = $_POST['rubriquesconsult'];
      $sqlrubriquesconsult = implode(',',$rubriquesconsult);

      $servicesconsult = $_POST['servicesconsult'];
      $sqlservicesconsult = '';
      $servicesconsult = $_POST['servicesconsult'];
      $sqlservicesconsult = implode(',',$servicesconsult);

      $sql = "INSERT INTO satisfactiondiva VALUES ('$computername', '$nom', '$prenom', '$service',         
                 '$quantiteinfos', '$qualiteinfos', '$clarteinfos', '$faciliteutilisation', '$frequenceconsult', 
                  '$dureeconsult', '$sqlrubriquesconsult', '$sqlservicesconsult', '$servicecorresp', 
                  '$cellulecorresp', '$frequencecreationcontenu', '$outilcomplet', '$souhaits',  
                  '$rubriquesaetoffer', '$remarques')";

       $res = @mysql_query($sql);
       if ($res) {
                   echo $msg_ok;
        } 
       else {
             if ( mysql_errno() != 1062 ) echo mysql_error(); 
             else echo "Vous avez déjà répondu au questionnaire";
        }
}//fin else c'est ok
?>

par Marjerem » 16 nov. 2007, 19:40

Par contre, si je simule une autre erreur sql (j'ai par exemple changé le nom de la base dans mon fichier de traitement), il me renvoie bien l'erreur "No database selected" ; il n'y a que l'erreur "duplicate" qui n'apparaît plus.

par Marjerem » 16 nov. 2007, 19:31

Merci de l'info.
Je viens de tester et voilà ce qui se passe :
-lorsque je remplis ce questionnaire pour la première fois, je reçois à la fin le message prévu ("Merci d'avoir rempli ce questionnaire.").
-si je le remplis pour la seconde fois, l'intégration ne se fait pas dans la base sql mais je ne reçois aucun message d'erreur (alors que je devrais voir sur la page suivante "Vous avez déjà rempli ce questionnaire").
J'ai testé :
-avec le "@" devant mysql_query
-sans le "@" devant mysql_query
-avec

Code : Tout sélectionner

if ($sql = '1062') echo "Vous avez déjà répondu au questionnaire";
-sans

Code : Tout sélectionner

if ($sql = '1062') echo "Vous avez déjà répondu au questionnaire";
On est proches de la solution, il ne manque qu'un tout petit bout...!

par sadeq » 16 nov. 2007, 18:41

Il faut tester mysql_errno() : le n° de l'erreur. Mais il faut désactiver l'echo automatique déclenché par les fonctions qui causent l'erreur en les préfixant par @

Exemple:
$res = @mysql_query($sql);
if ($res) {
echo $msg_ok;
} else {
             if ( mysql_errno() != 1062 ) echo mysql_error();
} 

par Truc » 16 nov. 2007, 18:36

suffit de ne pas mettre de
echo mysql_error();
:-k

par Marjerem » 16 nov. 2007, 17:50

En fait, j'ai réussi à faire afficher la phrase voulue lorsqu'il rencontre l'erreur SQL "Duplicate" (1062).
Mais je n'arrive pas à faire disparaître la phrase par défaut
Duplicate entry 'UC30493' for key 1
Donc en fait, ça me donne
Vous avez déjà répondu au questionnaireDuplicate entry 'UC30493' for key 1
Voici un extrait de mon code :

Code : Tout sélectionner

if ($sql = '1062') echo "Vous avez déjà répondu au questionnaire"; // si un champ est vide, on affiche le message d'erreur if (strlen($message) > strlen($msg_erreur)) { echo $message; // sinon c'est ok } else { foreach($_POST as $index => $valeur) { $$index = mysql_real_escape_string(trim($valeur)); } $computername=$_POST['computername']; $computername = $_ENV["COMPUTERNAME"];; $rubriquesconsult = $_POST['rubriquesconsult']; $sqlrubriquesconsult = ''; $rubriquesconsult = $_POST['rubriquesconsult']; $sqlrubriquesconsult = implode(',',$rubriquesconsult); $servicesconsult = $_POST['servicesconsult']; $sqlservicesconsult = ''; $servicesconsult = $_POST['servicesconsult']; $sqlservicesconsult = implode(',',$servicesconsult); $sql = "INSERT INTO satisfactiondiva VALUES ('$computername', '$nom', '$prenom', '$service', '$quantiteinfos', '$qualiteinfos', '$clarteinfos', '$faciliteutilisation', '$frequenceconsult', '$dureeconsult', '$sqlrubriquesconsult', '$sqlservicesconsult', '$servicecorresp', '$cellulecorresp', '$frequencecreationcontenu', '$outilcomplet', '$souhaits', '$rubriquesaetoffer', '$remarques')"; $res = mysql_query($sql); if ($res) { echo $msg_ok; } else { echo mysql_error(); } } ?>
Une bonne âme aurait-elle une recette miracle pour moi ? Je pense que la solution se trouve dans la fin du code, lorsque je lui demande d'afficher l'erreur my_sql, mais je ne sais pas comment lui dire de n'afficher cette erreur que si elle est différente de l'erreur '1062'...

Encore merci pour votre aide !

par Marjerem » 16 nov. 2007, 15:10

Merci !
ça fonctionne et j'ai même fait évoluer mon code depuis hier : je récupère maintenant le nom de la machine, que j'intègre dans ma base de données en tant que clé primaire pour empêcher qu'une personne ne réponde plusieurs fois à mon questionnaire (c'est destiné à un Intranet de collectivité locale).
J'ai maintenant deux autres soucis, toujours sur ce même code :
-le contrôle sur le nom de la machine se fait correctement, seulement lorsqu'une personne qui a déjà répondu essaie de répondre à nouveau le message suivant lui est renvoyé au moment du traitement de ses réponses
Duplicate entry 'UC30493' for key 1
Je cherche donc à modifier ce message pour lui renvoyer un truc du type "Vous avez déjà répondu à ce questionnaire" ; mais je ne trouve pas...
-mon deuxième souci, c'est que je voudrais qu'une fois le traitement effectué (qu'il se soit bien passé ou non), la fenêtre se ferme automatiquement ; là encore, je ne trouve pas...

Si quelqu'un a un tuyau...

Encore merci ! Cette communauté est décidément active est pleine de gens de bonne volonté. Et ça, c'est une chance pour les débutants comme moi...!

par Ryle » 15 nov. 2007, 20:16

Il y a une petite erreur dans le code de Berzemus, l'as tu vu et corrigé ?
$sqlservicesconsult = implode(',',$rubriquesconsult);
// devrait être 
$sqlservicesconsult = implode(',',$servicesconsult);
Sinon une petite remarque personnelle, lorsque tu utilises des nom de variables avec plusieurs mots, je te recommande de mettre en majuscule la première lettre de chaque nouveau mot :
$servicesConsult
$sqlServicesConsult
Perso je trouve ça plus lisible :)

par Invité » 15 nov. 2007, 17:36

Merci beaucoup !
C'est presque ça, il ne me reste qu'un souci : il me ramène les infos concernant 'rubriquesconsult', mais le champ 'servicesconsult' reste vide, même si je le remplis (j'ai corrigé le dernier '$rubriquesconsult' par '$servicesconsult').
Qu'est-ce que t'en penses ?

par Berzemus » 15 nov. 2007, 15:30

Je me suis mal expliqué je crois..

remplace plutôt tes deux boucles par ceci (implode() c'est pratique):
$rubriquesconsult = $_POST['rubriquesconsult'];
$sqlrubriquesconsult = implode(',',$rubriquesconsult);

$servicesconsult = $_POST['servicesconsult'];
$sqlservicesconsult = implode(',',$rubriquesconsult);
:wink:

(si c'est bien le contenu de ces deux talbeaux que tu veux instérer dans ta base.. (ce qui n'est pas 'optimal' niveau normalisation, ceci dit, mais si ça marche pour toi, pourquoi pas).

par Marjerem » 15 nov. 2007, 15:15

Alors j'ai suivi ton conseil et voilà ce que ça me donne :
Notice: Array to string conversion in c:\program files\easyphp1-8\www\traitement_formulaire_diva.php on line 46
Merci d'avoir répondu à ce questionnaire. L'équipe DIVA vous souhaite une bonne journée !INSERT INTO satisfactiondiva VALUES ('', 'retest9', 'retest8', 'reservice test8', 'moyenne', 'moyenne', 'bonne', 'tresmauvaise', 'unefoisparsemaine', 'trentesecondesadeuxminutes', 'annuaire', 's,, ', 'drh', 'comptabilite', 'unefoisparsemaine', 'non', 'tyreyace\r\njercftuacr a\r\nyuvtrcuyazetbrc\r\nyzetriyazbcra\r\nauizetbrazcrna\r\nyueribtacntra\r\nzurtbcituanr\r\naioerèynioayvta', 'tyreyace\r\njercftuacr a\r\nyuvtrcuyazetbrc\r\nyzetriyazbcra\r\nauizetbrazcrna\r\nyueribtacntra\r\nzurtbcituanr\r\naioerèynioayvta', 'tyreyace\r\njercftuacr a\r\nyuvtrcuyazetbrc\r\nyzetriyazbcra\r\nauizetbrazcrna\r\nyueribtacntra\r\nzurtbcituanr\r\naioerèynioayvta')
Je te donne mes lignes de code :
$servicesconsult = $_POST['servicesconsult'];
$sqlservicesconsult = '';
for ($i=0; $i<count($servicesconsult); $i++)
{
	$sqlservicesconsult .=$servicesconsult[$i].',';
	$sqlservicesconsult .= ', ';
}

par Berzemus » 15 nov. 2007, 14:24

je repère un bug la:
for ($i=0; $i<count($servicesconsult); $i++)
{
    $sqlservicesconsult .=$servicesconsult[$i];
    $servicesconsult .= ', ';
} 
Ce serait pas $sqlservicesconsult.= ', '; au lieu de $servicesconsult.= ', ';, par hasard ?

Si oui, remplace plutôt la permière ligne de ton for par
$sqlservicesconsult .=$servicesconsult[$i].','; 
Quand on peut raccourcir le code sans trop de difficultés, ça évite des erreurs, et c'est plus clair.

par Marjerem » 15 nov. 2007, 13:08

J'ai inséré un
echo $sql
pour voir ce que ça donne et voilà le message que j'ai reçu en retour :
Notice: Array to string conversion in c:\program files\easyphp1-8\www\traitement_formulaire_diva.php on line 46
Merci d'avoir répondu à ce questionnaire. L'équipe DIVA vous souhaite une bonne journée !INSERT INTO satisfactiondiva VALUES ('', 'test7', 'test7', 'service test6', 'moyenne', 'moyenne', 'bonne', 'tresmauvaise', 'unefoisparsemaine', 'trentesecondesadeuxminutes', 'annuaire', 's', 'drh', 'comptabilite', 'unefoisparsemaine', 'non', 'tyreyace\r\njercftuacr a\r\nyuvtrcuyazetbrc\r\nyzetriyazbcra\r\nauizetbrazcrna\r\nyueribtacntra\r\nzurtbcituanr\r\naioerèynioayvta', 'tyreyace\r\njercftuacr a\r\nyuvtrcuyazetbrc\r\nyzetriyazbcra\r\nauizetbrazcrna\r\nyueribtacntra\r\nzurtbcituanr\r\naioerèynioayvta', 'tyreyace\r\njercftuacr a\r\nyuvtrcuyazetbrc\r\nyzetriyazbcra\r\nauizetbrazcrna\r\nyueribtacntra\r\nzurtbcituanr\r\naioerèynioayvta')
En fait, il ne me renvoie toujours qu'une seule valeur 'annuaire' (alors que plusieurs ont été saisies) et pour le champ d'après, il me renvoie 's' qui ne corresponda à rien (en fait, je devrais avoir une liste de 3 services correspondant aux trois cases cochées dans le formulaire).
Tu vois d'où ça pourrait venir ?

par Marjerem » 15 nov. 2007, 12:51

merci, je vais corriger pour ma deuxième erreur.