Lister ports disponibles -> donc non utilisés

Lister ports disponibles -> donc non utilisés - PHP - Programmation

Marsh Posté le 04-10-2007 à 18:06:38    

Salut à tous! Voila j'ai un ptit problème de php, et je me suis dit que certains d'entre vous pourraient m'aider a le résoudre :)
 
Voila dans mon site de streaming, je voudrais proposer aux membres de choisir leur port pour leur serveur. Je dois donc, quand ils s'inscrivent, leur donner une liste avec les ports disponibles... j'ai donc décidé de faire ceci (je supprime ici les fonctions genre mysql_connect ou autres qui sont assez inutiles dans mon problème)

Code :
  1. $queryport = mysql_query('SELECT port FROM serveur WHERE port!=""');
  2. while( $port = mysql_fetch_array($queryport)) {
  3. for($i=9000; $i<=9500; $i=$i+2)
  4.  {
  5.   if ( $port['port'] != $i )
  6.    {
  7.         echo '<option value="'.$i.'">'.$i.'</option>';
  8.    }
  9.  }
  10. }


Mais seulement voila, les ports de 9000 à 9500 sont tous affichés, bien que 9000 soit déjà utilisé (dont présent dans la table serveur sous la valeur port), tout comme 9002 etc. Comment faire marcher ma condition if ( $port['port'] != $i )?
 
Voila merci d'avance à vous pour vos éclairages!
 
A bientot!

Reply

Marsh Posté le 04-10-2007 à 18:06:38   

Reply

Marsh Posté le 04-10-2007 à 18:14:09    

Tu prend ton problème à l'envers. Ca ne sert à rien de dire "pour chaque port utilisé, je liste les autres port. Ce qu'il faut que tu fasses c'est :
- solution 1 : créer un tableau contenant la liste des ports utilisés et ensuite pour chaque port encore libre que tu fasses un in_array() pour savoir s'il est pris et ne l'afficher que s'il n'est pas pris
- solution 2 : créer un tableau contenant la liste des ports utilisable et ensuite pour chaque port utilisé le chercher dans la liste pour l'en enlever

Reply

Marsh Posté le 04-10-2007 à 19:39:50    

Salut! Merci pour ta réponse, je crois que j'ai compris que effectivement je prend mon problème à l'envers. Je comprend le principe des tableaux, mais j'ai du mal à la mettre en oeuvre... Voila ce a quoi j'ai pensé pour le moment pour la solution 1:  
On peut partir du principe que mysql_fetch_array retourne le tableau avec les ports utilisés... non? mais après pour la boucle foreach, comment définir de comparer avec chaque nombre d'une tranche? (je n'utilise pas souvent la boucle et les tableaux, je n'en ai pour le moment pas trop eu besoin...) Après quand on compare, on test in_array() et si TRUE, on ne l'affiche pas... Au final on devrait avoir donc l'affichage des ports libres (ceux qui n'ont pas été supprimés) ... Mais je me mélange dans les valeurs.
 
Pour la solution 2 ca me parait bien aussi mais la boucle foreach pose encore problème...

Reply

Marsh Posté le 04-10-2007 à 20:11:29    

chaque nombre d'une tranche ?
 
tu as lu comment utiliser foreach ? ça n'as rien de bien compliqué

Reply

Marsh Posté le 04-10-2007 à 20:15:45    

oui j'ai lu, j'ai fait des essais, mais ça n'a pas l'air de fonctionner je ne dois pas savoir quelle condition vérifier.
 
Chaque nombre d'une tranche: chaque nombre contenu dans l'intervalle (par exemple tous les nombres de 1000 à 2000 en sautant a chaque fois un chiffre: 1000 1002 1004 etc)

Reply

Marsh Posté le 04-10-2007 à 20:21:56    

Orchrist a écrit :

oui j'ai lu, j'ai fait des essais, mais ça n'a pas l'air de fonctionner je ne dois pas savoir quelle condition vérifier.
 
Chaque nombre d'une tranche: chaque nombre contenu dans l'intervalle (par exemple tous les nombres de 1000 à 2000 en sautant a chaque fois un chiffre: 1000 1002 1004 etc)


 de 1000 à 2000 en suatant les ports utilisés:
 

Code :
  1. for($i = 1000; $i <= 2000; $i++) {
  2.     if(in_array($i, $tab_des_ports_utilises)) {
  3.             // action port déja utilisé
  4.     } else {
  5.             // action port libre
  6.     }
  7. }

Reply

Marsh Posté le 04-10-2007 à 20:38:30    

ah oui, ok... pas besoin d'utiliser la fonction foreach dans ce cas là alors...
 
Sinon j'aimerais comprendre comment je peux l'utiliser cette fonction... Dans mon cas ça donnerait quoi?
 
parce que en fait dans tous les exemple des pages de manuel on trouve des trucs comme ça:

Code :
  1. foreach( $array as $item );
  2. unset($item);


 
mais moi je serais plus tenté de supprimer du tableau la valeur $array qui vérifie la condition... Et ensuite quand j'ai mon tableau épuré des ports utilisés, comment afficher chaque valeur dans mes <option value=""> ? car je ne sais plus combien de ports sont restants dans le tableau: je ne peux donc plus utiliser for? (je fais un gros mélange a mon avis, je dois me compliquer l'existence)...

Reply

Marsh Posté le 04-10-2007 à 21:22:43    

Correction boucle infini: réglé...
 
Autre soucis:  

Code :
  1. $port = mysql_fetch_array($queryport);
  2. for($i = 9000; $i <= 9500; $i=$i+2)
  3.  { 
  4.   if(!in_array($i, $port))
  5.    {   ?>
  6.     <option value="<?=$i ?>"><?=$i ?></option>
  7.   <? }
  8.  }


 
J'ai bien tout affiché: mais les ports utilisés ne sont pas enlevés...

Message cité 1 fois
Message édité par Orchrist le 04-10-2007 à 21:26:04
Reply

Marsh Posté le 04-10-2007 à 21:33:24    

Orchrist a écrit :

Correction boucle infini: réglé...
 
Autre soucis:  


fait un echo au lieu de fermer/ouvrir les <?php (question de perfs)
 
que donne echo "<pre>"; print_r($port); echo "</pre>";

Reply

Marsh Posté le 04-10-2007 à 21:41:27    

le echo donne ceci:

Code :
  1. Array
  2. (
  3.     [0] => 15000
  4.     [port] => 15000
  5. )


 
Quand je fais la requete $queryport dans phpmyadmin j'obtiens ceci:
http://img235.imageshack.us/img235/8316/sanstitrefu3.jpg
 
Les autres ports que 9004 et 9100 sont d'autres services avec des ports différents. Ils ne changent donc rien à mon script normalement puisqu'ils sont en dehors de l'intervalle spécifié dans le for.

Message cité 1 fois
Message édité par Orchrist le 04-10-2007 à 21:41:49
Reply

Marsh Posté le 04-10-2007 à 21:41:27   

Reply

Marsh Posté le 04-10-2007 à 21:44:06    

Orchrist a écrit :

le echo donne ceci:


ça te choque pas de dire "J'ai bien tout affiché: mais les ports utilisés ne sont pas enlevés..." alors que tu essai "d'enlever" 15000 dans la suite de 9000 à 95000 ?

Reply

Marsh Posté le 04-10-2007 à 21:46:40    

ben 15000 n'étant pas contenu dans l'intervalle de la boucle for: on ne teste pas sa présence dans l'array, et on ne l'affiche pas je ne vois pas le soucis...

Reply

Marsh Posté le 04-10-2007 à 21:48:32    

Orchrist a écrit :

ben 15000 n'étant pas contenu dans l'intervalle de la boucle for: on ne teste pas sa présence dans l'array, et on ne l'affiche pas je ne vois pas le soucis...


il n'y a que 15 000 dans le tableau $port. donc ton in_array retourne toujours false.

Reply

Marsh Posté le 04-10-2007 à 21:51:05    

ben justement, c'est pour ça que je t'ai montré ma requete dans phpmyadmin: pourquoi les valeurs que j'obtiens dans phpmyadmin ne sont-elles pas retrouvées dans mon array?
 
la requete mysql:  

Code :
  1. $queryport = mysql_query('SELECT port FROM serveur WHERE port!="" ');


La mise en tableau:

Code :
  1. $port = mysql_fetch_array($queryport);


 
L'affichage de echo "<pre>"; print_r($port); echo "</pre>";

Code :
  1. Array
  2. (
  3.     [0] => 15000
  4.     [port] => 15000
  5. )

Reply

Marsh Posté le 04-10-2007 à 22:02:06    

mysql_fetch_array il faut l'effectuer en boucle.

Reply

Marsh Posté le 04-10-2007 à 22:04:55    

j'avais essayé avec while:

Code :
  1. $queryport = mysql_query('SELECT port FROM serveur WHERE port!=""');
  2. while($port = mysql_fetch_array($queryport))
  3.  {
  4.   for($i = 9000; $i <= 9500; $i=$i+2)
  5.    { 
  6.     if(!in_array($i, $port))
  7.      {   ?>
  8.       <option value="<?=$i ?>"><?=$i ?></option>
  9.     <? }
  10.    }
  11.  }


 
Retour de echo "<pre>"; print_r($port); echo "</pre>"; : on obtient: <pre></pre> aucun array... Ca doit venir de la propriété de fetch array... Je pensais rentrer chaque valeur retournée par while($port = mysql_fetch_array($queryport)) dans un tableau, on en créé donc un petit a petit, pour etre sur que ça marche, mais c'est compliqué je pense ^^  :pt1cable:

Message cité 1 fois
Message édité par Orchrist le 04-10-2007 à 22:06:52
Reply

Marsh Posté le 04-10-2007 à 22:10:03    

Orchrist a écrit :

j'avais essayé avec while:


tu le met ou ton print_r ?
 
fais d'abord ton tableau de ports "fermés" et ensuite fait ta boucle de 9000 à 95000.  
 
et retire les ?> <? ?> <? ?>

Reply

Marsh Posté le 04-10-2007 à 22:10:55    

c'est justement faire le tableau de ports fermés qui pose soucis! Comment dois-je la faire? Le print_r est après la boucle for


Message édité par Orchrist le 04-10-2007 à 22:11:13
Reply

Marsh Posté le 04-10-2007 à 22:12:24    

array_push par exemple

Reply

Marsh Posté le 04-10-2007 à 22:14:38    

d'ailleurs fetch plutot un row, y a pas d'interet a chopper un raay ici

Reply

Marsh Posté le 04-10-2007 à 22:16:51    

Andouille que je suis... (oublié les caractéristiques d'output de mysql_fetch_row)  :pt1cable:  voila Tout marche:

Code :
  1. $port = array ('first');
  2. while($ports = mysql_fetch_row($queryport))
  3.  {
  4.  array_push ($port, $ports[0]);
  5.  }


 
J'arrive à ma liste avec les ports utilisés supprimés...  :love:  
 
Merci beaucoup a toi de m'avoir supporté, je suis vraiment à la masse  :(  
 
Je ne sais toujours pas comment faire pareil avec un foreach, mais là ça marche  :sweat: merci encore  :)  
 
Bonne nuit :)

Message cité 1 fois
Message édité par Orchrist le 04-10-2007 à 22:27:14
Reply

Marsh Posté le 04-10-2007 à 22:35:07    

Orchrist a écrit :

Andouille que je suis... (oublié les caractéristiques d'output de mysql_fetch_row)  :pt1cable:  voila Tout marche:


ben je peux t'expliquer comment se servir d'un foreach si tu le veuz'

Reply

Marsh Posté le 05-10-2007 à 18:33:42    

ben je voudrais bien oui, car j'aimerais vraiment savoir :) ça pourrait me servir! les exemples donnés sur la page officielle sont vraiment nuls... par exemple je ne comprend pas ce genre de choses:

Code :
  1. foreach( $myArray as $key => $element ) {
  2.   $element =& $myArray[$key];
  3.   echo $element;
  4. }


 
En effet ils ne mettent pas de tableau pour lequel on peut l'appliquer et ils ne montrent pas ce qu'on obtient avec un exemple précis (je marche assez bizarrement comme pour mes cours de médecine: il me faut des exemples précis, que je peux comprendre et réappliquer).
 
Voila :) merci a toi en tout cas :)

Reply

Marsh Posté le 05-10-2007 à 18:59:16    

Orchrist a écrit :

ben je voudrais bien oui, car j'aimerais vraiment savoir :) ça pourrait me servir! les exemples donnés sur la page officielle sont vraiment nuls... par exemple je ne comprend pas ce genre de choses:


foreach te permet de parcourir un tableau (equivalent à une boucle for, de 0 à n-1 éléments)
 

Code :
  1. foreach($tableau as $value)


"pour chaque valeur du tableau"
 
si tu as un tableau contenant 1, 2, 3, et 4, tu aura successivement $value = 1, $value =2, $value= 3, $value =4...
 
maintenant l'extension

Code :
  1. foreach($tableau as $key => $value)


fais la même chose, sauf que contrairement à l'exemple précédent, nous allons utiliser les cles également.  Tu dois savoir ce qu'est une clé, sinon retourne voir ce qu'est un tableau.
en PHP, tu peux utiliser des cles numeriques (normal) ou "texte" (trouve aps le mot). (tu as du déja voir des tableaux du genre $tab["titi"] = "totom";)
 
Ce foreach assigne la cles cles du tableau à $cle et les valeurs correspondantes à $value, en parcourant le tableau  
donc, si tu as un tableau de ce type:
titi => totom, windows => pourri, aujourdhui => vendred, tu aura dans ton foreach, successivement:
 
$cle = titi et $value = totom
$cle = windows et $value = pourri
etc
 
j'ai fais expres de te donner des exemples "parlés", à toi de faire tes propres essais "codés". tu comprendra mieux par toi même, avec des petits exemples sur des tableaux ;)

Reply

Marsh Posté le 05-10-2007 à 19:07:12    

ok je comprend déjà mieux, justement les exemples "parlés" sont parfaits :) Sinon pour ce genre de choses a quoi correspondent-elles?

Code :
  1. $element =& $myArray[$key];

Reply

Marsh Posté le 05-10-2007 à 19:23:28    

Orchrist a écrit :

ok je comprend déjà mieux, justement les exemples "parlés" sont parfaits :) Sinon pour ce genre de choses a quoi correspondent-elles?


ça utilise les references... je t'invite à lire ceci: http://www.journaldunet.com/develo [...] nces.shtml
 
a permet de travailler avec les adresses en mémoire des variables et fonctions, et ne pas copier systématiquement le contenu


Message édité par zecrazytux le 05-10-2007 à 19:24:11
Reply

Marsh Posté le 05-10-2007 à 19:26:19    

Ok merci pour cette précision :) si j'ai un problème de tableaux, je viendrai redemander ici :)

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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