Problème avec do while

Problème avec do while - PHP - Programmation

Marsh Posté le 11-01-2011 à 00:41:46    

Bonsoir à tous,
Je suis en train de réaliser une boucle do while pour générer un hash unique de 4 caractères à mettre dans une sql.
La boucle sert à vérifier si le hash n'existe pas dans la base sinon on régénère un hash et on retest mais le problème est que j 'ai de temps en temps des doublons dans mes hash.
Voici mon code
 
      do {
      $caracteres = array("a", "b", "c", "d", "e", "g", "h", "k", "l", "m", "n", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", 1, 2, 3, 4, 5, 6, 7, 8, 9);
      $caracteres_aleatoires = array_rand($caracteres, 4);
         foreach($caracteres_aleatoires as $i) {
            $hash .= $caracteres[$i];
         }
      $sql=mysql_query("SELECT count(id) FROM url WHERE hash ='$hash'" )or die(mysql_error());
      $resultat = mysql_fetch_array($sql);
      } while ($resultat[id] != 0);
Ensuite je fais un insert du hash ds la sql
Avez vous une idée sur le pourquoi j'ai des hash identique ?
Merci de votre aide

Reply

Marsh Posté le 11-01-2011 à 00:41:46   

Reply

Marsh Posté le 11-01-2011 à 07:48:04    

Au lieu de

$sql=mysql_query("SELECT count(id) FROM url WHERE hash ='$hash'" )or die(mysql_error());


Ecrire

$sql=mysql_query("SELECT count(id) FROM url WHERE hash ='".$hash."'" )or die(mysql_error());


En PHP, les guillemets sont différents des apostrophes :
 
La variable qui est contenue entre deux guillemets est évaluée alors que celle entre deux apostrophes ne l'est pas.
 
(C'est incroyable le nombre de personnes qui ne connaissent pas cela, ou n'y font pas attention, ou bien qui sont trop paresseuses pour utiliser le point "." de la concaténation.)
 

Reply

Marsh Posté le 11-01-2011 à 08:09:40    

billgatesanonym a écrit :

Au lieu de

$sql=mysql_query("SELECT count(id) FROM url WHERE hash ='$hash'" )or die(mysql_error());


Ecrire

$sql=mysql_query("SELECT count(id) FROM url WHERE hash ='".$hash."'" )or die(mysql_error());


En PHP, les guillemets sont différents des apostrophes :
 
La variable qui est contenue entre deux guillemets est évaluée alors que celle entre deux apostrophes ne l'est pas.
 
(C'est incroyable le nombre de personnes qui ne connaissent pas cela, ou n'y font pas attention, ou bien qui sont trop paresseuses pour utiliser le point "." de la concaténation.)
 


 
 
Sauf qu'en l’occurrence, la variable $hash est bien contenue dans des guillemets, et les apostrophes sont elles-mêmes des caractères de la chaîne, et non pas des délimiteurs...
 
Pour ce qui est du problème initial, je dirais:
- ajouter un alias à la colonne "count(id)" de la requête sql => "SELECT count(id) AS id FROM ..."  
- modifier le test du while =>  while ($resultat['id'] != 0);

Reply

Marsh Posté le 11-01-2011 à 09:08:02    

@billgatesanonym
 
Merci de ta contribution, je vais tester ca dans l'aprem, et je retiens bien la différance entre les guillements et les apstrophes
 
@jeff@be
 
Merci aussi à toi aussi

Reply

Marsh Posté le 11-01-2011 à 09:10:51    

billgatesanonym a écrit :

Au lieu de

$sql=mysql_query("SELECT count(id) FROM url WHERE hash ='$hash'" )or die(mysql_error());


Ecrire

$sql=mysql_query("SELECT count(id) FROM url WHERE hash ='".$hash."'" )or die(mysql_error());


En PHP, les guillemets sont différents des apostrophes :

 

La variable qui est contenue entre deux guillemets est évaluée alors que celle entre deux apostrophes ne l'est pas.

 

(C'est incroyable le nombre de personnes qui ne connaissent pas cela, ou n'y font pas attention, ou bien qui sont trop paresseuses pour utiliser le point "." de la concaténation.)

 



sauf que pour le coup ,

Code :
  1. $qualificatif = 'âne';
  2. echo  "toto est un  '$qualificatif'";


affiche  :  toto est un âne

Code :
  1. $qualificatif = 'âne';
  2. echo  'toto est un  $qualificatif';


affiche  :  toto est un $qualificatif


Message édité par flo850 le 11-01-2011 à 09:12:52
Reply

Marsh Posté le 11-01-2011 à 11:13:36    

bastagogne a écrit :


   ($resultat[id] != 0);


 
on écrit $resultat['id']
 
 

billgatesanonym a écrit :

Au lieu de

$sql=mysql_query("SELECT count(id) FROM url WHERE hash ='$hash'" )or die(mysql_error());


Ecrire

$sql=mysql_query("SELECT count(id) FROM url WHERE hash ='".$hash."'" )or die(mysql_error());


En PHP, les guillemets sont différents des apostrophes :
 
La variable qui est contenue entre deux guillemets est évaluée alors que celle entre deux apostrophes ne l'est pas.
 
(C'est incroyable le nombre de personnes qui ne connaissent pas cela, ou n'y font pas attention, ou bien qui sont trop paresseuses pour utiliser le point "." de la concaténation.)
 


 
Y a aucune différence entre les 2 syntaxes que tu as écrites (si ce n'est que la deuxième est moins lisible.  
 
Par contre, tu aurais pu faire remarquer que "OR DIE" est à proscrire à notre époque ou encore que les requetes préparées c'est plus propre.


Message édité par smaragdus le 11-01-2011 à 11:15:52
Reply

Marsh Posté le 11-01-2011 à 11:16:17    

On va probablement me dire que je me répète, mais vu qu’apparemment ça rentre pas ..  
Arrêtez de vous emmerder avec des problèmes que vous vous créez vous-mêmes en vous acharnant à ne pas utiliser PDO bon sang... C'est fou comme le 90% des problèmes MySQL/PHP pourraient être résolu en prenant 15 min pour lire la doc PDO ..


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Marsh Posté le 11-01-2011 à 11:51:30    

pdo est installé en standard ?  

Reply

Marsh Posté le 11-01-2011 à 11:55:52    

oui et depuis des lustres maintenant

Reply

Marsh Posté le 11-01-2011 à 12:00:23    

j'étais resté à l'install via pear/pecl  
:jap:

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed