JeuWeb - Crée ton jeu par navigateur
[Résolu] Faire de 3, une seule requête ? - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : [Résolu] Faire de 3, une seule requête ? (/showthread.php?tid=3132)

Pages : 1 2


[Résolu] Faire de 3, une seule requête ? - Plume - 04-10-2008

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 :
<?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°


RE: Faire de 3, une seule requête ? - Ekilio - 04-10-2008

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.


RE: Faire de 3, une seule requête ? - Plume - 04-10-2008

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'.


RE: [Résolu] Faire de 3, une seule requête ? - Plume - 04-10-2008

Bon, j'aurais dû le faire dès le début finalement, ça réduit plutôt significativement le code :

Code PHP :
<?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°


RE: [Résolu] Faire de 3, une seule requête ? - Ekilio - 04-10-2008

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 ?


RE: [Résolu] Faire de 3, une seule requête ? - Plume - 05-10-2008

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°


RE: [Résolu] Faire de 3, une seule requête ? - Anthor - 05-10-2008

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.


RE: [Résolu] Faire de 3, une seule requête ? - Plume - 05-10-2008

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°


RE: [Résolu] Faire de 3, une seule requête ? - Ekilio - 05-10-2008

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 :
<?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.


RE: [Résolu] Faire de 3, une seule requête ? - Plume - 05-10-2008

Plume vient de voir le réel problème. Il change ça.

@tchaOo°