endrebjo Skrevet 11. november 2006 Skrevet 11. november 2006 Å hente ut ?vis=[id] burde fungere som vanlig.
Zethyr Skrevet 11. november 2006 Skrevet 11. november 2006 Jupp, en request.getParameter("innleggID"); kan løse det problemet.
dagjonas Skrevet 11. november 2006 Forfatter Skrevet 11. november 2006 Beklagelig vis skjønner jeg ikke helt hva dere mener. Prøvde ulike saker, men ble bare sendt 0. Nå er det: (...) //tar i mot parametere String navn = request.getParameter("navn"); String kommentar = request.getParameter("kommentar"); //oppretter spørring for å legge inn i databasen String sporring = "INSERT INTO kommentarer (innleggid, datotid, navn, kommentar) VALUES ('', NOW(), '"+navn+"', '"+kommentar+"')"; //utfører spørringen executeUpdate for å legge inn og endre informasjon st.executeUpdate(sporring); // Stenger databasen etter bruk db.close(); %> Skulle da hatt INSERT INTO kommentarer (innleggid, datotid, navn, kommentar) VALUES ('"+assosiert_id+"', NOW(), '"+navn+"', '"+kommentar+"')"; Hvor assosiert_id da har en sammenheng med: //tar imot vis, lagrer det i en streng før den gjøres om til int String id1 = request.getParameter("vis"); int id_verdi = Integer.parseInt(id1); I url-linjen står det jo allerede en viss sammenheng med innlegg x: http://www.(...)/innlegg.jsp?vis=x
Zethyr Skrevet 11. november 2006 Skrevet 11. november 2006 I skjemaet på siden med kommentarene så legger du til: out.println("<input type="hidden" innleggid=\"+innleggid+\" />"); Du har allerede innleggid, så da legger du den med i formen for å bli sent videre en gang til. Så tar du imot denne i kommentar_mottak.jsp eller hva nå enn du kaller fila, og legger inn som et eget felt i kommentar-tabellen.
dagjonas Skrevet 11. november 2006 Forfatter Skrevet 11. november 2006 Nå er det like før kvantifiserte energinivåer er lettere. Fra siden hvor det aktuelle innlegget som kommenteres og skjemaet for å kommetere er: Statement st= db.createStatement(); ResultSet rs; String id1 = request.getParameter("vis"); int id_verdi = Integer.parseInt(id1); String sporring = "SELECT id, overskrift, melding, datotid FROM innlegg WHERE id="+id_verdi+""; rs = st.executeQuery(sporring); while(rs.next()){ String overskrift = rs.getString("overskrift"); String melding = rs.getString("melding"); String dato = rs.getString("datotid"); out.println("<b>" + overskrift + "</b>" + "<i> - " + dato + "</i>" + "<br/>" + melding + "<br/>"); out.println("<input type=\"hidden\" id_verdi=\"+id_verdi+\" />"); } db.close(); %> <h4>Skriv ny kommentar</h4> <form action="kommentarer.jsp" method="post"> Navn:<br/> <input type="text" name="navn"/><br/> Kommentar:<br/> <textarea rows="5" cols="40" name="kommentar"></textarea><br/> <input type="submit" value="Send"> <input type="reset" value="Tøm"> </form> Siden som tar imot kommentarer og skal sende det til databasen: Statement st= db.createStatement(); ResultSet rs; String navn = request.getParameter("navn"); String kommentar = request.getParameter("kommentar"); String id = request.getParameter("id_verdi"); String sporring = "INSERT INTO kommentarer (innleggid, datotid, navn, kommentar) VALUES ('"+id+"', NOW(), '"+navn+"', '"+kommentar+"')"; st.executeUpdate(sporring); db.close(); %> Og hva finner jeg i databasen, innleggid = 0.
Zethyr Skrevet 11. november 2006 Skrevet 11. november 2006 (endret) <h4>Skriv ny kommentar</h4><form action="kommentarer.jsp" method="post"> Navn:<br/> <input type="text" name="navn"/><br/> Kommentar:<br/> <textarea rows="5" cols="40" name="kommentar"></textarea><br/> <input type=hidden id_verdi=<%=id_verdi%> name="id_verdi" />); <input type="submit" value="Send"> <input type="reset" value="Tøm"> </form> 7266295[/snapback] Det var slik jeg mente det. Forresten, hvordan får jeg ut resultatet av en COUNT(*)-spørring? Endret 11. november 2006 av Zethyr
Zethyr Skrevet 11. november 2006 Skrevet 11. november 2006 (endret) while(rs.next()) { sporring_k = "SELECT COUNT(*) FROM Kommentar WHERE Innlegg_ID='" + rs.getString("ID") + "';"; rs_k = st.executeQuery(sporring_k); rs_k.next(); int ik = rs_k.getInt("COUNT(*)"); out.println(ik + " Innlegg"); } Hvorfor funker ikke dette? Endret 11. november 2006 av Zethyr
dagjonas Skrevet 11. november 2006 Forfatter Skrevet 11. november 2006 (endret) Når det gjelder resultatet av en COUNT-spørring aner jeg ikke. Edit: Ved: <input type="hidden" name=id_verdi value="id_verdi" > får jeg sendt over teksten id_verdi, ikke variabelen id_verdi. Endret 11. november 2006 av dagjonas
Zethyr Skrevet 11. november 2006 Skrevet 11. november 2006 Jeg fikk retta opp alt av bugs, så nå fungerer det. Problemet er det at når jeg oppdaterer rs_k så blir rs automatisk lukket, og rs.next() returnerer 0. Dette gjør at while-løkka terminerer og jeg får ikke opp flere innlegg enn 1.
dagjonas Skrevet 12. november 2006 Forfatter Skrevet 12. november 2006 endrebjorsvik, kan du komme meg til unnsetning?
endrebjo Skrevet 13. november 2006 Skrevet 13. november 2006 (endret) SELECT COUNT(*) AS antall FROM tabell WHERE blabla Og bruk antall som nøkkel når du skal hente henter ut COUNT(*)-tallet. Det kan kanskje være en idé å legge noen av spørsmålene i Java-forumet? Endret 13. november 2006 av endrebjorsvik
dagjonas Skrevet 13. november 2006 Forfatter Skrevet 13. november 2006 Er dette med å få sendt med riktig ID jeg fortsatt lurer på, Post #20.
endrebjo Skrevet 13. november 2006 Skrevet 13. november 2006 Helt standard HTML: <h4>Skriv ny kommentar</h4> <form action="kommentarer.jsp" method="post"> Navn:<br/> <input type="text" name="navn"/><br/> Kommentar:<br/> <textarea rows="5" cols="40" name="kommentar"></textarea><br/> <input type="hidden" name="id_verdi" value="<%=id_verdi%>" />); <input type="submit" value="Send"> <input type="reset" value="Tøm"> </form>
dagjonas Skrevet 13. november 2006 Forfatter Skrevet 13. november 2006 Takk så mye! Nå gjelder det å få til at det står 1 kommentar / 2 kommentarer da. Jeg har fra før den linken som linker til rett innlegg det kommenteres på, men står bare kommenter på linken. Under har jeg fått til at det skrives hvor mange kommentarer innlegget har. Nå mangler jeg bare å få det til å bli teksten i linken (og en liten if-setning jeg klarer selv). Ser slik ut nå: Statement st= db.createStatement(); ResultSet rs; String sporring = "SELECT id, overskrift, melding, datotid FROM innlegg ORDER BY datotid DESC"; rs = st.executeQuery(sporring); int vis; while(rs.next()){ String overskrift = rs.getString("overskrift"); String melding = rs.getString("melding"); String dato = rs.getString("datotid"); String id = rs.getString("id"); //Jobber nå med kommentar/kommentarer-linken, trenger id-en som ble opprettet ovenfor. Statement st2= db.createStatement(); ResultSet rs2; //Gjør om id til int for denne spørringens skyld int id_int = Integer.parseInt(id); //lager en spørring som henter ut antall kommentarer String sporring2 = "SELECT COUNT(*) FROM kommentarer WHERE innleggid="+id_int+""; rs2 = st2.executeQuery(sporring2); out.println("<b>" + overskrift + "</b>" + "<i> - " + dato + "</i>" + "<br/>" + melding + "<br/>"); out.println("<a href=\"innlegg.jsp?vis="+id+"\">Kommentér</a>"); out.println("<p />"); while(rs2.next()){ int ant_kommentar = rs2.getInt("COUNT(*)"); out.println(ant_kommentar + " kommentarer"); } } db.close(); %>
blackbrrd Skrevet 13. november 2006 Skrevet 13. november 2006 Bare for å kommentere det med datoer, det lønner seg å bruke preparedStatements, så kan du la JDBC driveren ta seg av konvertering til datoformatet databasen skal ha. jeg tar utgangspunkt i at du har et java.sql.Connection object kallt con. import java.sql.*; .... PreparedStatement ps = con.prepareStatement("INSERT INTO kommentarer (datetime) VALUES (?)"); Date date = /* legg inn kode her for å lese dato fra request objektet */ ps.setDate(1,date); ps.executeUpdate(); Generellt sett er det bedre å bruke preparedStatements enn spørringer hvor du bruker string konkatenering for å lage sql setningen. Da slipper du mye av problemstillingen med sql insertion. Ta problemet med en update, du leser to variabler fra request objektet, og lager følgende sql setning ut av det: String strSql = "UPDATE table SET name = '"+request.getParameter("name")+"' WHERE id = "+request.getParameter("id"); Det er meningne at request.getParameter("id") skal returnere ett primary keyen til table, f.eks "7". La oss si at den istedet returnerer "7 OR 1=1". Update setningen vil da oppdatere hele tabellen, istedetfor bare den ene raden.... Kan forresten anbefale Hibernate med annotations hvis du skal jobbe mye mot databaser, da jobber du med java objekter som du så lagrer uten å skrive INSERT/UPDATE setninger, det blir gjort av hibernate. Det eneste du trenger å gjøre er å mappe en java klasse til hver databasetabell. www.hibernate.org
Zethyr Skrevet 13. november 2006 Skrevet 13. november 2006 blackbrrd, det var mye nyttig informasjon der, men vi har bare hatt noen få måneder med IT Grunnkurs, så jeg tror det må være frivillig. Har du forresten lyst til å utdype litt på PreparedStatement og liknende, jeg fatter dessverre kun delvis hva det går ut på. Å unngå SQL injections og liknende slik du nevner kan jo være en superfordel.
blackbrrd Skrevet 13. november 2006 Skrevet 13. november 2006 I en prepared statement brukt som det jeg viser over setter du inn ett ? (spørsmålstegn) alle de stedene du vil ha inn variabler. PreparedStatement ps = con.prepareStatement("INSERT INTO kommentarer (datetime, comment) VALUES (?,?)"); Her er det to felter som er satt med ? Verdien inne i dem kan du sette ved å kalle metoden setObject(indeks, verdi), eller de mer spesifike metodene i PreparedStatement objektet som f.eks setDate, setString etc. Det er viktig å få med seg at indeksen begynner på 1, og ikke 0. // for å satt den første parameteren kan du f.eks skrive: ps.setDate(1,date); //for å få satt den andre parameteren kan du f.eks skrive: ps.setString(2,"min kommentar"); //for å kjøre SQL-en kjører man enten executeUpdate for DELETE; INSERT og UPDATE setninger. Den returnerer i såfall en int som sier hvor mange rader den påvirker. For SELECT kjører du executeQuery() metoden som returnerer et java.sql.ResultSet. ps.executeUpdate(); Det er egentlig ikke noe hokus pokus i det hele tatt. Kort sagt skriver du sql setningen din som normalt, erstatter variablene med ? og setter dem i ettertid på PreparedStatement objektet før du kjører ente executeUpdate() eller executeQuery().
Zethyr Skrevet 13. november 2006 Skrevet 13. november 2006 Genialt Takk for forklaring, det skal jeg huske på. Det kan være særdeles nyttig med tanke på Java senere også.
dagjonas Skrevet 14. november 2006 Forfatter Skrevet 14. november 2006 Hvordan skal jeg få det if-setningene skriver ut inn der hvor det står "Kommentér"? Kode: while(rs.next()){ (...) out.println("<b>" + overskrift + "</b>" + "<i> - " + dato + "</i>" + "<br/>" + melding + "<br/>"); out.println("<a href=\"innlegg.jsp?vis="+id+"\">[B]Kommentér[/B]</a>"); out.println("<p/>"); while(rs2.next()){ int ant_kommentar = rs2.getInt("COUNT(*)"); if (ant_kommentar==0) { out.println("Ingen kommentarer"); } else if (ant_kommentar==1) { out.println("1 kommentar"); } else if (ant_kommentar > 1) { out.println(ant_kommentar + " kommentarer"); } } }
Zethyr Skrevet 14. november 2006 Skrevet 14. november 2006 while(rs.next()){ out.println("<a href=\"innlegg.jsp?vis="+id+"\">"); while(rs2.next()){ int ant_kommentar = rs2.getInt("COUNT(*)"); if (ant_kommentar==0) { out.println("Ingen kommentarer"); } else if (ant_kommentar==1) { out.println("1 kommentar"); } else if (ant_kommentar > 1) { out.println(ant_kommentar + " kommentarer"); } } out.println("</a><p/>"); } Ved å flytte det dit?
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå