JeuWeb (JeuPHP) - Crée ton jeu par navigateur

Version complète : [Résolu] Faire de 3, une seule requête ?
Vous consultez actuellement la version basse qualité d'un document. Voir la version complète avec le bon formatage.
Pages : 1 2
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°
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.
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'.
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°
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 ?
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°
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.
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°
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.
Plume vient de voir le réel problème. Il change ça.

@tchaOo°
Pages : 1 2
URLs de référence