8
votes

Limiter les options de liste déroulante basées sur Userid

Je pose cette question parce que je ne suis pas sûr de la meilleure façon de résoudre mon problème.

Problème: J'ai une liste déroulante pré-peuplée de 1 000 ou plusieurs numéros. Je dois limiter quels numéros apparaissent dans la liste déroulante sur la base de laquelle l'utilisateur utilise la liste déroulante. P>

Solution que j'ai pensé à: p>

  1. cache tous les numéros avec jQuery li>
  2. Utilisez JQuery / Ajax pour appeler une base de données, en passant un ID utilisateur LI>
  3. dB renvoie une liste de valeurs basée sur l'ID utilisateur LI>
  4. Afficher les options dans la liste déroulante qui ont les mêmes valeurs que les nombres renvoyés à partir de la DB LI> OL>

    permet de dire que c'est mon HTML STRY>: P>

    =======================
    |   User1    |  101   |
    |   User2    |  101   |
    |   User2    |  102   |
    |   User2    |  103   |
    |   User3    |  103   |
    =======================
    


5 commentaires

Peu importe la route que vous allez, considérez que vous devez vérifier sur le côté serveur que l'utilisateur a sélectionné une option appropriée. Sinon, tout utilisateur peut utiliser les outils de débogage de leur navigateur pour sélectionner une option non valide, ce qui pourrait être un risque de sécurité.


@ Deason Merci pour la tête. Je garderai cela à l'esprit quand je (espérons-le) arriver à ce point!


Comment renduez-vous cette liste du côté serveur? Votre meilleur pari va remplir cette liste sur le côté serveur car vous devez savoir quelles autorisations chaque utilisateur a; Cela vous empêchera de devoir vous soucier de tout utilisateur intelligent qui tente d'abuser d'un appel Ajax.


Donc, il doit être pré-peuplé avec tous les numéros sur le serveur, puis certains numéros cachés côté client? Veuillez clarifier ce qui est autorisé à arriver où.


@nunzabar c'est correct. La liste sera pré-peuplée côté client (à partir d'un serveur que je ne peux pas accéder à / modifier), puis l'appel AJAX à un Différent DB (simple, deux colonnes) puis renvoie les valeurs à l'appel d'origine Ajax , où alors JS masque les valeurs non renvoyées (ou affiche les valeurs retournées, s'ils sont initialement cachés.) C'est comme ça que je vois que cela devait arriver, mais cela pourrait aller différemment s'il y a une solution différente. J'espère que cela aide, laissez-moi savoir si cela n'a pas clarifié.


8 Réponses :


5
votes

J'irais seulement avec les étapes 2-3 de votre approche; Cependant, je ne stockerais pas les chiffres de la manière dont vous avez montré. Une meilleure approche serait de les stocker dans une table appelée user_value -or quelque chose comme ça -: xxx

juste parce que vous pouvez ensuite ajouter / supprimer / supprimer / mettre à jour / mettre à jour les valeurs à l'avenir par opposition à la réalisation de Pour analyser la valeur délimitée par des virgules.

J'éviterais d'utiliser JQuery pour simplement "masquer" des choses parce que JavaScript peut être désactivé par l'utilisateur et il peut finalement soumettre la valeur qu'il veut (visible ou invisible) - Ne faites jamais confiance à l'utilisateur utilisateur.

en conclusion, faites ceci:

  1. Utilisez JQuery / Ajax pour appeler une base de données, en passant un ID utilisateur
  2. dB renvoie une liste de valeurs basée sur l'ID utilisateur
  3. peupler la liste déroulante avec les valeurs renvoyées dans la base de données.
  4. Validez le formulaire sur le côté du serveur pour vous assurer que la valeur soumise est présente dans la table user_value .

2 commentaires

Icarus a raison - cacher des choses à JQuery n'est pas du tout en sécurité surtout si les utilisateurs ne sont pas censés avoir accès à eux s'ils ne sont pas authentifiés comme un rôle spécifique / type d'utilisateur.


@LCARUS J'ai mis à jour ma table de base de données pour refléter votre suggestion. Et j'ai également ajouté une note sur la sécurité, à l'aide de Show / Hide est acceptable (mais je ne sais pas si c'est la meilleure façon) dans cet exemple spécifique.



1
votes

Je suis toujours un peu confus sur vos contraintes, mais en fonction de votre commentaire:

La liste sera pré-peuplée côté client (à partir d'un serveur que je ne peux pas accéder / modifier), puis l'appel AJAX à une différence DB (simple, deux colonnes), puis renvoyez les valeurs à l'appel AJAX d'origine, où puis JS masque les valeurs non renvoyées (ou affichent les valeurs retournées, si elles sont initialement cachées.)

Pourquoi ne pas créer de service "unificateur" (sur un serveur) afin de ne faire qu'un appel AJAX (du client)?

http: //mysite/myservice.aspx/geoptionsforuser (101)

Ce service passerait aux deux bases de données une liste de la liste de l'option autorisée pour l'ID utilisateur donné. Cela permet au serveur de faire la majeure partie des lourdes levées et de réduire considérablement la quantité de jQuery sur le client.

Plus d'info:

L'URL est ce que JQuery utilise pour faire l'appel Ajax.

La chose la plus simple à faire est:

  1. Créer une page Web appelée http: //mysite/myservice.aspx
  2. Ajoutez une méthode publique appelée getOptionsForuser () qui accepte un entier et renvoie une liste de numéros. C'est la logique «unificateur» qui interroge les deux bases de données. Faire la méthode Ajax-appelable en ajoutant le webmethod < / a> attribut.
  3. Dans la page Web existante où vous souhaitez peupler vos déposées, vous faites un Ajax Appelez à http: //mysite/myservice.aspx/geoptionsforuser et transmettez l'ID utilisateur comme paramètre AJAX.


1 commentaires

Le service "unificateur" que vous parlez de sons génial, mais je suis assez perdu par cette réponse. Je ne connais pas le tout ajax ... alors je suppose que c'est pourquoi je ne comprends pas ce que myService / getOptionsForUser (101 ) est



2
votes

Si c'est la table de base de données d'exemple et un exemple d'élément SELECT. Ensuite, je pense que la meilleure méthode serait de ne rien écrire sur votre propre strong> et laissez simplement la base de données choisir ce qu'il faut partager et où partager.

Nous allons avec le codage. Je vais essayer d'expliquer ce que j'écris et comment j'écris; Puisque vous êtes un débutant: -) p>

code HTML pour vous h2>

Le code HTML pour votre travail, serait simple comme ce p>

Response.Write("Hello World!");


4 commentaires

Grande réponse @afzaal. Merci pour toutes les explications. Je suis toujours un peu confus cependant. Pourriez-vous casser le code dans les fichiers? Cela peut m'aider à comprendre encore. Par exemple, je ne sais pas où mettre sweetecurity.currenttuserid; ... entre autres. Excellente explication, je suis juste aussi de nouveaubie pour l'obtenir!


Vous êtes le bienvenu! :-) J'ai expliqué le fonctionnement de la classe Websecurity de la classe et de ses méthodes et ses propriétés :-) Je pense que vous pouvez maintenant le comprendre mieux :-) .. plus suite, vous pouvez également vérifier certains liens MSDN Pour une meilleure explication, n'hésitez pas à revenir pour aider si vous ne trouvez pas facile de comprendre :)


J'ai décerné cela la prime parce que le temps était à court et c'était la réponse la plus utile et la plus détaillée.


@Brett, aww Merci beaucoup Brett :-) J'apprécie vraiment votre aide pour moi :)



1
votes

Je pense qu'un bon moyen de le faire serait utiliser JSON pour tous les utilisateurs. Préparer une matrice JSON pour les utilisateurs avec des options et le rendre basé sur les utilisateurs pour peupler des options. par exemple.

var user1 = '["101","102","103"]';


0 commentaires

1
votes

Ceci est un exemple qui montre comment JQuery Ajax et PHP fonctionne pour rassembler:

Par exemple, lorsqu'un bouton a cliqué sur un AJAX Envoyer une commande à la langue latérale du serveur (PHP) et PHP PROCESS qui commandent et affiche une réponse appropriée : xxx

et voici le code PHP avec nom alerterme.php: xxx


0 commentaires

1
votes

problème simple. Je vais essayer de répondre à votre manière dont vous avez pensé.

0. Votre code HTML existant xxx

1. Cachez tous les numéros avec jQuery xxx

2. Utilisez JQuery / Ajax pour appeler une base de données, transmettre un UserID & 3. DB renvoie une liste de valeurs basée sur l'ID utilisateur xxx

4. Afficher les options dans DROPS DOWN qui ont les mêmes valeurs que les nombres renvoyés à partir de la DB xxx


1 commentaires

Les étapes 2, 3 et 4 partagent un bloc de code unique, alors combinez-les ensemble.



1
votes

Depuis que vous dites cela - vous avez des entrées pré-peuplées, je serais passé avec cette approche -

  1. Enregistrez d'abord tous les éléments d'une matrice JS à la page Load- P>

            //getting the id of the user and passing to AJAX call
            $.ajax({
                url: '',
                dataType: 'json',
                type: 'GET',
                success:function(data){
                    // other codes
                    var userItemList = []; //list of items for this user [102,103, etc]
                    $("select").empty();
                    $("select").append(alloptions[0]) //the first one since it is the null one
                    for(var i = 0; i < userItemList.length; i++){
                        for(var j = 0; j < alloptions.length; j++){
                            if (parseInt($(alloptions[j]).val()) == userItemList[i]){
                                $("select").append(alloptions[j]);
                            }
                        }
                    }
    
                }
            });
    
  2. puis pour chaque ID utilisateur après avoir obtenu la liste des éléments, le montrer et les masquer comme suit - p>

             var alloptions = $("select").find("option").get();
    


0 commentaires

1
votes

Si vous n'avez besoin que de renseigner une fois à la première page chargée, c'est la meilleure option de moi

​​Exemple: P>

HTML:
<select id="auto-populated">
    <?php
        //Next three lines you need if you dont have the user_id stored before in your code
        require('db.php');
        session_start();
        $user_id = $_SESSION['user_id'];

        //Selecting only the needed options to put here
        $sql = "SELECT dropdown_value, dropdown_option FROM tbl_dropdown WHERE dropdown_number='your-filter-kriteria-here'";
        $result = mysql_query($sql, $db) or die(mysql_error().': '.$sql);

        //After you got the filtered results from database, print them in the <select>
        echo "<option value=' '>Please select one...</option>";
        while ($item = mysql_fetch_assoc($result)) {
            echo "<option value='".$item['dropdown_value']."'>".$item['dropdown_option']."</option>";
        }
    ?>
</select>


0 commentaires