Aller au contenu

Petit problème avec ORDER BY mysql/php


Messages recommandés

Bonjour à tous,

J'suis actuellement en train de retravaillé le code d'une page php qui est censé affiché le contenu de différentes bases de données. Les objets à rajouter sont une module de recherche dans la table complète ou une de ses colonnes, ainsi qu'un tris par ordre alphabétique ou contre ordre et parail pour les numériques. Jusque là pas de problème sauf pour le tris d'une colonne bien spécifique. Celle-ci contient des adresse IP, et lorsque je fais un tris par ordre j'ai par exemple les adresses dans cette ordre:

152.169.3.6

20.6.3.4

214.36.9.15

26.36.59.4

au lieu de

20.6.3.4

26.35.59.4

152.169.3.6

214.36.9.15

Comment puis-je faire pour que tout s'affiche dans l'ordre croissant ?

voici-le code de la page principale:

<?

// Prepatatin lis

$list = '<select name="where">';

foreach ($listbdd as $num => $bdd) {

$list .= '<optgroup label="'.$bdd.'">';

foreach($listtable[$bdd] as $nun => $table) {

$list .= '<option value="'.$bdd.'.'.$table.'">'.$table.'</option>';

}

$list .= '</optgroup>';

}

$list .= '</select>';

//requete sql...

if(!isset($_POST['where']) AND empty($_POST['where'])) {

if(isset($_SESSION['db']) AND !empty($_SESSION['db']) AND isset($_SESSION['ta']) AND !empty($_SESSION['ta'])){

$_POST['where'] = $_SESSION['db'].'.'.$_SESSION['ta'];

}

}

// WHEN POST COME

if(isset($_POST['where']) AND !empty($_POST['where']) OR isset($_GET['page'])) {

$where = mysql_real_escape_string($_POST['where']);

list($db, $table) = explode(".",$where);

mysql_select_db($db)or die ('Erreur_connect : '.mysql_error());

$_SESSION['db'] = $db;

$_SESSION['ta'] = $table;

$nombreDeMessagesParPage = 30;

$retour = mysql_query('SELECT COUNT(*) AS nb_messages FROM '.$table)or die ('Erreur1 : '.mysql_error());

$donnees = mysql_fetch_array($retour);

$totalDesMessages = $donnees['nb_messages'];

$nombreDePages = ceil($totalDesMessages / $nombreDeMessagesParPage);

if (isset($_GET['page'])) {

$page = htmlentities($_GET['page']);

}

else {

$page = 1;

}

$premierMessageAafficher = ($page - 1) * $nombreDeMessagesParPage;

$tot_champ = '';

$likedo = '';

$nombre_champ = count($listchamp[$table]);

for ($numero = 0; $numero < $nombre_champ; $numero++) {

($numero == $nombre_champ-1) ? $virgule = '' : $virgule =',';

$tot_champ .= $listchamp[$table][$numero].$virgule;

$or = ($numero == 0)? '': 'OR ';

$li = (isset($_SESSION['like']) AND !empty($_SESSION['like'])) ? $_SESSION['like'] : '';

$likedo .= ' '.$or.$listchamp[$table][$numero].$li;

}

$_POST['choix'] = null;

$_SESSION['dbOld'] = (isset($_SESSION['dbOld']) AND !empty($_SESSION['dbOld'])) ? $_SESSION['dbOld'] : '';

if($_SESSION['dbOld'] != $db){

$_SESSION['order'] = null;

$_SESSION['like'] = null;

$_SESSION['choix'] = null;

$_SESSION['order1'] = null;

}

if(isset($_SESSION['order']) AND !empty($_SESSION['order'])){

$order = $_SESSION['order'];

$rqt = mysql_query('SELECT * FROM '.$table.$order.' LIMIT '.$premierMessageAafficher.', '.$nombreDeMessagesParPage)or die ('Erreur2: '.mysql_error());

$_SESSION['dbOld'] = $db;

}

else{

$rqt = mysql_query('SELECT * FROM '.$table.' LIMIT '.$premierMessageAafficher.', '.$nombreDeMessagesParPage)or die ('Erreur3: '.mysql_error());

$_SESSION['dbOld'] = $db;

}

if(isset($_SESSION['like']) AND !empty($_SESSION['like'])){

if(isset($_SESSION['choix']) AND $_SESSION['choix']=='ALL'){

$order = (isset($_SESSION['order']) AND !empty($_SESSION['order'])) ? $_SESSION['order'] : '';

$rqt = mysql_query('SELECT * FROM '.$table.' WHERE '.$likedo.$order.' LIMIT '.$premierMessageAafficher.', '.$nombreDeMessagesParPage)or die ('Erreur4: '.mysql_error());

$_SESSION['dbOld'] = $db;

}

else{

$order = (isset($_SESSION['order']) AND !empty($_SESSION['order'])) ? $_SESSION['order'] : '';

$ch = (isset($_SESSION['choix']) AND !empty($_SESSION['choix'])) ? $_SESSION['choix'] : '';

$rqt = mysql_query('SELECT * FROM '.$table.' WHERE '.$ch.' '.$_SESSION['like'].$order.' LIMIT '.$premierMessageAafficher.', '.$nombreDeMessagesParPage)or die ('Erreur5: '.mysql_error());

$_SESSION['dbOld'] = $db;

}

}

$menu = '<select name="choix"> <option value="ALL"> ALL </option>';

for ($numero = 0; $numero < $nombre_champ; $numero++) {

$menu .= '<option value="'.$listchamp[$table][$numero].'">'.$listchamp[$table][$numero].'</option>';

}

$menu .= '</select>';

$debut_contenu = '

<form action="index.php?nav=action&action=search" method="post">

<input type="text" name="keyword" value="Key word"/>

'.$menu.'

<input type="submit" value="Search"/>

</form>

<div align="right"><a href="index.php?nav=action&action=add&table='.$table.'"><img src="design/images/b_new.png" alt="" border="0" /></a></div>

<table width="100%"><tr style="text-align: center; background-color: #d3dce3; font-size: 16px; font-weight: bold;"><td colspan="3">Action</td>';

for($numero = 0; $numero < $nombre_champ; $numero++){

$debut_contenu .= '<td><a href="index.php?nav=action&action=order&table='.$table.'&value='.$listchamp[$table][$numero].'">'.$listchamp[$table][$numero].'</a></td>';

}

$debut_contenu .= '</tr>';

$milieu_contenu = '<form action="index.php?nav=action" method="POST">';

$color1 = '#e5e5e5';

$color2 = '#d5d5d5';

$tmp = '';

$id = '';

while($row = mysql_fetch_array($rqt)){

($tmp == $color1) ? $tmp=$color2 : $tmp=$color1;

$milieu_contenu .= '<tr style="background-color: '.$tmp.';" onclick="this.style." onmouseover="this.style.background=\'#f5f5f5\'" onmouseout="this.style.background=\''.$tmp.'\'">

<td><a href="index.php?nav=action&action=del&table='.$table.'&value='.$row[$cleid[$table]].'"><img src="design/images/b_drop.png"alt="" border="0" /></a></td>

<td><a href="index.php?nav=action&action=update&table='.$table.'&value='.$row[$cleid[$table]].'"><img src="design/images/b_edit.png" alt="" border="0" /></a></td>

<td><input type="checkbox" id="'.$id.'" name="selection[]" value="'.$row[$cleid[$table]].'" /></td>

';

for($numero = 0; $numero < $nombre_champ; $numero++){

$milieu_contenu .= '<td>'.$row[$listchamp[$table][$numero]].'</td>';

}

$milieu_contenu .= '</tr>';

$id ++;

}

$fin_contenu = '</tr></table>';

$total_contenu = $debut_contenu.$milieu_contenu.$fin_contenu.'

<div align="left">

<a href="#">Select All </a> / <a href="#">Deselect All </a>

<br /> <i> For selection :</i> <input type="hidden" name="table" value="'.$table.'" /><input type="submit" name="delete" value="Delete" /> </form>

</div>';

$nav = 'Page : ';

for ($i = 1 ; $i <= $nombreDePages ; $i++) {

$nav .= '<a href="index.php?nav=home&page=' . $i . '&table='.$table.'">' . $i . '</a> ';

}

$nom = '<legend>'.$db.'.'.$table.'</legend>';

}

// IF NOT COME BY POST

else {

$total_contenu = '';

$table ='';

$nav = '';

$nom = '';

}

// PRINTING

echo '

<div id="central">

<div style="text-align :right; margin : 5px;"><form action="index.php?nav=home" method="POST"> '.$list.' <input type="submit" value="go" /></form></div>

<fieldset>'.$nom.'

'.$total_contenu.'

</fieldset>

<div id="lien">

'.$nav.'

</div>

</div>

';

?>

Lien vers le commentaire
Partager sur d’autres sites

C'est un peu normal que ca te sorte ca, tu fais un tri sur une chaine.

Il aurait fallu les stocker chacun dans un champ, si il y a pas mal d'opération de tri dessus, ca aurait été mieux.

Sinon, tu peux simuler en extrayant les 4 nombres et en faisant le tri sur ces colonnes temporaires :

Ex, sur une table 'PCI' où l'ip est stocké dans le champ 'IP'

SELECT * FROM (
SELECT *, CAST(SUBSTRING_INDEX(IP,'.',1) AS UNSIGNED) AS IP1, CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(IP,'.',2),'.',-1) AS UNSIGNED) AS IP2, CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(IP,'.',-2),'.',1) AS UNSIGNED) AS IP3, CAST(SUBSTRING_INDEX(IP,'.',-1) AS UNSIGNED) AS IP4
FROM pci
) AS temp
ORDER BY IP1 ASC, IP2 ASC, IP3 ASC, IP4 ASC

Un peu bourrin, c'est sans doute pas le mieux xD

Je te laisse adapter ca dans ton code :D

Lien vers le commentaire
Partager sur d’autres sites

un problème que j'ai oublié de spécifier, c'est queje ne peux pas écrire le code pour une base de donnée fixe, cette inferfaces se connecte a un serveur sql et liste toutes les bases de données spécifiée dans le fichier de conf, et je peux switcher dynamiquement d'une base de donnée à l'autre je n'ai pas uniquement une table contenant des noms associé a des ip :s c'est là que se pose aussi le problème

Lien vers le commentaire
Partager sur d’autres sites

Salut,

Si tu ne peux pas écrire ce que te conseille Spaz001 en SQL, tu peux le faire en PHP... Le principe reste le même: tu découpes chaque IP en 4 blocs, en te servant des points somme séparateur (y a la fonction 'explode' pour ça).

Ensuite tu compares tes tableaux d'IP (un tableau ayant 4 cases, chacune contenant un bloc de l'IP), bloc par bloc.

Donc tu tries selon la valeur du premier bloc, puis du 2°, puis du 3° puis du 4°

Lien vers le commentaire
Partager sur d’autres sites

ça va, tout fonctionne !! merci bien pour le coup de main

pour ce qui est du "dynamisme", je crée un array dans lequel je rentre les nom de colonne qui possèdent des adresses ip, et ainsi avec un simple test sur l'array tt va bien !! encore merci à vous

par contre j'ai un petit problème avec mon test sur l'array

dans un fichier je le crée de cette manière

$ipTest = array('ip', 'IP');

et pour mon test sur cette array je fait

if(in_array($MaVariable, $ipTest)){

}

et j'ai un message d'erreur lorsque je fais ça

Lien vers le commentaire
Partager sur d’autres sites

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...