2010-04-24 6 views
0

Je ne sais pas pourquoi mais le type de données dans ce code fait un problème lorsque l'ID dans l'URL commence par le numéro zéro comme ceci: http://localhost/exp/update.php?id=03A43 Dans ce cas, l'ID est 03A43.problème de type de données dans php

Et ma requête ressemble à ceci:

mysql_select_db("school", $con); 
    $result = mysql_query("SELECT * FROM student WHERE IDNO=".(int)$_GET['id']); 

?> 

Il n'y a pas de problème dans la conception si l'identifiant ne démarre pas avec le numéro zéro. Quel pourrait être le bon type de données pour les nombres commençant par zéro?

Répondre

0

Citation de votre chaîne:

mysql_select_db("school", $con); 
$result = mysql_query("SELECT * FROM student WHERE IDNO='".$_GET['id']."'") 
+3

RAPIDE, tout le monde visite 'http: //localhost/exp/update.php? Id =% 27% 3B -% 0ADROP + TABLE + étudiant + CASCADE% 3B'. Sérieusement, la chaîne doit être échappée avec mysql_escape_string. –

+0

Hmm ... semble que je n'ai pas ce site sur mes internets ... – SeanJA

+0

Il serait probablement encore mieux si l'on devait utiliser mysqli et préparé des déclarations non? – SeanJA

2

Modifier: L'OP n'a pas révélé jusqu'à récemment que le type du champ est un varchar, pas un nombre. Par conséquent, il/elle doit utiliser ceci:

mysql_query("SELECT * FROM student WHERE IDNO='" 
      . mysql_escape_string($_GET['id']) . "'"); 

Pour la postérité, ma première réponse était:


On dirait que vous essayez d'analyser un nombre hexadécimal, auquel cas vous pourriez faire :

hexdec($_GET['id']) 

(int)x est le même que intval(x), qui par défaut à la base 10. Votre numéro, 03A43, a été clairement pas 10 fonder, si PHP cessé de le lire quand il est arrivé à A. Vous pouvez également dire intval(x, 16) pour analyser le nombre hexadécimal, mais puisque vous utilisez le résultat sous forme de chaîne, hexdec est probablement un petit peu plus rapide. Comme une note de prudence sans rapport, de nombreux langages de programmation traitent les nombres commençant par 0 comme octal plutôt que décimal. Si vous dites $myvar = 031;, $myvar sera défini sur 25. Cela s'applique également à JavaScript ainsi qu'à sa fonction parseInt. En PHP, puisque (int) et intval par défaut à la base 10, intval('031') sera 31. Cependant, intval('031', 0) sera 25 parce que le second paramètre, 0, indique intval pour détecter automatiquement la base.

+0

Oui, c'était bizarre. – Ben

+0

+1 pour aller dans beaucoup plus de détails que je ne le pensais. –

0

Quel est le type de student.IDNO dans la base de données? Casting $_GET['id'] à un int va faire juste "3", ce qui semble ne pas être ce que vous voulez

+0

le type est varchar – user225269

0

(int)03A43 produira 3. Êtes-vous sûr que c'est un A là-dedans? Par contre, $_GET[] sera toujours une chaîne. Casting une chaîne en tant que int va supprimer le premier 0. Si vous avez besoin du 0, ne le lancez pas, laissez la chaîne telle quelle.

+0

oui il y a un A, numéro d'identification est composé de lettres et de chiffres – user225269

+0

Ensuite, le type d'ID dans la base de données est un VARCHAR, ai-je raison? Si c'est le cas, ne le lancez pas comme INT, pourquoi le feriez-vous? De plus, citez votre requête "... = '". $ _ GET [' id ']. "' ...;" – Ben

1

Arrêter la coulée d'une chaîne alphanumérique comme un entier si vous voulez que la chaîne reste intacte. Pourquoi faites-vous cela? Aussi, et plus important encore, vous devez échapper à votre entrée brute, à tout le moins. Appelez le mysql_real_escape_string() dessus avant de le passer au mysql_query().

Questions connexes