(int) et intval() modifie mes nombres entiers !

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 : (int) et intval() modifie mes nombres entiers !

Re: (int) et intval() modifie mes nombres entiers !

par Texicitys » 16 févr. 2012, 13:50

Merci à vous pour toutes ces précisions :)

J'ai mis var à 13 pour mes ISBN, et j'ai mis ce ISBN en clé unique.

Ok, je comprends mieux pourquoi et quand il faut faire attention à bien mettre int et quand on peut mettre var (comme ici).

Pour ce qui est de la taille des ints, je trouve ça petit quand même héhé.. Je pensais au départ que la limite était bien plus loin..

En tout cas, merci beaucoup, tout est clair :)

Re: (int) et intval() modifie mes nombres entiers !

par sirakawa » 16 févr. 2012, 09:51

Avec bigint, si tu cherches à stocker un nombre qui dépasse la capacité, il est transformé en une valeur qui correspond au max possible; avec varchar(30), par exemple tous les digits sont stockés.i 9223372036854775807, v 123456789101234567892012345678
<?PHP
mysql_connect ("localhost", "root", "");
mysql_select_db ("dicos");
/* j'ai fait les insertions en ligne de commande
insert into ints (i,v) values (1234567891012345678912012345678930, "123456789101234567892012345678930");
*/
$res = mysql_query ("select * from ints");
$l = mysql_fetch_row($res, MYSQL_ASSOC);
$i = $l['i'];
$v = $l['v'];
$c = $i^12;
print "i $i, v $v c $c";
if (is_int($i))
{
	print "c'est un entier";
}
else
{
	print "pas un entier";
	if (ctype_digit ($i))
	{
		print "mais composé de chiffres";
	}
}
?>
affichage :
i 9223372036854775807, v 123456789101234567892012345678

identique à l'affichage en ligne de mysql...
je me suis amusé à $c = $i^12 qui donne:
9223372036854775795

Le problème que je vois à is_int(), c'est qu'il retourne faux quand la valeur max est dépassée aussi bien que quand le nombre est mal formé... Sii elle renvoie faux, pour être sûr qu'il s'agit d'un dépassement, ctype_digit fait le travail...

Re: (int) et intval() modifie mes nombres entiers !

par moogli » 16 févr. 2012, 09:49

D'ailleurs c'est ce que tu devrais faire normalement plutôt que de cadrer à la barbare ;)
bon je voulais mettre "caster" mais la correction auto du tel n'en fait qu'a sa tête :)

la différence entre varchar et int, ben c'est pas pareil :mrgreen:

sérieusement, les type dit numérique (int, decimal etc) servent à effectuer des calculs.
les types texte (varchar, text) servent à "représenter". Par exemple dans : "je vend 412kg d'huitre numéro 3". on se fou de faire des calculs sur les chiffres, c'est du littérale. Par contre stocker des entiers, des float, ou numeric pour représenter le prix d'un article afin de faire le calcul du prix dans la requête SQL à un sens.

dans ton cas les chiffres n'ont aucune valeur en tant que chiffre, ils sont une représentation, le varchar correspond. tu aurais très bien pu mettre un char(13) vu que normalement tu a toujours 13 chiffres (il me semble).

Après, coté "CGI" de toute façon tu reçois des chaines de caractère du formulaire (chiffre pas c'est un caractère qui est entré dans le formulaire) et après tu les traites "au besoin".

Avec un varchar tu va mettre ton champs dans un varchar tu va ajouter un index full text dessus et tu va avoir une recherche du tonnerre :)

Tu pourrais aussi utiliser un entier et l'utiliser en clef primaire vu que ce numéro est unique :) (ça peux être une bonne idée de conception, après il parait qu'il faut éviter les données significative en tant que clef primaire, ceci c'est une bonne clef candidate ^^)

il y a plein de possibilité qui s'offre a toi, trouve celle qui te va.
Si tu reste tel quel pas de cast, utilise l'une des fonctions ci dessus ou bien un preg_match avec un masque strict que 13 chiffres pour le valider ;)

@+

Re: (int) et intval() modifie mes nombres entiers !

par Texicitys » 16 févr. 2012, 00:49

J'avoue ne pas avoir bien exprimé la question :) C'est du au fait que sur le coup, je pensais que mon ordi bugait tellement je ne comprenais pas.. Héhé

En fait, c'est pour "vérifier" des code isbn de livre (ils ont 13 chiffres) :)

Pourquoi mettre (int) n'est pas la bonne solution (pas de ce cas ci, mais en général ) ?

Dans la bdd j'ai mis varchar.. Je devrais plutôt mettre bigint ? Au fait, ça change quoi de mettre juste ?

Merci à vous :)

Re: (int) et intval() modifie mes nombres entiers !

par sirakawa » 14 févr. 2012, 10:15

Si tu avais exposé la question clairement, tu aurais évité des réponses justes mais qui ne ciblent pas bien le problème.
J'avais cru que tu étais un matheux en quête de précision absolue arithmétique (nombres de longueur infinie et précision sur tous les éléments, y compris les plus lointaines décimales...)

Re: (int) et intval() modifie mes nombres entiers !

par moogli » 14 févr. 2012, 07:55

Salut,

Tu oublieis_numeric ou ctype_digit ;)

D'ailleurs c'est ce que tu devrais faire normalement plutôt que de cadrer à la barbare ;)


@+

Re: (int) et intval() modifie mes nombres entiers !

par Texicitys » 14 févr. 2012, 02:20

Merci beaucoup pour ces informations. Donc si je veux vérifier que le membre entre bien un nombre, mais que ce nombre peut être aussi grand je n'ai pas moyen de le vérifier sans bidouiller.

Merci :)

Re: (int) et intval() modifie mes nombres entiers !

par sirakawa » 13 févr. 2012, 21:51

A) sous linux avec un AMD 64 bits
1: 2742001905
2: 2742001905

B) Extrait du manuel (http://fr2.php.net/manual/fr/language.types.integer.php)
La taille d'un entier est dépendante de la plate-forme, cependant, une valeur maximale d'environ 2 milliards est habituelle (cela correspond à 32 bits signés). Les plateformes 64-bit ont habituellement une valeur maximale d'environ 9E18. PHP ne supporte pas les entiers non-signés. La taille d'un entier peut être déterminée en utilisant la constante PHP_INT_SIZE, et la valeur maximale, en utilisant la constante PHP_INT_MAX depuis PHP 4.4.0 et PHP 5.0.5.

Re: (int) et intval() modifie mes nombres entiers !

par Calimero » 13 févr. 2012, 19:53

Hello,

Les nombres entiers en php sont des valeurs signées sur 32 bits. Cela veut dire que la valeur maximum stockable sous forme d'entier est :
<?php
echo pow(2,31)-1;  // 2147483647
Si tu veux manipuler des nombres plus importants tu peux te tourner vers http://fr.php.net/manual/fr/intro.gmp.php

(int) et intval() modifie mes nombres entiers !

par Texicitys » 13 févr. 2012, 18:59

Hello!

J'avoue ne rien y comprendre !

Voici le code que je lance :
<?php echo '1: 2742001905';
	$te=(int)'2742001905' ; 
	echo '<br />2: '.$te.'<br />';
Et voici le résultat :

Code : Tout sélectionner

1: 2742001905 2: 2147483647
J'ai le même résultat avec intval, j'avoue ne rien y comprendre !!

Merci de m'expliquer !