Classer des enregistrements d’une base MySQL

Le contexte

J’ai une base de données qui contient des éléments rangés par catégorie. Chaque élément:

  • possède titre: champ libelle
  • a id unique (entier, non-signé): champ id
  • appartient à une catégorie: champ cat
  • possède un champ pour ordonner (entier, non-signé): ord

Avant, j’utilisais mes enregistrement en les classant par ordre alphabétique. Il m’a été demandé de faire un ordre différent. Du coup, j’ai combiné PHP et Scriptaculous pour que cela soit plus facile à faire. On peut ré-arranger les éléments sur une page HTML par simple glisser-déposer et la base de données est mise à jour derrière.

Mise en garde

J’ai réalisé ce script pour me simplifier la vie mais en aucun cas pour le faire tourner sur un serveur de production (il n’est pas sécurisé, pas paramétrable, …)

Utilisation

Je suppose que dans chacun des deux fichiers sort.php et sort.ajax.php, un tableau $config existe et contient les valeurs suivantes:

  • $config[‘sort_table’]: table à utiliser
  • $config[‘sort_libelle’]: nom du champ qui contient le libellé
  • $config[‘sort_ord’]: requête de tri pour la sélection (par exemple: ord ASC, libelle ASC)
  • $config[‘sort_where’]: éventuelle clause WHERE (si on travaille seulement sur une partie de la table; dans mon cas: cat=5)
  • $config[‘db_host’]: host pour la connexion MySQL
  • $config[‘db_user’]: user pour la connexion MySQL
  • $config[‘db_psw’]: password pour la connexion MySQL
  • $config[‘db_db’]: base de données à utiliser

Fichier principal, sort.php:

<?php
require 'sort.class.php';
$sort = new Sort( );
if( !$sort->MySQLConnect( $config['db_host'], $config['db_user'], $config['db_psw'], $config['db_db'] ) )
	die( '!MySQL Connect' );

$sort->MySQLGetItems( $config['sort_table'], $config['sort_libelle'], $config['sort_ord'], $config['sort_where'] );
?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
	"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">

<head>
	<title>Sort</title>
	<meta http-equiv="content-type" content="text/html;charset=iso-8859-1" />
	<meta name="generator" content="Geany 1.22" />

	<script src="resources/scriptaculous/lib/prototype.js" type="text/javascript"></script>
	<script src="resources/scriptaculous/src/scriptaculous.js?load=builder,effects,dragdrop,controls" type="text/javascript"></script>
</head>

<body>

	<?php
	echo $sort->BuildUL( );
	?>

	<script type="text/javascript">
		    Sortable.create( "sortable", {
				onUpdate: function( ) {

					new Ajax.Request( "sort.ajax.php", {
						method: "post",
						parameters: { data: Sortable.serialize( "sortable" ) }
					} );
				}
			} );
	</script>

</body>

</html>

Fichier sort.class.php:


<?php
class Sort
{
public $error = NULL;
private $items = array( ); // [ ] = id, libelle

public function MySQLConnect( $host, $user, $psw, $db )
{
if( !@mysql_connect( $host, $user, $psw ) || !@mysql_select_db( $db ) )
{
$this->error = 'MYSQL_CONNECT';
return false;
}

return true;
}

public function MySQLGetItems( $table, $libelle, $order, $where )
{
if( !( $ret = mysql_query( 'SELECT id, ' . $libelle . ' FROM ' . $table . ( empty( $where ) ? '' : ' WHERE ' . $where ) . ( empty( $order ) ? '' : ' ORDER BY ' . $order ) ) ) )
{
$this->error = 'GET_DATA';
return false;
}

while( $row = mysql_fetch_row( $ret ) )
$this->items[ ] = $row;
}

public function BuildUL( $ULid = 'sortable', $LIprefix = 'item_' )
{
$buffer = '<ul id="' . $ULid . '">';
foreach( $this->items as $item )
$buffer .= '<li id="' . $LIprefix . $item[0] . '">' . $item[1] . '</li>';

$buffer .= '</ul>';

return $buffer;
}
}
?>

Fichier sort.ajax.php

<?php
require 'sort.class.php';
require 'resources/conf.inc.php';

$config['sort_table'] = 'c_communs';
$config['sort_libelle'] = 'libelle';
$config['sort_ord'] = 'ord ASC, libelle ASC';
$config['sort_where'] = 'cat=5 AND libelle<>\'\'';

if( !isset( $_POST['data'] ) )
	die( '!Data' );

$sort = new Sort( );
if( !$sort->MySQLConnect( $config['db_host'], $config['db_user'], $config['db_psw'], $config['db_db'] ) )
	die( '!MySQL Connect' );

parse_str( $_POST['data'] );

$query = ''; $max = count( $sortable );
for( $i = 0; $i < $max; $i++ )
{
	if( !mysql_query( 'UPDATE ' . $config['sort_table'] . ' SET ord=' . $i . ' WHERE id=' . $sortable[ $i ] ) )
		die( '!Update: ' . 'UPDATE ' . $config['sort_table'] . ' SET ord=' . $i . ' WHERE id=' . $sortable[ $i ] . '<br />' . mysql_error( ) );
}
?>

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *