2009-02-09 8 views
2

Je suis très à l'aise avec le web dev, mais je suis en train de mettre en place un catalogue de logiciels simple avec ASP classique. Tout semble bien, sauf que je veux utiliser une valeur de ma base de données SQL deux fois sur la page. Par exemple, dans le titre de la page ainsi que dans le corps de la page, mais je ne peux pas sembler utiliser chaque valeur une fois:ASP classique: comment utiliser deux fois une valeur SQL?

.... 
Set nItem = Request.QueryString("ID") 

strSQL = "SELECT * "_ 
    & "FROM [Packages] "_ 
    & "WHERE id='" & nItem & "';" 

Set rstSearch = cnnSearch.Execute(strSQL) 

<title><%=rstSearch.Fields("Software") %></title> 
<body> 
<center>Software Information</center> 
<%=rstSearch.Fields("Software")%> <br /> 
<%=rstSearch.Fields("Version")%> <br /> 
<%=rstSearch.Fields("ID")%> <br /> 
<%=rstSearch.Fields("Licence")%> <br /> 
... 
+0

Quelle erreur voyez-vous? Ou est-ce juste en train d'échouer silencieusement la deuxième fois? – LukeH

+0

Classic ASP? Sensationnel. –

+0

La valeur "Logiciel" est vide la deuxième fois qu'il est utilisé. –

Répondre

5

Affectez-le à une variable; ne tirez pas simplement la valeur du jeu d'enregistrements.

Set nItem = Request.QueryString("ID") 

strSQL = "SELECT * "_ 
    & "FROM [Packages] "_ 
    & "WHERE id='" & nItem & "';" 

Set rstSearch = cnnSearch.Execute(strSQL) 

Dim software 
software = rstSearch("Software") 
' set your other fields as variables... 

<title><%= software %></title> 
<body> 
<center>Software Information</center> 
<%= software %> <br /> 

Cela devrait fonctionner correctement pour vous.

+0

L'aspect uniquement en avant des recordsets s'applique à passer à l'enregistrement suivant, dont le code de la KZA ne fait pas. Il ne devrait y avoir aucune raison pour que la deuxième référence ne soit pas valable dans ce cas. Vous devriez pouvoir vous référer plusieurs fois au jeu d'enregistrements à condition de ne pas passer à l'enregistrement suivant. –

+0

J'étais sûr d'avoir essayé ça plus tôt, mais oui, c'est la solution, merci :) –

+0

Pas de problème. Je me suis heurté à cela il y a quelques mois, car mon travail quotidien consiste à faire de l'entretien ASP classique (beurk). Simon a raison de dire que ça devrait marcher tant que vous ne passez pas au disque suivant, mais c'est la meilleure idée que j'ai pour expliquer pourquoi ça ne marche pas ... content que vous l'ayez corrigé, cependant. –

1

Vous devrez peut-être extraire seulement la valeur à un Var locale et de l'utiliser deux fois. J'ai déjà vu des trucs bizarres comme ça, il y a très, très longtemps.

1

Quelques commentaires:

1. Possibly call rstSearch.MoveFirst before the second 
    rstSearch.Fields("Software") 
2. If that doesn't work write <%=Err.Description%> right after the 
    second rstSearch.Fields("Software") line. 
3. Try not to ever use Select * for selecting columns. 
    Always specify which columns you want. 
4. Please try and use ASP.Net. It's much better then ASP3. 
+0

À la vôtre. J'ai commencé avec ASP.NET mais je l'ai gardé simple en utilisant ASP classique en suivant la recommandation d'une question précédente que j'ai posté ici :) –

+0

Où est cet horrible conseil afin que je puisse le rejeter? Je suppose que tout le monde doit commencer quelque part, mais je serais allé avec. Net. – Bravax

+0

On dirait qu'ils ont supprimé, peut-être préempter votre vote! –

3

Tout d'abord un avertissement rapide, vous êtes ouvert à l'injection SQL dans votre inclusion de nItem dans la requête. Juste un côté mais un à regarder :)

À part cela, il ne devrait pas y avoir de problème en se référant à une colonne dans votre jeu d'enregistrements deux fois. Je risque de deviner que vous avez un problème différent dans le code. Cela peut être utile si vous publiez le comportement/les erreurs que vous obtenez en essayant cette page. Mais je pense qu'il peut y avoir un autre code que nous ne voyons pas dans l'extrait ci-dessus qui cause le problème. Une chose pour vous aider à exécuter les tests de contrôle serait de remplacer le "select *" par "sélectionner le logiciel, la version, l'ID, la licence", etc. Vous pouvez vous référer à la colonne par un ordinal numérique, alors ce qui peut aider.

Bonne chance avec cela.

+0

Merci beaucoup.Mais maintenant je suppose que j'ai un nouveau problème :) Le site est un interne avec authentification, donc l'exposition est faible, mais je ferai de mon mieux pour le brancher. –

+0

Pas de soucis. ASP est particulièrement vulnérable en raison de son manque de sécurité. Une approche maladroite mais tout à fait raisonnable pour éviter l'injection SQL ici est d'enrouler le paramètre nItem dans une conversion d'entier explicite (CInt). Tant que vous savez que c'est un int il ne peut pas contenir de mauvaises injections SQL. Enjoy :) – Timbo

+0

Non seulement cela, vous êtes également vulnérable à l'injection HTML (conduisant à l'injection de script et les attaques XSS) - souvenez-vous de Server.HTMLEncode tout texte que vous affichez sur la page! Même sur un site «interne», ces bogues vous mordre lorsque les données contiennent des apostrophes, des signes, etc. – bobince

0

Désolé, ne peut pas aider à la réponse réelle, mais cela ressemble à l'exemple d'une attaque par injection SQL:

Set nItem = Request.QueryString("ID") 

strSQL = "SELECT * "_ 
    & "FROM [Packages] "_ 
    & "WHERE id='" & nItem & "';" 

On dirait que je pouvais changer l'URL « ID = 1' DROP TABLE STUDENTS;

+0

Bobby Tables, vous jouez à nouveau avec des bases de données? ;-) –

Questions connexes