Bonjour
J'aimerais savoir à quoi sert la requête du type select 1 from[...].
Merci
-----
Bonjour
J'aimerais savoir à quoi sert la requête du type select 1 from[...].
Merci
Bonjour
Cette requête retournera une seule colonne contenant la valeur 1 et autant de lignes qu' il y a dans la sélection.
Une colonne contenant la valeur une ? Cad la première colonne ?
Non pas la première colonne (première de quoi ?).
Une colonne "virtuelle", qui n'existe pas dans la base mais qui est "générée" par la requête.
On peut aussi la nommer par commodité:
Pour répondre a la question, cette requête ne sert à rien, en l'état en tout cas.Code:SELECT 1 AS nom_colonne WHERE ...
Elle retournera donc une colonne "virtuelle", peuplée de 1, et un nombre de ligne correspondant aux "réponses" de la clause WHERE...
Ca a un sens en tant que sous requête corrélée à une autre requête ou pour vérifier l'existence de (au moins) une ligne correspondant à la sélection, et un certain nombres d'autres cas plus ou moins spécifiques.
En pratique, des cas où il est plus intéressant de ramener N lignes plutôt que la valeur d'un COUNT(*).
Par ailleurs, si les index et les colonnes de la clause where se recouvrent bien, ca permet de faire un test très rapide par simple lecture de l'index sans avoir à lire les données de la table (si l'optimiseur fait son boulot correctement).
Bien entendu !
Voilà pourquoi je précisais "l'état".
Le cas type dans lequel on l'utilise est en tant que sous-requête pour ne pas avoir à "rapatrier" un tas de données tout en obtenant le nombre de ligne correspondant à la clause WHERE, comme tu l'as bien précisé, contraitement à COUNT() qui ne retourne qu'une valeur, mais qui, de plus, parcourt toutes les données des enregistrement, ce qui explique le gain en fonction de l'optimiseur (enfin c'est ce que je comprends...).
D'accord je comprend. Juste par curiosité, comment fait on pour afficher le resultat de la requete (la colonne virtuelle) si on ne lui donne pas de nom avec AS? J'ai fais un test mais je n'ai eu aucun résultat avec $reponse=$bdd->query ('SELECT 1 AS colonne FROM jeux WHEN 1=1') et ensuite j'affiche avec $donnees=$reponse->fetch ())
Merci pour votre aide
Bonsoir,
Là tu n'affiche rien du tout.
Pour afficher les réponses, qui sont retournées sous forme de tableau, il faut parcourir le tableau et en afficher les élements un par un.
Ou quelquechose dans le genre .... PHP c'est assez loin pour moi...Code:$i = 1; while ($row = mysql_fetch_array($reponse,MYSQL_NUM)) { printf("%d : %s",$i, $row[0]); $i++; }
Dernière modification par Ikhar84 ; 30/06/2017 à 21h14.
oui je sais je n'avais pas mis tout le code dans mon message. En fait ca fonctionnait pas parce que j'ai ecrit : $reponse = $bdd->query('SELECT 1 FROM jeux WHEN 1=1');.
C'est le 1=1 qui créer l'erreur suivante :
Fatal error: Uncaught Error: Call to a member function fetch() on boolean in C:\MAMP\htdocs\blindinjection. php:26 Stack trace: #0 {main} thrown in C:\MAMP\htdocs\blindinjection. php on line 26. Pourquoi ca ne marche pas avec la condition?
Voila tout le code:
$reponse = $bdd->query('SELECT 1 AS colonne FROM jeux WHEN 1=1');
while ($donnees = $reponse->fetch())
{
echo ('<p>' . $donnees['colonne']);
}
l'erreur détaillée:
Fatal error: Uncaught PDOException: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHEN 1=1' at line 1 in C:\MAMP\htdocs\test.php:23 Stack trace: #0 C:\MAMP\htdocs\test.php(23): PDO->query('SELECT * FROM j...') #1 {main} thrown in C:\MAMP\htdocs\test.php on line 23
"When" ?
Ça devrait pas être "where" ?
oui merci en fait lerreur est toute bete j'ai écrit WHEN au lieu de WHERE, (fatigue dsl). Du coup ca fonctionne, comme vous me lavez expliqué. Je me demande quand même comment faire, dans le cas ou on n'utilise pas l’opérateur AS, pour afficher la colonne virtuelle vu qu'on ne connait pas son nom.
Bien vu Chanur !
J'étais concentré sur le 1=1 et les tentatives de notre ami à comprendre les injections SQL.
Et franchement je me demandais jusqu'où on pouvait l'aider...
@Harominc: lorsqu'une requête pose problème on la simplifie et on en expurge l'inutile, ici la requête se simplifie en:
La requête aurait ainsi parfaitement fonctionnéCode:SELECT 1 FROM jeux;
merci pour votre aide jai eu toutes les reponses a mes questions