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

problème complex... [Input et BDD] - PHP - Programmation

Marsh Posté le 28-03-2013 à 11:18:01    

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();
  }
 ?>

Reply

Marsh Posté le 28-03-2013 à 11:18:01   

Reply

Marsh Posté le 28-03-2013 à 11:27:57    

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
Reply

Marsh Posté le 28-03-2013 à 11:30:46    

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()?>/>

Reply

Marsh Posté le 28-03-2013 à 11:33:54    

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
Reply

Marsh Posté le 28-03-2013 à 11:41:22    

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
Reply

Marsh Posté le 28-03-2013 à 11:44:12    

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


---------------
Origin / PSN / Steam / Uplay : x1fr - bnet : Fab#2717
Reply

Marsh Posté le 28-03-2013 à 11:48:10    

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.

Reply

Marsh Posté le 28-03-2013 à 12:01:13    

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
Reply

Marsh Posté le 28-03-2013 à 12:09:53    

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
Reply

Marsh Posté le 28-03-2013 à 12:32:28    

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" !

Reply

Marsh Posté le 28-03-2013 à 12:32:28   

Reply

Marsh Posté le 28-03-2013 à 13:50:13    

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
Reply

Marsh Posté le 28-03-2013 à 13:56:36    

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();
  }
 ?>

Reply

Marsh Posté le 28-03-2013 à 15:00:24    

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 ?

Reply

Marsh Posté le 28-03-2013 à 16:24:52    

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
Reply

Marsh Posté le 28-03-2013 à 16:32:48    

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
Reply

Marsh Posté le 28-03-2013 à 18:10:50    

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

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed