Avatar billede joki Mester
14. juni 2005 - 13:45 Der er 19 kommentarer og
1 løsning

database connection internt i funktion

Hej

Jeg forsøger at lave en funktion der danner en dynamisk drop down menu.
Jeg har problemer med at danne forbindelse til databasen og herefter while løkken der gennemløber hver record.
Min database forbindelse virker fint uden for funktionen.
Er der noger der har et eksempel på dette.

På forhånd tak
Avatar billede arne_v Ekspert
14. juni 2005 - 14:28 #1
kan du ikke poste din kode så vi kan prøve at se fejlen ?
Avatar billede joki Mester
14. juni 2005 - 20:01 #2
jo det ville jeg gerne men har faktisk slettet den.
Det jeg skal lave er to drop down bokse.  Den første dannes fra en tabel i min database( intet problem) den næste skal opdateres afhængig af hvad der vælges i den første. F.eks. hvis der vælges Mazda i den første består næste drop down boks af 929,626, MX3.  Det ville være rart hvis du kunne hjælpe med et eksempel på dette.

På forhånd tak
Avatar billede arne_v Ekspert
15. juni 2005 - 00:06 #3
jeg har nu lavet et eksempel som viser lidt af mulighederne
Avatar billede arne_v Ekspert
15. juni 2005 - 00:06 #4
siden som bruges til at vise det valgte

show.jsp
--------

Du har valgt <%=request.getParameter("brand")%> <%=request.getParameter("model")%>.
Avatar billede arne_v Ekspert
15. juni 2005 - 00:07 #5
en ikke dynamisk løsninge hvor den viser alle modeller også efter der er valgt mærke

select_simple.jsp
-----------------

<%@ page import="java.sql.*" %>
<%
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection con = DriverManager.getConnection("jdbc:odbc:TestMSAccess");
Statement stmt = con.createStatement();
%>
<form method="POST" action="show.jsp">
Mærke:
<select name="brand">
<option>vælg mærke
<%
ResultSet rs1 = stmt.executeQuery("SELECT DISTINCT brand FROM cars");
while(rs1.next()) {
%>
<option><%=rs1.getString(1)%></option>
<%
}
rs1.close();
%>
</select>
<br/>
Model:
<select name="model">
<option>vælg model
<%
ResultSet rs2 = stmt.executeQuery("SELECT DISTINCT model FROM cars");
while(rs2.next()) {
%>
<option><%=rs2.getString(1)%></option>
<%
}
rs2.close();
%>
</select>
<br/>
<input type="SUBMIT" value="Vis"/>
</form>
<%
stmt.close();
con.close();
%>
Avatar billede arne_v Ekspert
15. juni 2005 - 00:08 #6
en server side løsning hvor en enkelt javascript sætning submitter formen
efter valg af mærke og der så sættes en WHERE på den SQL som henter modeler

select_serverside.jsp
---------------------

<%@ page import="java.sql.*" %>
<%
String brand = request.getParameter("brand");
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection con = DriverManager.getConnection("jdbc:odbc:TestMSAccess");
Statement stmt = con.createStatement();
%>
<form name="car" method="POST" action="<%=(brand==null)?"select_serverside.jsp":"show.jsp"%>">
Mærke:
<select name="brand" onchange="car.submit();">
<option>vælg mærke
<%
ResultSet rs1 = stmt.executeQuery("SELECT DISTINCT brand FROM cars");
while(rs1.next()) {
String col = rs1.getString(1);
%>
<option<%=(brand!=null&&col.equals(brand))?" SELECTED":""%>><%=col%></option>
<%
}
rs1.close();
%>
</select>
<br/>
Model:
<select name="model">
<option>vælg model
<%
ResultSet rs2 = stmt.executeQuery("SELECT DISTINCT model FROM cars" + ((brand!=null)?(" WHERE brand='"+brand+"'"):""));
while(rs2.next()) {
%>
<option><%=rs2.getString(1)%></option>
<%
}
rs2.close();
%>
</select>
<br/>
<input type="SUBMIT" value="Vis"/>
</form>
<%
stmt.close();
con.close();
%>
Avatar billede arne_v Ekspert
15. juni 2005 - 00:09 #7
en client side løsning hvor det hele genereres en gang server side men
hvor javascript kode som kører client side skifter model options når man vælger
mnærke

select_clientside.jsp
---------------------

<%@ page import="java.sql.*" %>
<html>
<head>
</head>
<body onload="loadbrands();">
<%
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection con = DriverManager.getConnection("jdbc:odbc:TestMSAccess");
Statement stmt = con.createStatement();
ResultSet rs1 = stmt.executeQuery("SELECT DISTINCT brand FROM cars");
String brands = "'vælg mærke'";
int nbrands = 0;
while(rs1.next()) {
    brands = brands + ",'" + rs1.getString(1) +"'";
    nbrands++;
}
rs1.close();
ResultSet rs2 = stmt.executeQuery("SELECT brand,model FROM cars");
String[] cars = new String[nbrands];
String lastbrand = "";
int ix = -1;
while(rs2.next()) {
    String col = rs2.getString(1);
    if(!col.equals(lastbrand)) {
        ix++;
        cars[ix] = "'vælg model'";
        lastbrand = col;
    }
    cars[ix] = cars[ix] + ",'" + rs2.getString(2) +"'";
}
rs2.close();
stmt.close();
con.close();
%>
<script type="text/javascript">
var brands = new Array(<%=brands%>);
var models = new Array(
<%
for(int i = 0; i < cars.length; i++) {
%>
                    new Array(<%=cars[i]%>)<%=(i<cars.length-1)?",":""%>
<%
}
%>
                    );
function loadbrands()
{
    for(i=0;i<brands.length;i++) document.car.brand.options[i] = new Option(brands[i],brands[i]);
};
function loadmodels()
{
    var a = models[document.car.brand.selectedIndex-1];
    for(i=0;i<a.length;i++) document.car.model.options[i] = new Option(a[i],a[i]);
}
</script>
<form name="car" method="POST" action="show.jsp">
Mærke:
<select name="brand" onchange="loadmodels();">
</select>
<br/>
Model:
<select name="model">
</select>
<br/>
<input type="SUBMIT" value="Vis"/>
</form>
</body>
</html>
Avatar billede arne_v Ekspert
15. juni 2005 - 00:10 #8
JavaScript hajerne ligger sikkert på gulvet og skriger af grin over min
JavaScript kode, men det virker tilsyneladende i både FireFox og IE.
Avatar billede arne_v Ekspert
15. juni 2005 - 00:10 #9
og et svar
Avatar billede joki Mester
15. juni 2005 - 08:23 #10
Arne tak for hjælpen, er ikke i nærheden af en computer de næste par dage, men kommer retur med lidt point når det virker.
Avatar billede joki Mester
17. juni 2005 - 19:23 #11
har tiltettet dit eksempel til min database, men får kun tomme drop down bokse.
kan du evt. se hvad jeg gør galt, det må vel virke hvis det virker hos dig.

Det ser ud som om alle arrays bliver fyldt, men tror ikke funktionen loadbrands virker hos mig.


<%@ page language="java" import="java.sql.*" %>
<html>
<head>


</head>
<body onload="loadbrands()";>

<%
Class.forName("com.mysql.jdbc.Driver");
Connection con = DriverManager.getConnection("jdbc:mysql:///test");
Statement stmt = con.createStatement();
ResultSet rs1 = stmt.executeQuery("SELECT DISTINCT type FROM gaestebog");
String brands = "'vælg type'";
int nbrands = 0;
while(rs1.next())
{
    brands = brands + ",'" + rs1.getString(1) +"'";
    nbrands++;
  }
 
rs1.close();


ResultSet rs2 = stmt.executeQuery("SELECT type,model FROM gaestebog");
String[] cars = new String[20];
String lastbrand = "";
int ix = 0;

while(rs2.next())
    {
    String col = rs2.getString(1);
   
    if(!col.equals(lastbrand))
    {
    cars[ix] = "vælg model";
    lastbrand = col;   
    ix++;
    }
   
cars[ix] = cars[ix] + ",'" + rs2.getString(2) +"'";

    }
rs2.close();
stmt.close();
con.close();
%>
<script type="text/javascript">
var brands = new Array(<%=brands%>);
var models = new Array(
<%
for(int i = 0; i < cars.length; i++) {
%>
new Array(<%=cars[i]%>)<%=(i<cars.length-1)?",":""%>
<%
}
%>
                    );
function loadbrands()
{

    for(i=0;i<brands.length;i++)
    {
    document.car.brand.options[i] = new options(brands[i],brands[i]); //brands[i],brands[i]
   
    }
}
function loadmodels()
{
    var a = models[document.car.brand.selectedIndex-1];
    for(i=0;i<a.length;i++) document.car.model.options[i] = new Option(a[i],a[i]);
}
</script>

<form name="car"  method="POST" action="show.jsp">
Mærke:
<select name="brand" onchange="loadmodels();">
</select>
<br/>
Model:
<select name="model">
</select>
<br/>
<input type="SUBMIT" value="Vis"/>
</form>
</body>
</html>
Avatar billede joki Mester
19. juni 2005 - 10:39 #12
Arne >> Jeg har skrevet noget af det om og fået den førte drop down boks til at virker, men så snart jeg indsætter nedestående, er begge blanke. Kan du forklare mig hvad nedenstående kode laver ?? Hvordan findes der ud af hvad der skal stå i nr to boks, efter der er valg noget i den første.

var models = new Array(
<%
for(int i = 0; i < model.length; i++) {
%>
new Array(<%=model[i]%>)<%=(i<model.length-1)?",":""%>
<%
}
%>
);
Avatar billede arne_v Ekspert
19. juni 2005 - 11:33 #13
<select name="brand" onchange="loadmodels();">

og

function loadmodels()
{
    var a = models[document.car.brand.selectedIndex-1];
    for(i=0;i<a.length;i++) document.car.model.options[i] = new Option(a[i],a[i]);
}

sørger for at vælge modellerne når mærket er valgt
Avatar billede joki Mester
19. juni 2005 - 12:38 #14
så langt er jeg med, men der er mere denne linie.

new Array(<%=model[i]%>)<%=(i<model.length-1)?",":""%>

laves der et array som indeholder et array i hver index, med alle modeller til en bestemt type ?
Avatar billede arne_v Ekspert
19. juni 2005 - 16:35 #15
jeg laver et array af arrays (svarer næsten til et 2D array)

yderste array (første dimension) er mærke

inderste array (anden dimension) er model
Avatar billede joki Mester
20. juni 2005 - 18:50 #16
det lykkes, så du få dine velfortjente point
Avatar billede arne_v Ekspert
20. juni 2005 - 18:52 #17
herligt

sådan noget client side JavaScript er tit langt sværere at lave end noget
solidt server side logik
Avatar billede joki Mester
23. juni 2005 - 08:29 #18
ja det kan jeg forstå, men det er jo egentligt meget simpelt når man forstår det.
Havde bare svært ved at se logikken i hvordan der blev holdt styr på hvilke modeller der er i hvilke typer. Det endte da også med at jeg måtte sortere efter typer i begge udtræk for at være sikker på at type og model stemmer overens.
Avatar billede arne_v Ekspert
24. juli 2005 - 18:05 #19
iøvrigt hvis du er intresseret i at lave pænere kode end det her misk mask af HTML og Java,
så har keg lige skrevet en lille artikel http://www.eksperten.dk/artikler/743
Avatar billede joki Mester
25. juli 2005 - 08:19 #20
Den kigger jeg på det er jo altid rart at lære noget nyt.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester