Une fonction particulière pour extraire le chiffre des unités d'un nombre décima

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Une fonction particulière pour extraire le chiffre des unités d'un nombre décima

par Patriboom » 01 janv. 2008, 22:17

Voici mon code
			$nbre = 10;
			$requete = "SELECT * FROM `commentaires` ORDER BY `dte_com` DESC, id_com DESC";
			$result = mysql_query ($requete,$db);
			$quantite = mysql_numrows($result);
			{
				for ($x=0; $x<$quantite; $x=$x+$nbre) {
				$cedern = $x+$nbre;
				if ($cedern > $quantite) $cedern = $quantite;
				echo '
                                        <a href="compl_compl_3.php?prem='.$x.'">
					<font color="DDDD00">'.
					($x+1).'-'.$cedern.'
					</font>
					</a>
					<br>'
					;
				}
Tu comprends que
$nbre est le d'article par page,
$cedern est une vérification à savoir si on est dans la dernière série
Le lien réfère à la même page, lui indiquant quel article afficher pour commencer.

Et voici le résultat: http://www.cartefoi.net/compl_compl_3.php
(Si je comprends bien ta requête)

par Kaoteknik » 01 janv. 2008, 13:22

S'il s'agit de générer un affichage multipage, je te recommande de lire ce sujet qui devrait t'aider :

http://www.phpfrance.com/forums/voir_sujet-8874.php

Edit : Pour aller plus loin j'ai récemment repris le code de Cyrano pour le réadapter en y adjoignant un formulaire de tri, le tout organisé sous forme de classes d'objets. Etant donné que je débute en POO mes scripts sont susceptibles d'être améliorés en de nombreux points, mais en l'état ça fonctionne néanmoins.

Pour commencer j'ai une classe "class_form_tri.php" qui génère un formulaire de tri suivant les valeurs passées en argument dans le script "index.php".
<?php

class formulaire_tri {
	
	function form_tri ($param_chxppage, $param_ASCDESC, $param_table, $param_champs) {
		// Début du formulaire
		echo 	"<form method=\"GET\" action=\"". $PHP_SELF ."\">";

		// Si le paramètre Nombre de Choix est transmis
		if (isset($param_chxppage) && !empty($param_chxppage)) {
			// Début du menu déroulant correspondant
			echo	"	Nombre de r&eacute;sultats par page : <select name=\"nb_rst\">";

			// Pour chaque nombre du tableau $param_nb_choix
			foreach ($param_chxppage as $nb) {
				// Affichage de l'option correspondante
				echo "<option value=\"". $nb ."\">". $nb ."</option>";
			}

			// Fin du menu déroulant
			echo	"	</select> --- ";
		}

		// Si le paramètre de tri Ascendant et Descendant existe et qu'il a pour valeur True
		if (isset($param_ASCDESC) && $param_ASCDESC == true) {
			// Affichage du menu déroulant correspondant
			echo	"	Trier par ordre : <select name=\"opt1\">".
					"		<option value=\"ASC\">Croissant</option>".
					"		<option value=\"DESC\">D&eacute;croissant</option>".
					"	</select> ";
		}

		// Si le nom des champs ou de la table sont transmis
		if (isset($param_champs) || isset($param_table)) {
			// Si le paramètre de tri ASC/DESC est défini 
			if (isset($param_ASCDESC) && $param_ASCDESC == true) {
				// Affichage du texte " et par "
				$text = " et par ";
			}
			// Sinon
			else {
				// Affichage du texte "Trier par "
				$text = "Trier par ";
			}

			// Début du menu déroulant
			echo $text."<select name=\"opt2\">";

			// Si les champs de la table sont transmis en paramètre
			if (!empty($param_champs)) {
				// On sépare chaque nom de champ et on ajoute des majuscules à la première lettre de chaque mot
				$separation = explode (', ', $param_champs);

				// Pour chaque élément du tableau $separation
				foreach ($separation as $element) {
					if ($element == "numéros d'enregistrements"){
						$format_elem = "id";
					}
					else {
						$format_elem = $element;
					}
					
					// Remplacement du caractère apostrophe (') par un apostrophe suivi d'un caractère d'espacement (' )
					$element = str_replace ('\'', '\' ', $element);
					// Remplacement de la première lettre de chaque mot par sont équivalent en majuscule
					$element = ucwords($element);
					// Remplacement du caractère apostrophe suivi d'un caractère d'espacement (' ) par une apostrophe simple (')
					$element = str_replace ('\' ', '\'', $element);

					// On crée l'option du menu déroulant correspondante
					echo "	<option value=\"". $format_elem ."\">". $element ."</option>";
				}
			}

			// ... Ou alors si la le nom de la table est transmis en paramètre
			elseif (!empty($param_table)) {
				// On liste les champs de la table
				$requete = "DESCRIBE ". $param_table;
				$exec = mysql_query($requete);

				while ($result = mysql_fetch_array($exec)) {
					// On récupère le contenu de chaque élément du tableau $result avant son traitement
					$result_origin = $result['Field'];

					// Si la chaîne contient le mot "id" précédé ou suivi de n'importe quel caractère...
					if (preg_match('#^[.]*id[.]*$#i', $result['Field'])) {
						// ... on la remplace par la chaîne "numéros d'enregistrement"
						$result['Field'] = "num&eacute;ros d'enregistrement";
					}

					// Remplacement du caractère underscore (_) par un caractère d'espacement
					$result['Field'] = str_replace ('_', ' ', $result['Field']);
					// Remplacement du caractère apostrophe (') par un apostrophe suivi d'un caractère d'espacement (' )
					$result['Field'] = str_replace ('\'', '\' ', $result['Field']);
					// Remplacement de la première lettre de chaque mot par sont équivalent en majuscule
					$result['Field'] = ucwords ($result['Field']);
					// Remplacement du caractère apostrophe suivi d'un caractère d'espacement (' ) par une apostrophe simple (')
					$result['Field'] = str_replace ('\' ', '\'', $result['Field']);
					
					// Affichage des options du menu déroulant
					echo "	<option value=\"". $result_origin ."\">". $result['Field'] ."</option>";
				}
			}
			// Fin du menu déroulant
			echo "	</select>";
		}

		// Affichage du bouton de validation et fin du formulaire
		echo 	"	<input type=\"submit\" name=\"trier\" value=\"Trier\" />".
				"</form>";
	}
}

?>
Vient ensuite la classe qui génère l'affichage multipage :
<?php

class multipage {
	function multi ($param_table) {
		$enregistrements_par_page = isset($_GET['nb_rst']) ? $_GET['nb_rst'] : 10;
		$ordASCDESC = isset ($_GET['opt1']) ? $_GET['opt1'] : "DESC";
		$elem = isset ($_GET['opt2']) ? $_GET['opt2'] : "id";
		$url = $PHP_SELF."?page=";
		$page_courante    = isset($_GET['page']) ? $_GET['page'] : 0;
		$page_affichee    = ($page_courante + 1);
		
		$requete1 = "SELECT COUNT(*) FROM ". $param_table;
		$exec1 = mysql_query($requete1);

		$nb_enregistrements = mysql_result($exec1, 0);
		$nb_pages = ceil($nb_enregistrements / $enregistrements_par_page);

		if($nb_pages > 0) {
		    $navigation = "";
		    if($nb_pages > 1) {
		        if($page_courante > 0) {
		            for($i = 0; $i < $page_courante; $i++) {
						if (isset ($_GET['nb_rst'])) {
							$rst = "&nb_rst=".$_GET['nb_rst'];
							$ord1 = "&opt1=".$_GET['opt1'];
							$ord2 = "&opt2=".$_GET['opt2'];
						}
		                $p = $i + 1;
		                $navigation .= "<a href=\"". $url . $i . $rst . $ord1 . $ord2 ."\" title=\"page ". $p ."\">". $p ."</a> | ";
		            }
		        }
		        $navigation .= "<strong>". $page_affichee ."</strong>";
		        if(($page_affichee) < $nb_pages) {
		            $nb_suivantes = $nb_pages - ($page_affichee);
		            for($j = ($page_affichee); $j < $nb_pages; $j++) {
						if (isset ($_GET['nb_rst'])) {
							$rst = "&nb_rst=".$_GET['nb_rst'];
							$ord1 = "&opt1=".$_GET['opt1'];
							$ord2 = "&opt2=".$_GET['opt2'];
						}
		                $p = $j + 1;
		                $navigation .= " | <a href=\"". $url . $j . $rst . $ord1 . $ord2 ."\" title=\"page ". $p ."\">". $p ."</a>";
		            }
		        }
		        $page_affichee = "Page ". $page_affichee ." sur un total de ". $nb_pages ." pages.";
		    }
		    else {
		        $navigation .= "page 1/1";
		    }
		    $debut = $page_courante * $enregistrements_par_page;
		    $requete2 = "SELECT * FROM ". $param_table ." ORDER BY ". $elem . " ". $ordASCDESC ." LIMIT ". $debut .", ". $enregistrements_par_page .";";
		    $exec2 = mysql_query($requete2);
			
			while($resultat = mysql_fetch_assoc($exec2)) {
				echo 	"<hr />".
						"Titre et sous-titre : <strong>".$resultat['champ1']."</strong> (".$resultat['champ2'].")<br />".
						"Date et auteur : ".$resultat['champ3']." (".$resultat['champ4'].")<br />".
						"Texte : ".$resultat['champ5'];
		    }
		    mysql_free_result($exec1);
		    mysql_free_result($exec2);

		    mysql_close();

			echo "<hr /><p class=\"situation\">".$page_affichee."</p>";
			
			echo "<hr /><p class=\"situation\">".$navigation."</p>";
		}
		else {
					echo "<hr /><h3>Aucune donn&eacute;e dans la base</h3>";
		}
	}
}

?>
Et enfin la page d'index qui appelle les deux classes et leur passe les arguments nécessaires à l'affichage :
<?php

require_once ('configbdd.php');
$connexion = mysql_connect(*****, *****, *****) or die(mysql_error());
mysql_select_db(*****, $connexion) or die(mysql_error());

include ("class_form_tri.php");
include ("class_multipage.php");

$chxppage = range(5, 25, 5);
$triASCDESC = true;
$table = "ma_table";
$champs = "champ1, champ2, champ3, champ4, champ5";

$form  = new formulaire_tri();
$form->form_tri($chxppage, $triASCDESC, $table, $champs);

$page = new multipage();
$page->multi($table);

echo $form->form_tri;
echo $page->multipage;

?>
Il suffit de changer dans l'index les valeurs des variables $table, $champs, $triASCDESC et $chxppage afin de les adapter à tes besoins.

$chxppage défini le nombre de résultats par page que la classe formulaire_tri génèrera (5 : la valeur de départ, 25 : la valeur d'arrivée, 5 : le pas entre 5 et 25).

$triASCDESC : si la valeur "true" est affectée à cette variable, il sera possible d'éffectuer un tri Ascendant et Descendant sur les champs de la table, sinon, si la valeur false est affectée ou que cette variable n'est pas définie, ce type de tri ne sera pas possible.

$table : indiquer ici le nom de la table à partir de laquelle tu veux effectuer l'affichage multipage et le tri.

$champs : indiquer le nom des champs de la table (en respectant la casse et en séparant chacun d'eux par une virgule suivie d'un espace) à partir desquels le tri s'effectuera.

Voilà, je vais essayer d'optimiser ces scripts, mais j'ai encore bien du chemin à faire...

par Anémone » 01 janv. 2008, 13:14

Merci pour ces réponses, je devrais me débrouiller avec ça.
L'objectif est la réalisation d'un script d'affichage des résultats d'une requête, avec comme base de départ:
$nb=mysql_num_rows($requete);
$x*10+$y=$nb;
// etc
Puis affichage de x numéros de 1 à x, chacun comportant un lien entrainant l'éxécution d'une requête avec une clause LIMIT dont les 2 valeurs correspondront à $x*10 et ($x+1)*10.
Ce n'est peut-être pas le script d'affichage page (de 10 résultats) par page optimal, mais je n'ai pas d'autre idée. Mais si vous avez mieux, je suis preneuse...
Bonne année à tou(te)s!

Anémone

par Hywan » 01 janv. 2008, 11:45

Oui, la seule solution au problème est alors le traitement du nombre comme une chaîne de caractères. Mais une question, ça va servir à quoi ?

par Kaoteknik » 01 janv. 2008, 11:21

Je vais retourner me coucher moi .... Le réveillon, c'est une bonne excuse ?
Ca peut expliquer pas mal de choses ! Mais si c'est l'excuse invoquée, je connais pas mal de personnes qui doivent réveillonner à longueur d'année ! :lol: (je ne parle pas de toi hein, je ne me permettrai pas).

Plus sérieusement la solution d'@rthur semble répondre exactement au besoin d'Anémone.

par Hywan » 01 janv. 2008, 11:17

Je vais retourner me coucher moi .... Le réveillon, c'est une bonne excuse ?

par Kaoteknik » 01 janv. 2008, 11:08

Hum... Sauf erreur de ma part ton code devrait toujours retourner 1 HyWaN. Apparemment ce n'est pas le résultat attendu. :-k

Edit : en fait non, je dis une bêtise, il devrait retourner uniquement les chiffres après la virgule, ce qui n'est pas non plus le résultat souhaité, du moins si j'ai bien compris la question...

par Hywan » 01 janv. 2008, 10:48

Un algorithme qui serait juste, c'est de prendre la partie entière arrondie en-dessous, et de soustraire ce résultat à ton nombre de départ. Mais ça pose problème pour les nombres négatifs.
Voici un début :
<?php

$n = 125.92;
echo $n - floor($n);
Il n'est pas question de ceil, sinon le résultat serait faussé.
Pour les nombres négatifs — comme je l'ai dis — ça ne fonctionnera pas. Tu enlèveras toujours 1 de trop. Tu peux toujours faire une condition, mais c'est crade. Ou sinon utiliser floor pour les nombres > 0, et ceil pur les nombres < 0. Mais pareil, un peu crade.

Planches là-dessus ;-).

par @rthur » 01 janv. 2008, 03:55

Codé rapidement après une soirée de réveillon:
<?php
$nombre="125.92";

$nombre_entier=floor($nombre); // Ou ceil() si on veut arrondir à l'entier supérieur; ou round() pour faire un véritable arrondi

$nombre_unite=$nombre_entier[strlen($nombre_entier)-1];

print $nombre_unite;
?>
:wink:

par Kaoteknik » 01 janv. 2008, 03:22

Bonsoir et bonne année ! :)

Si tu cherches à supprimer la décimale d'un chiffre entier pour l'arrondir à l'entier inférieur, c'est la fonction floor. Si tu veux l'arrondir à l'entier supérieur, c'est la fonction ceil.

Voilà !

Une fonction particulière pour extraire le chiffre des unité

par Anémone » 01 janv. 2008, 02:58

Bonjour,

Comme dit dans le titre, connaissez-vous une fonction qui permette d'extraire le chiffre des unités d'un nombre entier quelconque?
Merci d'avance, et bonne année.

Anémone