Aide pour une requête SQL

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Aide pour une requête SQL

Re: Aide pour une requête SQL

par moogli » 24 nov. 2016, 12:31

salut
je vois ta proposition a l'instant c'est tres gentil de ta part, car jusqu'ici j'ai pas encore trouvé une solution.
mais le seul probleme est que je n'est pas l'index user_role, je pense que tu faisais allusion à l'index role
Possible je ne connais pas ton application (même a force d'y passer du temps ;) ).
comme a chaque fois il faut adapter a ce que tu as en vrai vu que l'on ne peux pas tout savoir.
Cette variable de session correspond effectivement au rôle qui est attribué à l'utilisateur connecté ;)


@+

Re: Aide pour une requête SQL

par Henrigo » 23 nov. 2016, 17:43

dans le cas de l'admin il faut virer la condition sur l'utilisateur.
donc soit en modifiant 'dynamiquement' la requête avec un if dans le code, soit en modifiant la requête pour y ajouter un test sur le rôle utilisateur mais c'est pas forcément le plus simple
<?php
$variants = '
SELECT id, img_id, user_id, pos_nr, farbe, laenge_1, laenge_2, laenge_3, laenge_4, bem_1, bem_2, bem_3, a, b, c, d, e, al, be
FROM
   variants
   JOIN users USING(user_id)';
if ($_SESSION['user_role']!='admin') {
    $variants += PHP_EOL.' WHERE
   user_id = :current_user
   OR user_id IN(
        SELECT user_id
        FROM users
        WHERE ROLE = \'admin\')';
}
$req2 = $dbConnect->prepare($variants);
if ($_SESSION['user_role']!='admin') {
    $req2->bindParam(':current_user', $_SESSION['user_id'], PDO::PARAM_INT);
}
$req2->execute();
comme ça si l'utilisateur n'est pas administrateur on applique le filtre (via le prédicat) si non (donc admin) on affiche tout.


@+
salut
je vois ta proposition a l'instant c'est tres gentil de ta part, car jusqu'ici j'ai pas encore trouvé une solution.
mais le seul probleme est que je n'est pas l'index user_role, je pense que tu faisais allusion à l'index role

Re: Aide pour une requête SQL

par moogli » 22 nov. 2016, 12:47

dans le cas de l'admin il faut virer la condition sur l'utilisateur.
donc soit en modifiant 'dynamiquement' la requête avec un if dans le code, soit en modifiant la requête pour y ajouter un test sur le rôle utilisateur mais c'est pas forcément le plus simple
<?php
$variants = '
SELECT id, img_id, user_id, pos_nr, farbe, laenge_1, laenge_2, laenge_3, laenge_4, bem_1, bem_2, bem_3, a, b, c, d, e, al, be
FROM
   variants
   JOIN users USING(user_id)';
if ($_SESSION['user_role']!='admin') {
    $variants += PHP_EOL.' WHERE
   user_id = :current_user
   OR user_id IN(
        SELECT user_id
        FROM users
        WHERE ROLE = \'admin\')';
}
$req2 = $dbConnect->prepare($variants);
if ($_SESSION['user_role']!='admin') {
    $req2->bindParam(':current_user', $_SESSION['user_id'], PDO::PARAM_INT);
}
$req2->execute();
comme ça si l'utilisateur n'est pas administrateur on applique le filtre (via le prédicat) si non (donc admin) on affiche tout.


@+

Re: Aide pour une requête SQL

par Henrigo » 21 nov. 2016, 12:27

voir point N°1 et 2 de ma précédente réponse merci


@+
je pense que j'ai été pas precis a ce niveau j'ai ajouté les ligne suivante
$currentUser = $_SESSION['user_id'];
$req2 = $dbConnect->prepare($variants);
$req2->bindParam(':CURRENT_USER', $currentUser, PDO::PARAM_INT);
$req2->execute();
je peux dire que cela fonctionne en ce qui concerne les Users, c'est a dire un user peu voire ce qu'il a genéré et ce que l'administrateur a genéré. Malheureusement l'administrateur peut juste voire ce qu'il a genéné et non y compris ce que les Users on genéré.
Merci bien de vos propositions

Re: Aide pour une requête SQL

par moogli » 21 nov. 2016, 12:21

voir point N°1 et 2 de ma précédente réponse merci


@+

Re: Aide pour une requête SQL

par Henrigo » 21 nov. 2016, 11:17

salut,
1/ il faut vraiment que tu comprennes le code que l'on te donnes.
CURRENT_USER fait référence à l'utilisateur courant de la base de données du coup rien à voir avec celui qui est connecté sur l'application. Donc seul les choses des admins s'affichent.
2/ :current_user c'est le marqueur pour les requêtes préparées
http://php.net/manual/fr/pdo.prepare.php et http://php.net/manual/fr/pdostatement.bindparam.php
3/ dans ton code il y a cela $_SESSION['user_id'] je suppose donc que c'est ce que tu dois utiliser pour "bind" le marqueur.


@+
Tu as raison mais je controle au prealable le code et en controlant cela dans phpmyadmin regarde comment au niveau des 2 point il ya deja un probleme qu'il me renvoit
http://www.bilder-upload.eu/show.php?fi ... 716708.png

Re: Aide pour une requête SQL

par moogli » 21 nov. 2016, 10:46

salut,
1/ il faut vraiment que tu comprennes le code que l'on te donnes.
CURRENT_USER fait référence à l'utilisateur courant de la base de données du coup rien à voir avec celui qui est connecté sur l'application. Donc seul les choses des admins s'affichent.
2/ :current_user c'est le marqueur pour les requêtes préparées
http://php.net/manual/fr/pdo.prepare.php et http://php.net/manual/fr/pdostatement.bindparam.php
3/ dans ton code il y a cela $_SESSION['user_id'] je suppose donc que c'est ce que tu dois utiliser pour "bind" le marqueur.


@+

Re: Aide pour une requête SQL

par Henrigo » 21 nov. 2016, 09:46

alors ce qui est faux à la ligne 152, rien, mais l'exception est levée à cette ligne et non catchée, donc le message à bon.

ensuite, comme toujours, le plus simple c'est de déboguer la requête finale (soit en la récupérant avec un débogueur soit en l'affichant) et de la tester dans un client SQL.

dans ta table la colonne role contient quoi ? parce que la $isAdmin va contenir true / false mais ce n'est pas une chaîne de caractères c'est un booléen.
Le message d'erreur parle d'une parenthèse fermante qui ne serait pas à sa place. Peux être celle derrière $isAdmin ?
au passage j'ai oublié un s dans la colonne de jointure de la table users => uer_id vs userid

pour ce qui est du code j'ai même pas regardé le tas de html / php au départ c'est trop long :-)

un peux formaté ça donne ça
SELECT id,img_id,user_id,login,laenge_1,laenge_2,laenge_3,laenge_4,bem_1,bem_3,bem_3,a,b,c,d,e,al,be
FROM variants
JOIN users USING(user_id)
JOIN images USING(img_id)
WHERE user_id = :current_user
OR user_id   IN
  ( SELECT user_id FROM users WHERE role ='xxxx')
au passage, vu les noms de colonnes il faut vraiment faire quelque chose car c'est un bon cas de modèle qui va poser problème (a partir du moment où tu as colx coly c'est qu'il y a une solution autre avec une table liée).

@+
Salut Moogli,

j'ai enlevé les deux point avant CURRENT et maintenant plus d'erreur, mais le problem est le suivant ce que un user genére lui même ne peut les voire même un administrateur ne peut les voire. seul ce que un administrateur genére un administrateur est visible par tous .
S'il te plait je me reprend a ce niveau j'aimerai que les variantes qu'un user genére soit juste visible par lui et l'administrateur et non pas par les autre users. mais ce que un administrateur genére soit visible par tous.
$variants = '
SELECT
   id,
   img_id,
   user_id,
   pos_nr,
   farbe,
   laenge_1,
   laenge_2,
   laenge_3,
   laenge_4,
   bem_1,
   bem_2,
   bem_3,
   a,
   b,
   c,
   d,
   e,
   al,
   be
FROM
   variants
   JOIN users USING(user_id)
WHERE
   user_id = CURRENT_USER
   OR user_id IN(
        SELECT user_id
        FROM users
        WHERE ROLE = \'admin\');';
ok je venais de lire qu'en enlevant les : points c'est pas du tout bon mais comment donc faire si j'otiens cette erreur

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY000]: General error: 2031 ' in C:\xampp\htdocs\kant\variants.php:210 Stack trace: #0 C:\xampp\htdocs\kant\variants.php(210): PDO->query('\nSELECT\n id,\n...') #1 C:\xampp\htdocs\kant\index.php(72): require_once('C:\\xampp\\htdocs...') #2 {main} thrown in C:\xampp\htdocs\kant\variants.php on line 210

sachant que la ligne 210 est bien celle que j'ai deja mentionné plus haut $req2 = $dbConnect->query($variants);

Re: Aide pour une requête SQL

par moogli » 18 nov. 2016, 13:32

alors ce qui est faux à la ligne 152, rien, mais l'exception est levée à cette ligne et non catchée, donc le message à bon.

ensuite, comme toujours, le plus simple c'est de déboguer la requête finale (soit en la récupérant avec un débogueur soit en l'affichant) et de la tester dans un client SQL.

dans ta table la colonne role contient quoi ? parce que la $isAdmin va contenir true / false mais ce n'est pas une chaîne de caractères c'est un booléen.
Le message d'erreur parle d'une parenthèse fermante qui ne serait pas à sa place. Peux être celle derrière $isAdmin ?
au passage j'ai oublié un s dans la colonne de jointure de la table users => uer_id vs userid

pour ce qui est du code j'ai même pas regardé le tas de html / php au départ c'est trop long :-)

un peux formaté ça donne ça
SELECT id,img_id,user_id,login,laenge_1,laenge_2,laenge_3,laenge_4,bem_1,bem_3,bem_3,a,b,c,d,e,al,be
FROM variants
JOIN users USING(user_id)
JOIN images USING(img_id)
WHERE user_id = :current_user
OR user_id   IN
  ( SELECT user_id FROM users WHERE role ='xxxx')
au passage, vu les noms de colonnes il faut vraiment faire quelque chose car c'est un bon cas de modèle qui va poser problème (a partir du moment où tu as colx coly c'est qu'il y a une solution autre avec une table liée).

@+

Re: Aide pour une requête SQL

par Henrigo » 17 nov. 2016, 14:16

salut,

pour l'expression, il manque des mots (dont des verbes) c'est assez dur de te suivre ;)

Par exemple tu utilises des TABLES SQL et non des tableaux ;)

pour le reste.
il te faut selectionner les lignes qui appartiennent à l'utilisateur courant (tu devrais avoir l'id en session depuis sa connexion) ainsi que celle du (ou des admin)

du coup
select id, img_id, user_id, login a, b, c, d,e
from variants
join users using(uer_id)
-- je suppose que tu as une table images vu le nom du champs :)
join images using(img_id) 
where user_id = :current_user or user_id in( select user_id from users where role = 'admin')
Avec cette requête tu passes en paramètre l'id de l'utilisateur connecté (current_user) et ajoute les lignes correspondant aux admin.

tu peux aussi ajouter un flag "private" dans la table variants histoire de permettre le partage avec les autres utilisateurs.
(au un truc plus complexe avec une table contenant les utilisateurs avec qui on partage).

@+
Salut ,
j'ai pas voulu afficher tou code du script ici ca fait plus de 450 lignes et pour celui qui voudrai bien me venir en aide c'est trop c'est la raison pour la quel j'ai reduit le code, effectivement j'ai la table image
lorsque j'aissaye la requête malheureusement j'obtient une erreur avec la base de données
$variants = ('select id, img_id, user_id, login,laenge_1, laenge_2, laenge_3, laenge_4,bem_1,bem_3,bem_3, a, b, c, d,e,al,be
                  from variants join users using(uer_id) join images using(img_id) where user_id = :current_user or user_id in( select user_id from users where role = '.$isAdmin.')');
avec
$isAdmin = (isset($_SESSION['role']) && $_SESSION['role'] === 'admin');
Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ')' at line 2' in C:\xampp\htdocs\kantteile\variants.php:152 Stack trace: #0 C:\xampp\htdocs\kantteile\variants.php(152): PDO->query('select id, img_...') #1 C:\xampp\htdocs\kantteile\index.php(72): require_once('C:\\xampp\\htdocs...') #2 {main} thrown in C:\xampp\htdocs\kantteile\variants.php on line 152
et je ne vois pas par ailleurs ce qui est faux a la ligne 152 la voici
$req2 = $dbConnect->query($variants);

Re: Aide pour une requête SQL

par moogli » 17 nov. 2016, 11:27

salut,

pour l'expression, il manque des mots (dont des verbes) c'est assez dur de te suivre ;)

Par exemple tu utilises des TABLES SQL et non des tableaux ;)

pour le reste.
il te faut selectionner les lignes qui appartiennent à l'utilisateur courant (tu devrais avoir l'id en session depuis sa connexion) ainsi que celle du (ou des admin)

du coup
select id, img_id, user_id, login a, b, c, d,e
from variants
join users using(uer_id)
-- je suppose que tu as une table images vu le nom du champs :)
join images using(img_id) 
where user_id = :current_user or user_id in( select user_id from users where role = 'admin')
Avec cette requête tu passes en paramètre l'id de l'utilisateur connecté (current_user) et ajoute les lignes correspondant aux admin.

tu peux aussi ajouter un flag "private" dans la table variants histoire de permettre le partage avec les autres utilisateurs.
(au un truc plus complexe avec une table contenant les utilisateurs avec qui on partage).

@+

Aide pour une requête SQL

par Henrigo » 17 nov. 2016, 10:27

Salut a tous

j'ai encore un probleme concernant une requête SQL

le Script suivant me permet à partir d'un produit de générer une ou plusieurs variantes.
<?php

require_once __DIR__ . '/connection.php';

$product = 'SELECT * FROM product WHERE id = '.$prodId;

$req     = $dbConnect->query($product);
$prod    = $req->fetch(PDO::FETCH_ASSOC);

//$isAdmin = (isset($_SESSION['role']) && $_SESSION['role'] === 'admin');

?>

<div id="produits">

  <div class="produit h-product" id="produit_<?php echo $prod['id'] ?>" align="center" style="margin-right:58%">
        <form method="post" action="formular.php" autocomplete="off" name="<?php echo $prod['id'] ?>">
            <input type="hidden" name="id" value="<?php echo $prod['id'] ?>">
			   <table border="0" cellpadding="0">
                  <tr>
				    <td style="  color:#FFFFFF ; background-color:#860000; width:0%; height:13px; border:3px solid #860000;">PRODUKT</td>
                  </tr>					
				  <tr class="row9">
                    <td class="column0 style24 null style27" colspan="4" rowspan="8">
                        <img style=" z-index: 1; left: 40px; top: 10px; width: 220px; height: 220px;"
                             src="images/<?php echo $prod['path'] ?>"><input type="hidden" name="selected_photo"
                                                                             value="<?php echo $prod['path'] ?>"></td>
                    <td class="column4 style10 s">a</td>
                    <td class="column5 style19 n" style="font-size:15px"><input type="text" name="a" size="6" maxlength="4"  value="<?php echo $prod['a'] ?>"></td>

                </tr>
                <tr class="row10">
                    <td class="column4 style11 s">b</td>
                    <td class="column5 style20 n" style="font-size:15px"><input type="text" name="b" size="6" maxlength="4"  value="<?php echo $prod['b'] ?>"></td>

                </tr>
                <tr class="row11">
                    <td class="column4 style11 s">c</td>
                    <td class="column5 style20 null" style="font-size:15px"><input type="text" name="c" size="6" maxlength="4"  value="<?php echo $prod['c'] ?>">
                    </td>

                </tr>
                <tr class="row12">
                    <td class="column4 style11 s">d</td>
                    <td class="column5 style20 null" style="font-size:15px"><input type="text" name="d" size="6" maxlength="4"  value="<?php echo $prod['d'] ?>">
                    </td>

                </tr>
                <tr class="row13">
                    <td class="column4 style11 s">e</td>
                    <td class="column5 style20 null" style="font-size:15px"><input type="text" name="e" size="6" maxlength="4"  value="<?php echo $prod['e'] ?>">
                    </td>

                </tr>
	          <tr class="row17" >
                    <td class="column0 style14 s" style="font-size:14px; text-align:center;font-weight:bold"><input type="reset" name="affacer_donnée" value="effacer"></td>
                    <td class="column1 style40 n style42" colspan="2"></td>
                    <td class="column3 style15 s" style="font-weight:bold">
                    <input type="checkbox" name="variant"> Ajouter une Variante </td>
                    <td class="column4 style40 n style41" colspan="2">
                    <input type="submit" name="save_product" value="Sauvegarder">
                    </td>
                </tr>	
				
                </tbody>
            </table>
        </form>
    </div>	

<?php 
    
	// Variante est gêneré a ce niveau
    $variants = 'SELECT * FROM variants WHERE img_id = '.$prodId;

    $req2 = $dbConnect->query($variants);

    while ($variant = $req2->fetch(PDO::FETCH_ASSOC)) {
    
    ?>
        <div class="produit" id="produit_<?php echo $variant['id'] ?>" align="center" style="margin-right:68%">
            <form method="post" action="formular.php" name="<?php echo $variant['id'] ?>">
                <input type="hidden" name="id" value="<?php echo $variant['id'] ?>">
                <table border="0" cellpadding="0">	
				<td style="  color:#FFFFFF ; background-color:#004B27; width:0%; height:13px; border:3px solid #004B27;">VARIANTE</td>
				
				<tr class="row9">
                        <td class="column0 style24 null style27" colspan="4" rowspan="8">
                            <img style=" z-index: 1; left: 40px; top: 10px; width: 220px; height: 220px;" src="images/<?php echo $prod['path'] ?>"><input type="hidden" name="selected_photo" value="<?php echo $prod['path'] ?>" ></td>
                        <td class="column4 style10 s">a</td>
                        <td class="column5 style19 n"style="font-size:15px"><input type="text" name="a" size="6" maxlength="4" value="<?php echo $variant['a'] ?>" ></td>

                    </tr>
                    <tr class="row10">
                        <td class="column4 style11 s">b</td>
                        <td class="column5 style20 n"style="font-size:15px"><input type="text" name="b" size="6" maxlength="4" value="<?php echo $variant['b'] ?>" ></td>

                    </tr>
                    <tr class="row11">
                        <td class="column4 style11 s">c</td>
                        <td class="column5 style20 null"style="font-size:15px"><input type="text" name="c" size="6" maxlength="4" value="<?php echo $variant['c'] ?>" ></td>

                    </tr>
                    <tr class="row12">
                        <td class="column4 style11 s">d</td>
                        <td class="column5 style20 null"style="font-size:15px"><input type="text" name="d" size="6" maxlength="4" value="<?php echo $variant['d'] ?>" ></td>

                    </tr>
                    <tr class="row13">
                        <td class="column4 style11 s">e</td>
                        <td class="column5 style20 null" style="font-size:15px"><input type="text" name="e" size="6" maxlength="4" value="<?php echo $variant['e'] ?>" ></td>

                    </tr>
					
                
                    <tr class="row17">
                        <td class="column0 style14 s" style="font-size:14px; text-align:center;font-weight:bold">

                            <input type="reset" name="daten_loeschen" value="Zurücksetzen">

                            </td>
                        <td class="column1 style40 n style42" colspan="2">

                        </td>
                        <td class="column3 style15 s">
                        </td>
                        <td class="column4 style40 n style41" colspan="2">
                        <input type="submit" name="save_variant" value="Speichern">
                        </td>
                    </tr>
               

                    </form>

                   <tr class="row17">
                        <td class="column0 style14 s"></td>

                        <td class="column1 style40 n style42" colspan="2">
                        
                         <form method="post" action="delete_variant.php" name="delete_<?php echo $variant['id'] ?>">
                            <input type="hidden" name="id" value="<?php echo $variant['id'] ?>">
                            <input type="hidden" name="img_id" value="<?php echo $prod['id'] ?>">
                            <input type="hidden" name="img_path" value="<?php echo $prod['path'] ?>">
                            <input type="hidden" name="type" value="variant">
                            <input type="hidden" name="location" value="<?php echo $_SERVER['REQUEST_URI'] ?>">
                            <input type="hidden" name="user_id" value="<?php echo $_SESSION['user_id'] ?>">
                            <input type="hidden" name="sessionID" value="<?php echo $_SESSION['sessionID'] ?>">
                            <input type="hidden" name="time" value="<?php echo $_SESSION['time'] ?>">
                            <input type="submit" name="select_variant" value="Löschen" style="align:center">
                        </form>
                       
                        </td>
                        <td class="column3 style15 s" style="font-size:14px; text-align:center;font-weight:bold">
                        <form method="post" action="drucker.php" name="<?php echo $variant['id'] ?>">
                            <input type="hidden" name="id" value="<?php echo $variant['id'] ?>">
                            <input type="hidden" name="img_id" value="<?php echo $prod['id'] ?>">
                            <input type="hidden" name="img_path" value="<?php echo $prod['path'] ?>">
                            <input type="hidden" name="type" value="variant">
                            <input type="hidden" name="location" value="<?php echo $_SERVER['REQUEST_URI'] ?>">
                            <input type="hidden" name="user_id" value="<?php echo $_SESSION['user_id'] ?>">
                            <input type="hidden" name="sessionID" value="<?php echo $_SESSION['sessionID'] ?>">
                            <input type="hidden" name="time" value="<?php echo $_SESSION['time'] ?>">
                            <input type="submit" name="select_variant" value="Auswählen" style="align:center">
                        </form>
                        </td>
                        <td class="column4 style40 n style41" colspan="2">
                        </td>
                    </tr>
                    </tbody>
                </table>

        </div>
        <?php
        
    }

?>
actuelle lorsqu'un administrateur ou un simple user une ou plusieurs variantes génére tous les autres

users pevent voire ce que l'administrateur et le User ont générer.


Je souhaiterai bien que si un user des variantes génére seul l'administrateur et lui peuvent
voire ce qu'il a générer et non les autres users.

mais il faut noter que ce que l'administrateur génére doit être vus par tous les users.

si je me suis mal exprimé a un niveau pardon ne pas hesiter.

Voici a quoi ressemble les tableaux users et variants
users.sql
CREATE TABLE `users` (
  `user_id` int(11) NOT NULL,
  `login` varchar(250) NOT NULL,
  `pass` varchar(250) NOT NULL,
  `role` varchar(256) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
variants.sql
CREATE TABLE `variants` (
  `id` int(16) NOT NULL,
  `img_id` int(16) NOT NULL,
  `user_id` int(11) NOT NULL,
  `a` int(11) DEFAULT '0',
  `b` int(11) DEFAULT '0',
  `c` int(11) DEFAULT '0',
  `d` int(11) DEFAULT '0',
  `e` int(11) DEFAULT '0',
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Merci bien de vos propositions