Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1510 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

  [Input et BDD] problème complex...

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[Input et BDD] problème complex...

n°2182921
genhome
Posté le 28-03-2013 à 11:18:01  profilanswer
 

Bonjour à tous,
 
Après maintes recherches, ici et ailleurs, je dois avouer que je sèche sur mon sujet.
 
Dans les fait, je construis une page (php) qui va récupérer des données (mysql) pour les afficher dans un tableau.
Jusque là, rien de bien méchant, et tout fonctionne.
 
Le code n'est probablement pas très beau (mise en forme du tableau d'affichage html dans une boucle while php), mais le résultat est bien là.
 
Histoire de corser la chose, je souhaite ajouter un bouton sur chaque ligne, qui me permettra d'influer sur les données de ma BDD.
 
Le bouton s'affiche bien, la requête UPDATE paraît fonctionnelle dans l'outil de gestion SQL, mais voilà... lorsque je clique sur le bouton construit et bien affiché, la requête associée ne s’exécute pas.
 
Quelqu’un aurait-il une idée pour m'aider ?
 
<-- boucle de création du tableau avec ajout du bouton -->
while($data = mysql_fetch_assoc($tableau))
    {
    $req_update[$data['Index']] = 'UPDATE table SET Date_fin="'.date('Y-m-d H:i:s').'" WHERE Id_Creator="'.$data['Id_Creator'].'" AND Date_init="'.$data['Date_init'].'"';
    echo '<tr><td>ouvert</td><td>'.$data['Id_Creator'].'</td><td>'.'</td><td>'.$data['Description'].
    '</td><td>'.$data['Date_init'].'</td><td>'.$data['Date_fin']. '</td><td align=center><input type="button" name="INC'.$data['Index'].
    '" id="ID'.$data['Index'].'" value="Fermer" onclick=<?php Cloture('.$data['Index'].')?></td></tr>';
    }

 
<-- fonction appelée sur onclick -->
<?php
 function Cloture($Num)
  {
  $bdd = mysql_connect('user', 'mdp', '') or die ('Erreur de connexion à MySQL');
  mysql_select_db('base', $bdd) or die ('Erreur de connexion à la base');
  mysql_query($req_update[$Num]);
  mysql_close();
  }
 ?>

mood
Publicité
Posté le 28-03-2013 à 11:18:01  profilanswer
 

n°2182925
x1fr
Posté le 28-03-2013 à 11:27:57  profilanswer
 

tu ne peux pas mixer du code qui est exécuté par le client (onclick)
et du code qui est exécuté sur le serveur (Cloture)


---------------
Origin / PSN / Steam / Uplay : x1fr - bnet : Fab#2717
n°2182926
genhome
Posté le 28-03-2013 à 11:30:46  profilanswer
 

En fait, cela fonctionne sur une autre partie de ma page dans laquelle j'appelle également une fonction php pour alimenter une table mysql.
 
La seule différence est que l'input utilisée dans le second cas n'est pas créée dans du php...
 
ceci fonctionne normalement :
<input type="submit" name="Valider" id="Valider" value="Valider" onclick=<?php Ajout()?>/>

n°2182927
x1fr
Posté le 28-03-2013 à 11:33:54  profilanswer
 

Ben les fonctions Ajout et Cloture sont exécutées sur le serveur au moment de la génération de la page, je ne vois pas comment c'est possible autrement


---------------
Origin / PSN / Steam / Uplay : x1fr - bnet : Fab#2717
n°2182928
genhome
Posté le 28-03-2013 à 11:41:22  profilanswer
 

Dans la partie fonctionnelle, c'est également à l'appel de la fonction Ajout() que l'ouverture et la fermeture de la base interviennent.
 
Cela ne pose pas de problème au script ^^
 
 function Ajout()
  {
  $bdd = mysql_connect('user', 'mdp', '') or die ('Erreur de connexion à MySQL');
  mysql_select_db('base', $bdd) or die ('Erreur de connexion à la base');
 mysql_query('INSERT INTO table(Id_Creator, Client, Description, Date_init) VALUES ("'.@$_POST['Creator'].'", "'.@$_POST['Menu'].'", "'.@$_POST['Description'].'", "'.@$_POST['Horodatage'].'" )');  
  mysql_close();
  }


Message édité par genhome le 28-03-2013 à 11:41:47
n°2182930
x1fr
Posté le 28-03-2013 à 11:44:12  profilanswer
 

Et t'as pas des lignes avec des champs vides?


---------------
Origin / PSN / Steam / Uplay : x1fr - bnet : Fab#2717
n°2182931
genhome
Posté le 28-03-2013 à 11:48:10  profilanswer
 

Dans l'update, la fonction ne met à jour qu'une valeur de la ligne concernée.
 
Cela ne pose pas de problème dans l'interpréteur MYSQL et se traduit bien par la mise à jour demandée dans ma base.

n°2182935
x1fr
Posté le 28-03-2013 à 12:01:13  profilanswer
 

OK je pense saisir un peu mieux.

 

Concernant la fonction Ajout, si elle fonctionne c'est par hasard. Tu penses l'appeler en cliquant sur le bouton, mais elle devrait en réalité appelée à chaque chargement de la page.

 

Tu affiches une première fois ta page : $_POST est vide, la fonction Ajout est appelée et devrait insérer une ligne vide. Tu cliques sur le bouton ajout, la page est rechargée du fait du clic sur le submit (c'est ça qui force le hasard :p) mais cette fois le $_POST est renseigné et l'insertion se passe bien.

 

Pour prouver que le code client ne fait rien il faudrait afficher le code source de la page.
tu devrais trouver :

Code :
  1. <input type="submit" name="Valider" id="Valider" value="Valider" onclick=/>
 


Concernant la mise à jour, ton appel

Code :
  1. <?php Cloture('.$data['Index'].')?>
 

N'est pas appelé car ce n'est tout simplement pas du php. Ce code est contenu dans un string et du coup c'est le code du bouton update généré qui devrait ressembler à (dans le code source de la page):

 
Code :
  1. <td align=center><input type="button" name="INCXXX" id="IDYYY" value="Fermer" onclick=<?php Cloture(ZZZ)?></td>
 

(au passage la balise input n'est pas fermée)

 

Si le code php du bouton update avait été sorti du string, l'update aurait eu lieu à chaque affichage de la page systématiquement, sans meme cliquer sur le bouton


Message édité par x1fr le 28-03-2013 à 12:04:44

---------------
Origin / PSN / Steam / Uplay : x1fr - bnet : Fab#2717
n°2182939
x1fr
Posté le 28-03-2013 à 12:09:53  profilanswer
 

Essaye de lancer la requete
 

Code :
  1. Select count(*) from table where client = ''


 
Pour vérifier qu'il y a bien des lignes vides dans ta table.
 
Si la requete te retourne plus que 0 c'est que c'est bien ça


---------------
Origin / PSN / Steam / Uplay : x1fr - bnet : Fab#2717
n°2182942
genhome
Posté le 28-03-2013 à 12:32:28  profilanswer
 

Il n'y a effectivement pas de hasard dans la page ^^
 
Le fonctionnement est conforme à ce que je veux faire.
J'ai supprimé, pour simplifier ici, les tests conditionnels de la fonction d'Ajout().
 
Mon but, est d'avoir une seule page pour l'ensemble des fonction.
Lorsque je valide, la page est donc rechargée, et les valeurs remises à zéro.
 
Par ailleurs, les ouvertures/fermutres de BDD se font dans les fonctions pour éviter d'avoir des insertions parasites lors du rechargement de la page par l'utilisateur, sans qu'il ait modifié quoi que ce soit.
 
ps : j'ai bien vu que la balise input n'était pas fermée, mais pour une raison que j'ignore (et ne comprends pas), lorsque je ferme la balise, le tableau affiche un "/>" après chaque bouton "Fermer" !

mood
Publicité
Posté le 28-03-2013 à 12:32:28  profilanswer
 

n°2182963
x1fr
Posté le 28-03-2013 à 13:50:13  profilanswer
 

Ben écoute je ne peux pas t'en dire plus avec les éléments à disposition, mais une chose est sûre c'est que tu ne peux pas appeler du php depuis ton bouton html (en tout cas pas de cette manière). Preuve en est, ce qui fonctionne pour un bouton ne fonctionne pas pour l'autre.
 
On peut voir la page quelque part? et le code source complet?


---------------
Origin / PSN / Steam / Uplay : x1fr - bnet : Fab#2717
n°2182965
genhome
Posté le 28-03-2013 à 13:56:36  profilanswer
 

Ce qui fonctionne :
<!-- Bouton de validation -->
 <input type="submit" name="Valider" id="Valider" value="Valider" onclick=<?php AjoutAlerte()?>/>
 
 <!-- Fonction d'ajout d'incident -->
 <?php
 function AjoutAlerte()
  {
  $bdd = mysql_connect('monuser', 'monmdp', '') or die ('Erreur de connexion à MySQL');
  mysql_select_db('alertes_sd', $bdd) or die ('Erreur de connexion à la base');
  if (@$_POST['Creator'] != NULL AND @$_POST['Creator'] != "créateur" )
   {
   mysql_query('INSERT INTO alertes (Id_Creator, Client, Description_Alerte, Date_init) VALUES ("'.@$_POST['Creator'].'", "'.@$_POST['Menu'].'", "'.@$_POST['DescAlerte'].'", "'.@$_POST['Horodatage'].'" )');  
   @$_POST['Creator'] = "créateur";
   @$_POST['DescAlerte'] = "description de l'incident";
   @$_POST['Horodatage'] = date('Y-m-d H:i:s');
   }
  else
   {
   $req_ajout = "";
   }
  mysql_close();
  }
 ?>

 
Ce qui ne fonctionne pas (inclue dans une form):
 <?php
   $bdd = mysql_connect('monuser', 'monmdp', '') or die ('Erreur de connexion à MySQL');
   $req_affichage = 'SELECT * FROM alertes WHERE Date_fin = "0000-00-00 00:00:00"';
   mysql_select_db('alertes_sd', $bdd) or die ('Erreur de connexion à la base');
   $tableau_alertes = mysql_query($req_affichage) or die ('Erreur dans la requête SQL');
 
   while($data = mysql_fetch_assoc($tableau_alertes))
    {
    $req_update[$data['Index']] = 'UPDATE alertes SET Date_fin="'.date('Y-m-d H:i:s').'" WHERE Id_Creator="'.$data['Id_Creator'].'" AND Date_init="'.$data['Date_init'].'"';
    echo '<tr><td>ouvert</td><td>'.$data['Id_Creator'].'</td><td>'.
    $data['Client'].'</td><td>'.$data['Description_Alerte'].
    '</td><td>'.$data['Date_init'].'</td><td>'.$data['Date_fin'].
    '</td><td align=center><input type="button" name="INC'.$data['Index'].
    '" id="ID'.$data['Index'].'" value="Fermer" onclick=<?php ClotureAlerte('.$data['Index'].')?></td></tr>';
    }
   mysql_close();
  ?>
 </table>
 
 <!-- Fonction de clôture d'alerte -->
 <?php
 function ClotureAlerte($NumAlerte)
  {
  $bdd = mysql_connect('monuser', 'monmdp', '') or die ('Erreur de connexion à MySQL');
  mysql_select_db('alertes_sd', $bdd) or die ('Erreur de connexion à la base');
  mysql_query($req_update[$NumAlerte]);
  mysql_close();
  }
 ?>

n°2182979
genhome
Posté le 28-03-2013 à 15:00:24  profilanswer
 

Je progresse, même si cela ne fonctionne pas encore.
 
Le soucis semblant venir, principalement, de le bouton mal créé, je tente de ne lui faire faire aucune action, si ce n'est un bête "submit(this)".
 
La fonction pourrait alors être appelée par la forme elle-même !
 
Cela vous paraît-il possible ?

n°2182999
rufo
Pas me confondre avec Lycos!
Posté le 28-03-2013 à 16:24:52  profilanswer
 

Pour faire ce que tu veux, faut du ajax. Comme dit initialement, la fonction appelée sur onclick est une fonction php. Or, onclick, c'est du javascript, qui attend donc une fonction js à exécuter. Tu peux faire une fonction JS qui va appeler en ajax une page php qui exécutera ta fonction php par contre.


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
n°2183002
x1fr
Posté le 28-03-2013 à 16:32:48  profilanswer
 

Ben écoute j'ai donné mon point de vue, jusqu'à preuve du contraire ca ne fonctionne pas de manière "classique"
 
Je pense que tu es sauvé par le  

Code :
  1. if (@$_POST['Creator'] != NULL AND @$_POST['Creator'] != "créateur" )


 
Si tu le vires, c'est là que tu risques d'avoir les fameuses lignes vides (ou une erreur) au moment ou tu arrive sur la page pour la première fois.
 
Dans tous les cas je ne te conseille pas de continuer dans cette voie, maintenant tu fais comme tu veux :p


---------------
Origin / PSN / Steam / Uplay : x1fr - bnet : Fab#2717
n°2183036
genhome
Posté le 28-03-2013 à 18:10:50  profilanswer
 

C'est effectivement ce qui sauve ma page.
Sur vos bons conseils, je vais donc me tourner sur l'AJAX ; en y connaissant rien, ça va être sportif ^^
 
Merci à vous


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

  [Input et BDD] problème complex...

 

Sujets relatifs
Créer arborescence depuis BDDprobleme mise a jour de ma base de données
Problème avec mon LoopProblème mise en ligne de mon site, suis je un boulet ???
Problème jointure requête sql.Problème de validation de formulaire
Problème d'affectation ( methode hongroise )problème programmation VBA
Problème de rechercheproblème script PHP
Plus de sujets relatifs à : [Input et BDD] problème complex...


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR