Avatar billede steen_hansen Forsker
06. april 2007 - 17:50 Der er 46 kommentarer og
2 løsninger

Error i SQL syntax

Håber på lidt hurtig hjælp :o/

Microsoft OLE DB Provider for ODBC Drivers error '80040e14'

[MySQL][ODBC 3.51 Driver][mysqld-4.0.18-nt]You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1

default.asp, line 18

Linie 18:

Set RStop = Conn.Execute("SELECT ID FROM [database] WHERE ID=" & topcatID & "")


For lige at give et lidt større overblik over variablerne:

    topcatID = Request.QueryString("topcatID")
    subcatID = Request.Querystring("subcatID")

    Set RStop = Conn.Execute("SELECT ID FROM [databasenavn] WHERE ID=" & topcatID & "")

Jeg har tjekket for tyrkfejl. Når jeg udskriver hhv. topcatID og subcatID, kommer det rigtigt ud. Nogen forslag?
Avatar billede steen_hansen Forsker
06. april 2007 - 17:51 #1
Jeg skal lige huske at nævne, at det sker, når jeg forsøger at poste et indlæg.
Avatar billede arne_v Ekspert
06. april 2007 - 17:56 #2
MySQL bruger ikke [] omkring navne

slet dem
Avatar billede brinck10 Nybegynder
06. april 2007 - 17:58 #3
Set RStop = Conn.Execute("SELECT id FROM dit_tabel_navn WHERE id='" & topcatID & "'")
Avatar billede eagleeye Praktikant
06. april 2007 - 17:59 #4
eller brug ` i stedet for:  `database`
da databse så vidt jeg husker også er reservered ord i mysql.
Avatar billede arne_v Ekspert
06. april 2007 - 18:01 #5
hvis der er mellemrum i navne saa skal man bruge `` omkring dem i MySQL
Avatar billede steen_hansen Forsker
06. april 2007 - 18:05 #6
Ok, der er ikke [] rundt om databasenavnet, det var bare for at indikere, at det er navnet :)

Der er ikke mellemrum i navnet, og jeg bruger ikke engang _ (underscore)

..... WHERE ID='" & topcatID & "'") hjalp heller ikke :o/
Avatar billede eagleeye Praktikant
06. april 2007 - 18:13 #7
Hvis database navnet er:  databaase
så prøv som jeg har vist at sætte ` omkring:

Set RStop = Conn.Execute("SELECT ID FROM `database` WHERE ID=" & topcatID & "")
Avatar billede brinck10 Nybegynder
06. april 2007 - 18:13 #8
Okay, Men det er ikke databasenavnet du skal angive! Det er tabel navnet. databasen vælger du når du opretter forbindelse til mysql.

mysql_select_db("Database navn", variable_som_opretter_forbindelse);
Avatar billede arne_v Ekspert
06. april 2007 - 18:14 #9
indeholder topcatID noget ?
Avatar billede steen_hansen Forsker
06. april 2007 - 18:19 #10
Sorry, jeg mente også tabelnavnet.

Når jeg mellem <body> og </body> udskiver topcatID og subcatID, får jeg godt nok variablerne. Jeg er så i tvivl, om der er noget, der kan nulstille dem, selvom jeg bestemt ikke mener der er. Vil I have hele siden? Den er ikke så stor igen :)
Avatar billede kalp Novice
06. april 2007 - 18:23 #11
prøv at lave en Response.Write på din SQL
Avatar billede eagleeye Praktikant
06. april 2007 - 18:24 #12
Prøv at udskrive din SQL sætning som tjek af topcatID ikke er tom.
Avatar billede eagleeye Praktikant
06. april 2007 - 18:27 #13
Måske et dumt spørgsmål men er linien:

topcatID = Request.QueryString("topcatID")


Før linien med: Set RStop = Conn.Execute("SELECT ID FROM ... i koden?
Avatar billede steen_hansen Forsker
06. april 2007 - 18:32 #14
Jeg er lige væk et øjeblik, sorry. Jeg lægger koden og er tilbage om senest 10-15 min.

<!-- #include virtual="/includes/_protect.asp" -->
<!-- #include virtual="/includes/_data.asp" -->
<!-- #include virtual="/includes/_functions.asp" -->

<%

    Dim Mainarea, Conn, topcatID, subcatID, RStop, RSsub

    Mainarea = 4

%>
<!-- #include virtual="/includes/dbconnopen.asp" -->
<%

    topcatID = Request.QueryString("topcatID")
    subcatID = Request.Querystring("subcatID")

    Set RStop = Conn.Execute("SELECT mainID FROM tabel1 WHERE mainID='" & topcatID & "'")
    Set RSsub = Conn.Execute("SELECT topID, child, author, title, tekst, dato FROM tabel2 WHERE topID=" & subcatID & "")

    If Request.Form("mode") = "newreply" Then

        Dim rchild, rauthor, rdato

        rchild = RSsub("topcatID")

        rauthor = Session("username")

        rdato = Day(Date) & "/" & Month(Date) & "/" & Year(Date) & " " & Time()

        Conn.Execute("INSERT INTO tabel3 (rchild, rauthor, rtekst, rdato) VALUES (" & _
            "" & rchild & ", " & _
            "'" & rauthor & "', " & _
            "'" & Trim(SQLEncode(Request.Form("newr"))) & "', " & _
            "'" & Dato & "')")
        Conn.Close

        Response.Redirect "debate.asp?topcatID=<%=topcatID%>&subcatID=<%=subcatID%>"

    End If

%>

<html>

<head>
<!-- #include virtual="/includes/_header.asp" -->
<title><%=FormatText(RSsub("title"))%></title>
</head>

<body onload="funClock();">

<!-- #include virtual="/includes/_start.asp" -->
        <div class="content">
            <%
            Dim vCreated
            vCreated = RSsub("dato")
            vCreated = addZ(day(vCreated)) & "-" & addZ(month(vCreated)) & "-" & year(vCreated) & " " & addZ(hour(vCreated)) & ":" & addZ(minute(vCreated)) & ":" & AddZ(Second(vCreated))
            %>

            <div class="headline"><%=FormatText(RSsub("title"))%></div>
            <b>Oprettet af <%=FormatText(RSsub("author"))%> &nbsp;<%=Server.HTMLEncode(vCreated)%></b><br><br>
            <%=FormatText(RSsub("tekst"))%>

            <%
            Dim ssubID, RSs
            ssubID = RSsub("topicID")

            Set RSs = Conn.Execute("SELECT replyID, rchild, rauthor, rtekst, rdato FROM tabel3 WHERE rchild=" & RSsub("topID") & "")

            If Not RSs.EOF Then

            Do Until RSs.EOF
            %>

            <%=FormatText(RSs("rauthor"))%> <%=FormatText(RSs("rdato"))%><br>
            <%=FormatText(RSs("rtekst"))%>

            <%
            RSs.MoveNext
            Loop

            End If
            %>

            <form name="newpost" method="post" action="debate.asp">
            <h1><input type="hidden" name="mode" value="newreply"></h1>
                <textarea name="newr" id="newr" cols="30" rows="16"></textarea><br><br>
                <input type="submit" name="new" value="Send">
            </form>

            <%
            RStop.Close
            Set RStop = Nothing

            RSsub.Close
            Set RSsub = Nothing

            RSs.Close
            Set RSs = Nothing

            Conn.Close
            Set Conn = Nothing
            %>
        </div>
<!-- #include virtual="/includes/_end.asp" -->
</body>

</html>
Avatar billede eagleeye Praktikant
06. april 2007 - 18:40 #15
Hvornår kommer fejlen, er det første gang du går ind på siden eller når du har lavet et nyt reply, eller noget andet?


Umiddelbart syntes jeg at denne linje ser lidt forkert ud:
  Response.Redirect "debate.asp?topcatID=<%=topcatID%>&subcatID=<%=subcatID%>"

Prøv at rette den til:

  Response.Redirect "debate.asp?topcatID=" & topcatID & "&subcatID=" & subcatID
Avatar billede kalp Novice
06. april 2007 - 18:45 #16
prøv også at flytte = tegnet lidt væk fra den kolonne du sammenligner imod..
f.eks disse

Set RStop = Conn.Execute("SELECT mainID FROM tabel1 WHERE mainID='" & topcatID & "'")
    Set RSsub = Conn.Execute("SELECT topID, child, author, title, tekst, dato FROM tabel2 WHERE topID=" & subcatID & "")


til

Set RStop = Conn.Execute("SELECT mainID FROM tabel1 WHERE mainID ='" & topcatID & "'")
    Set RSsub = Conn.Execute("SELECT topID, child, author, title, tekst, dato FROM tabel2 WHERE topID =" & subcatID & "")
Avatar billede steen_hansen Forsker
06. april 2007 - 18:55 #17
Fejlen kommer, når jeg laver et nyt reply, og ja, den linie er helt forkert. Retter den til ....

kalp, ved nærmere eftertanke skal jeg ikke bruge mainID til noget som helst. Jeg har 3 tabeller. I den første opretter jeg kategorien. I den anden gemmes oplægget. I den tredie kommer besvarelserne, men de besvarelser skal jo kun knyttes til den oprettede tråd. Sagt på en lidt anden måde:

Tabel 1:
Bruges til kategorier

Tabel 2:
Bruges til oprettede debatoplæg

Tabel 3:
Bruges til indlæg til det oprettede debatoplæg

Det forvirrer det kun endnu mere, hvis der er unødvendige ting med. Tror lige jeg fjerner den også....
Avatar billede steen_hansen Forsker
06. april 2007 - 19:03 #18
Så begynder det sq at ligne noget :)

Jeg får dog en ny fejl:

ADODB.Recordset error '800a0cc1'

Item cannot be found in the collection corresponding to the requested name or ordinal.

debate.asp, line 25


Linie 25:
rchild = RSsub("topID")


For lige at få det hele med:

Set RSsub = Conn.Execute("SELECT topID, child, author, title, tekst, dato FROM tabel1 WHERE topID ='" & subcatID & "'")

If Request.Form("mode") = "newreply" Then

    Dim rchild, rauthor, rdato

    rchild = RSsub("topID")'LINIE 25

    rauthor = Session("username")

    rdato = Day(Date) & "/" & Month(Date) & "/" & Year(Date) & " " & Time()

    Conn.Execute("INSERT INTO tabel3 (rchild, rauthor, rtekst, rdato) VALUES (" & _
        "" & rchild & ", " & _
        "'" & rauthor & "', " & _
        "'" & Trim(SQLEncode(Request.Form("newr"))) & "', " & _
        "'" & Dato & "')")
    Conn.Close

    Response.Redirect "debate.asp?topcatID=" & topcatID & "&subcatID=" & subcatID

End If
Avatar billede kalp Novice
06. april 2007 - 19:07 #19
ser ud til den SQL ikke finder noget..
så du burde lave et tjek på om dit Resultset er tomt.
Avatar billede steen_hansen Forsker
06. april 2007 - 19:08 #20
06/04-2007 18:55:07
Besvarelserne skal jo bare knyttes til debatoplægget. Ingen grund til at rode hovedkategorierne ind i det, de bruges kun i debatoversigten :)
Avatar billede steen_hansen Forsker
06. april 2007 - 19:09 #21
Hvad mener du nærmere bestemt?
Avatar billede kalp Novice
06. april 2007 - 19:11 #22
Din SQL finder ingen rækker i databasen som matcher det id der kommer med subCatID..

synes vi skal se din SQL:) så kan du ikke lige udskrive den sådan her..

Dim sql

sql = "SELECT topID, child, author, title, tekst, dato FROM tabel1 WHERE topID ='" & subcatID & "'"
Response.Write(sql)
Response.End()
Set RSsub = Conn.Execute(sql)
Avatar billede kalp Novice
06. april 2007 - 19:13 #23
hvis subCatID er tomt (vil  man kunne se når du har gjort det jeg bad dig om før)
så skal du måske bare ændre denne

subcatID = Request.Querystring("subcatID")

til

subcatID = Request.Form("subcatID")


kan se du har anvendt den andre steder nemlig
Avatar billede steen_hansen Forsker
06. april 2007 - 19:20 #24
Den skriver bare

SELECT topID, child, author, title, tekst, dato FROM tabel1 WHERE topID ='2'

Jeg HAR rettet tabel1 til navnet på tabellen :)
Avatar billede steen_hansen Forsker
06. april 2007 - 19:25 #25
Ja, jo længere tid jeg rodede med det, desto mere blev der forsøgt. Og så kan kæden jo hoppe af :D

Nu står den dog kun ét sted, og jeg har jo ikke et formularfelt, der hedder subcatID. Eller er jeg faldet helt i søvn?
Avatar billede eagleeye Praktikant
06. april 2007 - 19:25 #26
Er du sikker på du skal bruge subcatID til at finde topID ??
Avatar billede steen_hansen Forsker
06. april 2007 - 19:32 #27
Nej, jeg er ikke sikker. topcatID og subcatID stammer fra debatoversigten, hvor debatemnerne er delt op i kategorier. Her linker jeg til den mainID og topID, som det ser ud i tabellerne:

/debat/debate.asp?mainID&topID

På debate.asp bruger jeg så topID til dels at hive debatoplægget ud, og dels at kunne knytte debatindlæg til topID (jeg ræssonerede med mig selv og fandt frem til, at mainID er uvedkommende i denne sammenhæng:))

Men hvis jeg ikke bør/skal benytte Request.QueryString, hvordan skal det så laves?
Avatar billede eagleeye Praktikant
06. april 2007 - 19:32 #28
Jeg forstår ikke helt hvorfor du har denne:

Set RStop = Conn.Execute("SELECT mainID FROM tabel1 WHERE mainID='" & topcatID & "'")

da du kun henter mainID og du henter den mainID som er lig med topcatID.



I princippet som koden er lige kunne du lige så godt rette linie 25:
  rchild = RSsub("topID")'LINIE 25

til:
  rchild = subcatID


Så er du 100% sikker på du får brugt topcatID og subcatID rigtigt?  :-)
Avatar billede steen_hansen Forsker
06. april 2007 - 19:38 #29
Ok, den linie er så også lige blevet arkiveret, den er overflødig :)

Og ja, det er jo rigtigt, den kan lige så godt forkortes til

  rchild = subcatID

Men resultatet er det samme....?
Avatar billede steen_hansen Forsker
06. april 2007 - 19:41 #30
Dokumentet er bygget op på denne måde

[DEL I]
Hent debatoplægget fra DB og skriv det ud på siden

[DEL II]
Hent evt. debatindlæg og skriv dem ud på siden

[DEL III]
Indsæt en formular, som sender debatindlæg til det pågældende debatoplæg i DB
Avatar billede eagleeye Praktikant
06. april 2007 - 19:51 #31
Prøv lige at rette:


<form name="newpost" method="post" action="debate.asp">


Til dette så topcatID og subcatID er med i action som er linket til siden når man trykker på submit:

<form name="newpost" method="post" action="debate.asp?topcatID=<%=topcatID%>&subcatID=<%=subcatID%>">
Avatar billede steen_hansen Forsker
06. april 2007 - 19:58 #32
eagleeye, hvordan kan du blive ved? Det virker sq da! :)

eagleeye/kalp, lægger I begge et svar? I har reddet resten af Påsken :)
Avatar billede kalp Novice
06. april 2007 - 20:08 #33
hvis jeg fik hjulpet?
lader jo til at alt SQL næsten blev filtereret fra;o)

men du må have en god påske:)
Avatar billede steen_hansen Forsker
06. april 2007 - 20:26 #34
Ja, I hjalp begge to meget, takker, og ILM :)

Jeg ville i debatoversigten gerne have skrevet ud, hvor mange, der har besvaret det enkelte debatoplæg med noget SELECT Count, men det drillede lidt. Jeg vil lige prøve igen, tror næsten jeg har løsningen. Men hvis det driller, er der så en af Jer der gider hjælpe mod nogle ekstra point?
Avatar billede kalp Novice
06. april 2007 - 20:29 #35
behøver ikke ekstra point:) der er allerede rigeligt i tråden her:)
Avatar billede steen_hansen Forsker
06. april 2007 - 20:33 #36
Ok, tak :) Kigger lige på det, mens jeg venter på eagle :)
Avatar billede eagleeye Praktikant
06. april 2007 - 20:36 #37
Ja her et svar fra mig ;)
Avatar billede steen_hansen Forsker
06. april 2007 - 20:40 #38
Takker, mine bedste venner i hele Verden , det begyndte godt nok at blive frustrerende, der er snart deadline :)

Hvis det volder problemer med Count, vender jeg lige tilbage, og så håber jeg en af Jer har tid. Hvis ikke, så må I have en rigtig god Påske :)
Avatar billede steen_hansen Forsker
06. april 2007 - 21:19 #39
Jeg vender lige tilbage, hvis det er i orden? Skulle mene det er piece of cake for en af Jer, og der vanker en overflod af point, hvis I gider :)

Jeg har de to tables:

Tabel 1: Oprettede debatemner
Tabel 2: Besvarelser til de oprettede debatemner

Tabel 1:
topID
child
author
title
tekst
dato

Tabel 2:
replyID
rchild
rauthor
rtekst
rdato

Hvordan skal den kribnles? Jeg har indtil nu formået at hive samtlige besvarelser ud, men det er kun antallet af besvarelser på de enkelte debatindlæg, der skal ud :)

Hvis jeg i debatoversigten vil have dato/tid for den seneste besvarelse, er det ... SELECT Top 1 ..... der skal bruges?
Avatar billede eagleeye Praktikant
06. april 2007 - 21:36 #40
Er rchild det som svare til topID?

Så kan du lave det i stil med:

SQL = "selec count(rchild) as antal from tabel2 where rchild = " & valgtDebatID


>> Hvis jeg i debatoversigten vil have dato/tid for den seneste besvarelse, er det ... SELECT Top 1 ..... der skal bruges?

Ja men i MySQL hedder det limit og skal være til sidst i SQL sætningen.

SQL = "select rdato from tabel2 where rchild = xxx order by rddato limit 1"
Avatar billede steen_hansen Forsker
06. april 2007 - 21:43 #41
Ok, men jeg er ikke helt med hvad du mener med valgtDebatID ....?

Og ja, der går åbenbart et stykke tid, inden MS Access kommer ud af kroppen :)
Avatar billede eagleeye Praktikant
06. april 2007 - 21:49 #42
Du vil havde antal besvarelser til et debatindlæg. valgtDebatID er et tilfældigt deabtindlæg det kan evt. kommer fra en kolonne i et recordset.


SQL = "selec count(rchild) as antal from tabel2 where rchild = " & rs("topID")


men hvad indeholder kolonnen tabel2.rchild?
Avatar billede steen_hansen Forsker
06. april 2007 - 21:52 #43
Ok, det prøver jeg lige ..

child i tabel to = mainID i tabel 1. For kringlet? :)
Avatar billede eagleeye Praktikant
06. april 2007 - 21:57 #44
Nej det lyder rigtig godt, det er lige som det skal være :-)

Hvis ikke ville det være svært at tælle antallet af reply's til et debatindlæg.
Avatar billede steen_hansen Forsker
06. april 2007 - 22:00 #45
Ja, det er rigtigt. Jeg prøver at sætte det op, men jeg kan se det burde virke. Du skal have tak endnu en gang, eagleeye. Opretter lige et spørgsmål ...
Avatar billede steen_hansen Forsker
06. april 2007 - 22:01 #46
Smider du lige et svar? :)

http://www.eksperten.dk/spm/771967
Avatar billede steen_hansen Forsker
07. april 2007 - 21:18 #47
eagleeye (og andre), har du mod på at hjælpe med 21:36:09 (LIMIT 1)? Eller skal jeg oprette et nyt spørgsmål? Uanset hvad falder der point af :)
Avatar billede steen_hansen Forsker
11. april 2007 - 22:06 #48
Jeg håber I har tid/lyst/lejlighed til at deltage i http://www.eksperten.dk/spm/772803 :)
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