Poster une réponse 
 
Note de cette discussion :
  • Moyenne : 0 (0 vote(s))
  • 1
  • 2
  • 3
  • 4
  • 5
[Résolu] Faire de 3, une seule requête ?
Auteur Message
Plume Hors ligne
Membre

Messages : 377
Inscription : Jul 2008
Réputation : 6
Message : #1
[Résolu] Faire de 3, une seule requête ?
Plop !

Ma question est simple mais je ne sais pas si la réponse l'est aussi.

J'aimerais savoir s'il est possible de faire ceci :
Code PHP :
$loginSelect "SELECT COUNT(id) AS nbLogin FROM users WHERE login = %s";
      
$loginQuery sprintf($loginSelect$this->input->post('login'));
      
$loginResult $this->db->query($loginQuery);
      
$nbLogin $loginResult->result_array();
      if(
$nbLogin['nbLogin'] > 0){

        
$this->validation->login_error $this->lang->line('This login is already used.');
        
$this->layout->view('profile/inscriptionForm');
        return 
FALSE;
      }

      
$emailSelect "SELECT COUNT(id) AS nbEmail FROM users WHERE email = %s";
      
$emailQuery sprintf($emailSelect$this->input->post('email'));
      
$emailResult $this->db->query($emailQuery);
      
$nbEmail $emailResult->result_array();
      if(
$nbEmail['nbEmail'] > 0){

        
$this->validation->email_error $this->lang->line('This email is already used.');
        
$this->layout->view('profile/inscriptionForm');
        return 
FALSE;
      }

      
$nameSelect "SELECT COUNT(id) AS nbName FROM users WHERE lastname = %s AND firstname = %s";
      
$nameQuery sprintf($nameQuery$this->input->post('lastname'), $this->input->post('firstname'));
      
$nameResult $this->db->query($nameQuery);
      
$nbName $nameResult->result_array();
      if(
$nbName['nbName'] > 0){

        
$this->validation->firstname_error $this->lang->line('These firstname and lastname are already used.');
        
$this->layout->view('profile/inscriptionForm');
        return 
FALSE;
      } 

Mais avec une seule requête ?

Merci !

@tchaOo°

le Blog de Plume : http://plumeconception.o-n.fr/blog/
(Ce message a été modifié le : 10-04-2008 08:57 PM par Sephi-Chan.)
10-04-2008 08:21 PM
Visiter le site internet de cet utilisateur Trouver tous les messages de cet utilisateur Citer ce message dans une réponse
Ekilio Hors ligne
Membre

Messages : 209
Inscription : Apr 2008
Réputation : 10
Message : #2
RE: Faire de 3, une seule requête ?
Heu, sans reprendre tout ton script php...

SELECT login, email, lastname, firstname FROM users WHERE login = %s OR email = %s OR (lastname = %s AND firstname = %s)

Cette requête te renverras tous les enregistrements ayant un champ en commun avec ceux ne devant pas être dupliqués.
Ensuite, tu fais des tests PHP sur tous les enregistrements renvoyés (maximum trois, donc c'est vraiment pas lourd) pour savoir ce qui est en commun ; et si aucun résultat n'est renvoyé (mysql_num_rows() == 0) alors c'est que c'est bon.
10-04-2008 08:27 PM
Visiter le site internet de cet utilisateur Trouver tous les messages de cet utilisateur Citer ce message dans une réponse
Plume Hors ligne
Membre

Messages : 377
Inscription : Jul 2008
Réputation : 6
Message : #3
RE: Faire de 3, une seule requête ?
J'étais parti sur cette idée mais j'ai pas été pousser trop loin. J'avais un 'tit doute concernant les valeurs contenues dans les champs qui ne contiennent pas de valeurs exactes à ce qui a été saisi en formulaire. J'vais finalement le faire.

Merci.

@tchaOo°

[PS] Il manque un bouton 'Résolu'.

le Blog de Plume : http://plumeconception.o-n.fr/blog/
(Ce message a été modifié le : 10-04-2008 08:41 PM par Plume.)
10-04-2008 08:41 PM
Visiter le site internet de cet utilisateur Trouver tous les messages de cet utilisateur Citer ce message dans une réponse
Plume Hors ligne
Membre

Messages : 377
Inscription : Jul 2008
Réputation : 6
Message : #4
RE: [Résolu] Faire de 3, une seule requête ?
Bon, j'aurais dû le faire dès le début finalement, ça réduit plutôt significativement le code :

Code PHP :
$selectQuery "SELECT login, email, firsname, lastname FROM users" .
          
"WHERE login = %s OR email = %s OR (firstname = %s AND lastname = %s);";
      
$selectQuery sprintf(
        
$selectQuery,
        
$this->input->post('login'),
        
$this->input->post('email'),
        
$this->input->post('firstname'),
        
$this->input->post('lastname')
      );
      
$selectResult $this->db->query($selectQuery);
      
$selectArray $selectResult->result_array();
      if(
$selectArray['login'] == $this->input->post('login')){

        
$this->validation->login_error $this->lang->line('This login is already used.');
        
$this->layout->view('profile/inscriptionForm');
        return 
FALSE;
      }elseif(
$selectArray['email'] == $this->input->post('email')){

        
$this->validation->email_error $this->lang->line('This email is already used.');
        
$this->layout->view('profile/inscriptionForm');
        return 
FALSE;
      }elseif(
$selectArray['firstname'] == $this->input->post('firstname')
        AND 
$selectArray['lastname'] == $this->input->post('lastname')){

        
$this->validation->firstname_error $this->lang->line('These firstname and lastname are already used.');
        
$this->layout->view('profile/inscriptionForm');
        return 
FALSE;
      } 

@tchaOo°

le Blog de Plume : http://plumeconception.o-n.fr/blog/
10-04-2008 09:01 PM
Visiter le site internet de cet utilisateur Trouver tous les messages de cet utilisateur Citer ce message dans une réponse
Ekilio Hors ligne
Membre

Messages : 209
Inscription : Apr 2008
Réputation : 10
Message : #5
RE: [Résolu] Faire de 3, une seule requête ?
Juste une question avec ton code, vu que je ne connais pas le fonctionnement de ta classe... Qu'est-ce qui se passerait si, par exemple, je voulais m'inscrire.

Je viens donc, je met comme login "Ekilio", adresse mail "toto@tata.titi", nom "Toto" et prénom "Tata".

Malheureusement, un joueur a déjà comme login "Ekilio", un second comme mail "toto@tata.titi" et un troisième comme nom "Toto" et prénom "Tata"... Donc ta requête renvoi trois résultats. Ca donne quoi ? Ta classe le gère comment ?
10-04-2008 09:08 PM
Visiter le site internet de cet utilisateur Trouver tous les messages de cet utilisateur Citer ce message dans une réponse
Plume Hors ligne
Membre

Messages : 377
Inscription : Jul 2008
Réputation : 6
Message : #6
RE: [Résolu] Faire de 3, une seule requête ?
La réponse est dans le code que tu vois. A partir du moment où le login est déjà utilisé, on s'arrête et on reprend correctement.

@tchaOo°

le Blog de Plume : http://plumeconception.o-n.fr/blog/
10-05-2008 12:47 PM
Visiter le site internet de cet utilisateur Trouver tous les messages de cet utilisateur Citer ce message dans une réponse
Anthor Hors ligne
Membre

Messages : 520
Inscription : Dec 2007
Réputation : 15
Message : #7
RE: [Résolu] Faire de 3, une seule requête ?
En fait je pense que ce qu'il veut te dire, c'est que ta requête peut renvoyer 3 lignes. Et que ton code, ne gère que la première ligne à priori ? Voir ne va rien gérer si tu as 3 lignes en retour mais seulement si une seule ligne est retourné.

Cela étant dépendant de la façon dont ta classe retourne l'array.

Anthor |
[Image: 352x90.gif]
10-05-2008 12:54 PM
Visiter le site internet de cet utilisateur Trouver tous les messages de cet utilisateur Citer ce message dans une réponse
Plume Hors ligne
Membre

Messages : 377
Inscription : Jul 2008
Réputation : 6
Message : #8
RE: [Résolu] Faire de 3, une seule requête ?
J'viens tout juste de faire des tests et j'viens de comprendre le problème. J'ai pas testé ce cas car je n'y avais pas pensé.
Cela dit, si plusieurs lignes sont retournées, traiter la première suffit à couper l'enregistrement puisque si elle a été retournée, c'est qu'elle répond à une des conditions testées si après. Non ?

@tchaOo°

le Blog de Plume : http://plumeconception.o-n.fr/blog/
10-05-2008 02:43 PM
Visiter le site internet de cet utilisateur Trouver tous les messages de cet utilisateur Citer ce message dans une réponse
Ekilio Hors ligne
Membre

Messages : 209
Inscription : Apr 2008
Réputation : 10
Message : #9
RE: [Résolu] Faire de 3, une seule requête ?
Tout à fait, mais ce que je voulais dire, c'est qu'il faut prendre ce fait en compte. Le problème est que je ne sais pas ce que te retourne ta fonction : est-ce que c'est simplement un tableau contenant les valeures de la première ligne (et ensuite les suivantes via un each) ? Auquel cas il n'y a pas de problèmes. Ou est-ce que c'est un tableau de tableau contenant chacun les valeures d'une ligne ?

Code PHP :
$result = array(
     array(
           
'login' => 'toto',
           
'pass' => 'tata'
     
),
     array(
           
'login' => 'titi',
           
'pass' => 'tutu'
     
)


Un truc dans ce genre-là, quoi, ou directement un des sous-tableaux si la requête ne renvoi qu'un seul résultat ; auquel cas il faut le traiter en fonction, sinon tu vas avoir des erreurs.
10-05-2008 02:48 PM
Visiter le site internet de cet utilisateur Trouver tous les messages de cet utilisateur Citer ce message dans une réponse
Plume Hors ligne
Membre

Messages : 377
Inscription : Jul 2008
Réputation : 6
Message : #10
RE: [Résolu] Faire de 3, une seule requête ?
Plume vient de voir le réel problème. Il change ça.

@tchaOo°

le Blog de Plume : http://plumeconception.o-n.fr/blog/
10-05-2008 03:03 PM
Visiter le site internet de cet utilisateur Trouver tous les messages de cet utilisateur Citer ce message dans une réponse
Poster une réponse 



ContactJeuWeb (JeuPHP) - Crée ton jeu par navigateurRetourner en hautRetourner au contenuVersion bas-débit (Archivé)Syndication RSS