Aller au contenu

Des zeros (de conduite) que je souhaite garder


Sujets conseillés

Posté

'Soir,

La course automobile étant ce qu'elle est (wouuaarff, ch'uis philosophe à mes heures...), on voit maintenant des bolides avec numéros spéciaux (marketing oblige...), ce qui me mets dans la panade.

Lorsque cela va de 1 à 9999...999, pas de problème. Mais lorsque ce numéro est 007, et qu'il existe une autre voiture portant le numéro 7, je me retrouve "fait", car pas prévu dans mes programmes.

Du coup, (je sais qu'un post abordant la problématique est récemment passé (où qu'il est le post ??)), comment puis-je faire pour conserver le 007, sachant que le champ est en INT de 3, non null ?

Merci de votre aide,

xpatval

Posté

Bonsoir,

À ma connaissance, aucun type numérique ne peut garder les 0 non-significatifs avec MySQL...

Le sujet que tu mentionnes existe bien, mais il traitait de l'affichage d'un nombre avec des 0 non-significatifs, et non du stockage de celui-ci ! Pour gérer l'affichage il y a plusieurs fonctions (number_format, spintf, ...). Ce n'est pas ce que tu souhaites faire si jai bien compris.

Je pense que tu n'as qu'une seule solution, c'est de faire de ton champ "INT" un champ "VARCHAR"...ainsi tu enregistres les "nombre" tels qu'ils sont, surtout ne convertis pas en entier en PHP ce que l'utilisateur te fournit (tu perdrais les 0 non-significatifs également)... Bref ce champ sera une chaîne de caractères. Cela est aussi logique car si tu viens à avoir une lettre ou simplement différents nombres de zéros non-significatifs, tu seras de toute façon embêté si ce champ n'est pas une chaîne de caractères.

Si tu as un problème pour trier tes résultats (l'ordre alphabétique n'est pas toujours correcte lorsqu'il s'agit de trier les chaînes de caractères contenant des chiffres uniquement : 2 et 20 se suivent même si tu as 3 dans ta table) tu peux récupérer l'entier de tes données et les trier avec PHP grâce à la fonction natsort par exemple. Ce n'est pas très efficace, mais c'est un cas limite... je ne vois vraiment pas d'autre solution pour l'instant.

Posté

Tu peux peut-être créer deux champs parallèles, un en VARCHAR l'autre en INT, le premier pour l'affichage, le second pour les tris.

Posté

Il me semble que l'attribut ZEROFILL permet l'inverse, c'est à dire formater les resultats dans une requete (exemple si tu as 1 2 3 4 5 6 d'enregistrés, avec un ZEROFILL sur une taille de 2, tu vas obtenir 01 02 03 04 05 06...), ce qui n'est pas vraiment ce qu'il cherche.

La solution avce les VARCHAR est la plus simple je pense...

Posté

En tout cas, merci de vos réponses.

Je me rabats sur la solution 'varchar', on verra bien si ça merdoie dans certains scripts...

Je serai paré pour des numéros de voitures futurs, avec une racine carré, une puissance, un mix lettres-chiffres :wacko: !

Merci à vous,

xpatval

Posté

Et bien ce fut rapide !!

Me revoilà avec mes 000...et mon problème d'affichage.

J'ai modifié mon champ d'INT 3 en VARCHAR, pas de souci, le numéro avec les 0 (007) s'effectue bien.

Je bute (mes yeux, mon neurone, E.T. ?) malgré tout sur ce bout de script:


while (list($libelle,$type,$num_voit,$groupe,$class_dep,$class_arr,$nb_t,$km,$nom,$prenom) = $db->get_row())
{
echo "num_voit_first...........= ". $num_voit ."<br>"; [color="#FF0000"]<== j'ai bien mon "007"[/color]
$nom = stripslashes($nom);
$Found=0;
for($i=0;$i<count($tNumVoit);$i++)
{
if ($tNumVoit[$i]==$num_voit)
{

$tEquipage[$i].="/". E_pilot($nom ."?". $prenom);
$Found=1;
break;
}
}
if ($Found==0)
{
echo "num_voit...........= ". $num_voit ."<br>"; [color="#CC0000"]<== je n'ai plus mon "007"[/color]
$tLib[] = L_marque($libelle) ." ". $type;
$tMod[] = $groupe ;
$tNumVoit[] = $num_voit;
$tC_dep[] = $class_dep;
$tN_tour[]= $nb_t;
$tKm[] = $km;
if ($class_arr == 99) $tC_arr[] = "NC";
else $tC_arr[] = $class_arr;
$tEquipage[] = E_pilot($nom ."?". $prenom);
}
}

Le principe de cette partie est de regrouper l'équipage de la voiture sur une ligne (il y a 3 pilotes) dans un tableau. La condition première dans la boucle "for" n'est bien entendu pas respectée au premier passage, puisque $tNumVoit[$i] est null. Donc, le process passe à la condition "if ($Fopund == 0). Or, à ce moment, ma valeur "007" ($num_voit) a disparu !

Au sortir de ma requête, pourtant, $num_voit affiche bien "007"... :nonono:

Pourquoi ??

J'en ai marre. Veux aller me coucher !

xpatval

Posté

Bon, ben ça ne s'arrange pas. Le pourquoi du problème ci-dessus réside dans l'affectation de la valeur dans le tableau $tNumVoit[$i].

Suite au prochain épisode...

xpatval

Posté

Salut :)

Juste un petit post pour te donner un petit conseil d'optimisation PHP :

while (list($libelle,$type,$num_voit,$groupe,$class_dep,$class_arr,$nb_t,$km,$nom,$prenom) = $db->get_row())

est moins rapide que

$current_car = 0;
while ($current_car < $db->num_rows)
{
$car = $db->get_row();
// Tes opérations ici
// print_r ($car);
// echo $car['num_voit'];
// etc
$current_car++;
}

Posté
Salut :)

Juste un petit post pour te donner un petit conseil d'optimisation PHP : ...

C'est certain ! Mais pour l'instant, je n'ai pas le temps de réécrire le tout. Merci quand même.

xpatval

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...