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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 :/

+ 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