IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

ASP.NET Discussion :

Commande SQL simple


Sujet :

ASP.NET

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 6
    Par défaut Commande SQL simple
    Bonjour,

    Ma question est relativement idiote, je m'en rends bien compte, mais je débute en ASP.NET ainsi qu'en C#. C'est un monde tout nouveau pour moi et je le découvre au fur et à mesure.

    J'essaie de réaliser une page qui récupère un ID depuis un variable passée en GET, puis de récupérer depuis une base de donnée MySQL les informations liées à l'ID en question. Idéalement, j'aimerais pouvoir créer un "template" assez clair dans le fichier ASPX, pour le graphiste. J'aimerais simplement avoir à lui dire "Je t'enverrai ici le nom de fichier de l'image, contente toi de faire le CSS". Un peu comme un Repeater, mais sans répétition.

    Mon code ressemble à ceci pour le moment :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    using System;
    using System.Collections;
    using System.Configuration;
    using System.Data;
    using System.Linq;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.HtmlControls;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Xml.Linq;
    using MySql.Data.MySqlClient;
     
    public partial class ViewImage : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            // Check if an image id is specified in the get variable "imageid". 
            // ##### Will need to add a verification to evade SQL injections! #####
            if (String.Compare(Request.QueryString["imageid"], null) > 0)
            {
                string imageId = Request.QueryString["imageid"];
                // We query the images table
                string selectSQL;
                selectSQL = "SELECT id, date, filename, uploaderid, lang, descr FROM images ";
                selectSQL += "WHERE id=" + imageId + " LIMIT 1";
     
                string connString = ConfigurationManager.ConnectionStrings["MySQL"].ConnectionString;
                MySqlConnection con = new MySqlConnection(connString);
                MySqlCommand cmd = con.CreateCommand();
                cmd.CommandText = selectSQL;
                MySqlDataReader reader;
     
                // We try to query the infos about the image and extract them
                try
                {
                    con.Open();
                    reader = cmd.ExecuteReader();
                    reader.Read();
                    viewImageLabelTwo.Text = reader["filename"];
                    reader.Close();
                }
                finally
                {
                    con.Close();
                }
            }
            else
            {
                viewImageLabelTop.Text = "No image is selected.";
            }
     
        }
    }
    Mais lors de la compilation, Visual Studio me retourne cette erreur:

    Error 257 Cannot implicitly convert type 'object' to 'string'. An explicit conversion exists (are you missing a cast?)
    J'avoue que j'ai du mal à comprendre ce message, et je suis sûr que c'est quelque chose d'assez bête que j'ai du oublier ! Toute aide serait la bienvenue!

  2. #2
    Rédacteur
    Avatar de Louis-Guillaume Morand
    Homme Profil pro
    Cloud Architect
    Inscrit en
    Mars 2003
    Messages
    10 839
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Cloud Architect
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2003
    Messages : 10 839
    Par défaut
    tu débutes mais on va te donner des bons conseils dès maintenant ca te servira pour la suite.

    Premier point
    NE JAMAIS JAMAIS faire confiance aux données d'URL. Si j'appelle ta page en mettant par exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    afficheImage.aspx?imageid=1;DELETE * FROM IMAGES;--
    j'efface tes données


    Ainsi donc, tu dois donc utiliser une autre méthode:
    1 première solution. Utiliser une requête paramétrée et utiliser imageId comme paramètre de type Integer

    2 caster ton imageId en Int32 avant de le concatener à ta chaine. (la contenation est toujours à éviter si possible)


    Second Point
    pense à utiliser le mot clé using pour les objets disposables. exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    using(MySqlConnection con = new MySqlConnection(connString))
    {
     
     ton code
     
    }
    ca aide au nettoyage des ressources.

    Troisieme point
    if (String.Compare(Request.QueryString["imageid"], null) > 0)
    je suis pas sûr que ca soit plus simple et efficace que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(Request.QueryString["imageid"] != String.IsNullOrEmpty)
    qui est la méthode la plus propre et la plus performante.

    Quatrieme point
    Quelle est la ligne qui plante? si tu cliques sur l'erreur dans visual, ca te donne la ligne. c'est pas à nous de chercher. aide nous et nous t'aiderons

  3. #3
    Membre chevronné Avatar de Redouane
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    435
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2003
    Messages : 435
    Par défaut
    Bonjour,

    Je suis completement d'accord avec Louis-Guillaume Morand, et franchement, de ma part, j'apprend des trucs de lui .

    Je pense que la ligne qui plante c'est celle là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    viewImageLabelTwo.Text = reader["filename"];
    il faut en fait faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    viewImageLabelTwo.Text = reader["filename"].ToString();
    car reader["filename"] est de type objet.

    NB: essaye de se documenter sur SQL Injection

  4. #4
    Membre Expert
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    1 277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Réunion

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 277
    Par défaut
    if(Request.QueryString["imageid"] != String.IsNullOrEmpty) ?

    if(!String.IsNullOrEmpty(Request.QueryString["imageid"]) plutôt

  5. #5
    Rédacteur
    Avatar de Louis-Guillaume Morand
    Homme Profil pro
    Cloud Architect
    Inscrit en
    Mars 2003
    Messages
    10 839
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Cloud Architect
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2003
    Messages : 10 839
    Par défaut
    Citation Envoyé par Kaidan Voir le message
    if(Request.QueryString["imageid"] != String.IsNullOrEmpty) ?

    if(!String.IsNullOrEmpty(Request.QueryString["imageid"]) plutôt
    j'étais en train de relire mon post et je me disais que je l'avais jamais écrit de cette façon ^^
    l'habitude d'utiliser String.Empty je pense

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 6
    Par défaut
    Merci à tous pour vos conseils. Le problème était bien celui relevé par Redouane, j'avais omis le .toString lorsque j'utilisais reader["filename"].

    Concernant le 1er point de Louis-Guillaume, je suis d'accord mais en vérité je cherche toujours une bonne façon d'éviter les injections SQL (je l'ai mis en commentaire dans le code ). PHP utilise une fonction nommée mysql_real_escape() qui prend la variable en entrée, mais je n'ai pas encore trouvé de moyen propre de faire ça.

    Quelle serait la solution la plus propre, parmis les deux suggérées?

    Je prend bonne note du second point, je vais me renseigner pour voir plus en détails comme fonctionne ce mot clé. Le troisième point est exactement ce que je cherchais, mais faute d'avoir trouvé j'ai du innover un peu. Vos suggestions ont en effet l'air beaucoup plus propres.

    Quant au quatrième point, je suis bien d'accord que j'aurais du éviter d'oublier de noter la ligne en question. C'est quand même ça le plus important! Désolé de vous avoir forcé debug manuellement :/

  7. #7
    Rédacteur
    Avatar de Louis-Guillaume Morand
    Homme Profil pro
    Cloud Architect
    Inscrit en
    Mars 2003
    Messages
    10 839
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Cloud Architect
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2003
    Messages : 10 839
    Par défaut
    Quelle serait la solution la plus propre, parmis les deux suggérées?
    ni l'une ni l'autre ^^
    Disons qu'il existe des frameworks faits pour dont celui très bien fait par Fabrice Marguerie et son module s'appelle PageMethods. Tant qu'on l'utilise de façon simple, pour la génération d'URLs ou de parsing de paramètres, il est génial. Je lui ai par contre trouvé des BUGs si l'on s'amuse à encoder certaines choses car de mémoire, il fait un URLDecode de trop, ce qui gêne dans certains cas (notamment dans le cas où je voulais l'utiliser) et j'ai donc dû le virer pour cette page.

    sinon, la plus propre, dans ton cas, c'est de tester toi-même si la donnée est bonne ou erronée. ca permet de réagir vis à vis de l'utilisateur.

    Néanmoins, ca n'empeche pas de toute manière d'utiliser une requête paramétrée derrière

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 6
    Par défaut
    Et donc, la meilleure méthode pour tester si la valeur est bonne ou erronée (ou en tout cas d'éviter une injection SQL), serait de faire quelque chose comme ceci ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    double d = 0;
            Double.TryParse(Request.QueryString["imageid"], out d);
            if(d == 1){
                viewImageLabelTop.Text = "Is an int";
            }
            else{
                viewImageLabelTop.Text = "Is not an int";
            }
    Puis de le reconvertir en string par la suite pour l'utiliser dans le Select ?

  9. #9
    Rédacteur
    Avatar de Louis-Guillaume Morand
    Homme Profil pro
    Cloud Architect
    Inscrit en
    Mars 2003
    Messages
    10 839
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Cloud Architect
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2003
    Messages : 10 839
    Par défaut
    le début oui, la fin non.

    pourquoi d vaudrait 1? D vaudra la valeur de ton ID. moi je mettrai plutot un test
    car tu sais qu'un ID en base est censé etre positif. je dis bien censé car j'ai un collègue qui s'est amusé à mettre des ID négatifs et bizarrement, derrière, le programme marche plus très bien

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 6
    Par défaut
    En effet, ça marche très bien ainsi! Merci

    Voici la fonction, pour la postérité.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    // Returns 1 if specified string is a number
            public static bool CheckIfNumber(string getValue)
            {
                double d = 0;
                Double.TryParse(getValue, out d);
     
                // If getValue was a number, returned value is larger than 0
                if (d > 0)
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }

  11. #11
    Rédacteur
    Avatar de Louis-Guillaume Morand
    Homme Profil pro
    Cloud Architect
    Inscrit en
    Mars 2003
    Messages
    10 839
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Cloud Architect
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2003
    Messages : 10 839
    Par défaut
    ah non, pas bon ca non plus.
    enfin j'aurais pas forcément fait comme ca. car là, dans le cas où tu utiliserais un Int derrière, tu devrais refaire un cast de ton string (paramètre).

    L'avantage du TryParse, c'est de faire un cast en même temps que gérer les exceptions.
    il faudrait je pense, pouvoir utiliser directement ton "d" puisqu'il est prêt à l'emploi

  12. #12
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 6
    Par défaut
    Oui, j'avais prévu de reconvertir la valeur en string dans la fonction et la retourner, mais je préfère me garder une petite flexibilité :-)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. execution de 2 commandes sql simulanément
    Par manikou dans le forum MFC
    Réponses: 4
    Dernier message: 03/05/2005, 15h10
  2. Commande SQL / connaître taille d'1 base
    Par Thomad dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 26/04/2005, 11h38
  3. [JDBC] Commande SQL récalcitrante
    Par Dahu dans le forum JDBC
    Réponses: 7
    Dernier message: 05/04/2005, 16h03
  4. commande SQL truncate table xxx
    Par Yogy dans le forum SQL
    Réponses: 1
    Dernier message: 07/10/2004, 14h57
  5. [dBase]il y a mieux que la commande sql UPDATE ?
    Par sana72 dans le forum Autres SGBD
    Réponses: 4
    Dernier message: 12/12/2002, 11h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo