Avatar billede morten_21 Nybegynder
20. juli 2005 - 13:20 Der er 11 kommentarer og
1 løsning

Rækkefølge - 2 queries lige efter hinanden

Hejsa,

Har et problem med en funktion jeg har brokket sammen. Jeg har en side, kaldet comment.php, jeg bruger til at kommentere nyheder.

Alle funktioner er i samme fil, derfor tjekker jeg først om der skal skrives en ny entry i db'en ved $tilfoej. Er der ikke, skrives nyheden og formularen til kommentaren.

Alt virker umiddelbart godt, men når man tilføjer en kommentar, og aktiverer if(isset($_POST['tilfoej'])) så kommer kun form'en. Man skal selvfølgelig se hele siden, nyheden og alle kommentarer, inkl. den man lige har indtastet.

Det er som om, den springer over quiery'en efter if-løkken - hvad kan det skyldes?


Slamkode: (de fleste styles og formattering er fjernet)

<?php

//Skriv til db

if(isset($_POST['tilfoej'])) {
$text=$_POST['text'];
$time = date("H:s");
$date = date("j/n Y");
$ip = $_SERVER["REMOTE_ADDR"];
$email=$_POST['email'];
$name=$_POST['name'];
$newsid=$_POST['newsid'];
$id=$_POST['id'];

include("dbcnxinc.php");
$update = mysql_query("INSERT INTO comments (text, time, name, email, date, newsid, ip) VALUES ('$text', '$time', '$name', '$email', '$date', '$newsid', '$ip')") or die(mysql_error());

}

// Vis nyheden
include("dbcnxinc.php");
$result = mysql_query("SELECT id, text, date, headline, time, newsshow, icon FROM news WHERE newsshow = 1 AND id = '$id'") or die(mysql_error());
while ( $row = mysql_fetch_array($result) ) {
    $id = $row["id"];
    $date = $row["date"];
    $text = $row["text"];
    $time = $row["time"];
    $headline = $row["headline"];
    $icon = $row["icon"];
?>

<? echo("$date - $time | $headline"); ?>
<img src="gfx/icon_<? echo("$icon"); ?>.gif" border="0" align="absmiddle">&nbsp;<?php echo("$text"); ?>

<?php
}
?>


<?php
include("dbcnxinc.php");
$result = mysql_query("SELECT * FROM comments WHERE newsid = '$id'") or die(mysql_error());
while ( $row = mysql_fetch_array($result) ) {
    $date = $row["date"];
    $text = $row["text"];
    $time = $row["time"];
    $name = $row["name"];
    $email = $row["email"];
?>

<a href="mailto:<?php echo("$email"); ?>">
<?php echo("$name"); ?></a> | <?php echo("$date | $time | IP logged.."); ?>
<?php echo("$text"); ?>

<?php
}
?>


<form action="index.php?page=comment" method="post">
Navn: <input type="text" name="name" size="20">
E-mail: <input type="text" name="email" size="25">
Kommentar: <textarea rows="8" name="text" cols="56"></textarea>

<input type="submit" value="Tilføj" name="tilfoej">
<input type="hidden" value="<?php echo("$id"); ?>" name="newsid">
</form>
Avatar billede jaw Nybegynder
20. juli 2005 - 13:32 #1
Jeg forstår ikke helt, du må lige prøve at forklare det igen. Har læst det 4 gange, og forstår stadig ikke hvad dit problem er :)
Avatar billede morten_21 Nybegynder
20. juli 2005 - 13:45 #2
Heh, nej det er lidt tåget kan jeg godt se, sorry.

Altså, funktionen skal være således:
Går man ind på siden, UDEN at have skrevet noget i formen, er variablen $tilfoej ikke sat. Så vises nyheden og alle kommentarer i db'en.

Skriver man noget i formen og trykker submit, reloades siden med $tilfoej sat, og formens indhold skrives i db'en.

MEN når den har skrevet i db'en, springer den over den næste query, og viser bare formen igen. Det optimale er at efter INSERT tingen, reloader den siden helt fra bunden af - det er i virkeligheden det jeg vil :) Undskyld tågesnakken..
Avatar billede jaw Nybegynder
20. juli 2005 - 13:52 #3
Ahhh :D Prøv noget a'la det her så:

<?php

//Skriv til db

if(isset($_POST['tilfoej'])) {
$text=$_POST['text'];
$time = date("H:s");
$date = date("j/n Y");
$ip = $_SERVER["REMOTE_ADDR"];
$email=$_POST['email'];
$name=$_POST['name'];
$newsid=$_POST['newsid'];
$id=$_POST['id'];

include("dbcnxinc.php");
$update = mysql_query("INSERT INTO comments (text, time, name, email, date, newsid, ip) VALUES ('$text', '$time', '$name', '$email', '$date', '$newsid', '$ip')") or die(mysql_error());

header("Location: ".$_SERVER['PHP_SELF']);
header("Location: index.php");
}

Du skal dog kun have _en_ af de 2 linier... Men hvorfor så ikke bare smide det over i contact.php og så blive sendt tilbage? Som det er nu tror jeg, at hvis brugeren trykker F5 (refresh) vil hans kommentar blive indsat flere gange, ik?! Det vil du slippe for ved at smide den lille kodestump i en separat fil.
Avatar billede morten_21 Nybegynder
20. juli 2005 - 13:59 #4
Ah, det prøver jeg lige af.
Nej det er selvfølgelig ikke pratisk hvis data bliver skrevet flere gange - men jeg ville nemlig gerne ha' alt i samme fil.. Keep it simple ;)
Avatar billede jaw Nybegynder
20. juli 2005 - 14:01 #5
Tjoh, det er så hvad man mener med "simpelt". Jeg synes bestemt det er simpelt, at have forskellige filer til forskellige opgaver. Men sådan er der jo så meget :) F.eks. have index.php og så en mappe der hedder \news der indeholder delete.php, update.php, insert.php afhængig hvordan man skal bearbejde sine nyheder :)
Avatar billede morten_21 Nybegynder
20. juli 2005 - 14:48 #6
Ja, det har du selvfølgelig ret i. Jeg synes det er lettere og mere overskueligt at rette og tilpasse én fil end flere. Især når man navngiver variable ligeså tilfældigt som jeg gør :)

Men:
Header-tingen kommer med denne fejl:
Warning: Cannot modify header information - headers already sent by (output started at... bla bla bla.

?
Avatar billede jaw Nybegynder
20. juli 2005 - 14:50 #7
Yes, det er fordi du har noget html-output (måske bare et linieskift eller et mellemrum?) før du kører dit script. Scriptet skal stå aller øverst i filen...
Avatar billede morten_21 Nybegynder
20. juli 2005 - 15:21 #8
Argh, ja det har jeg - selve comment.php er en større del af noget include, så reelt ser man altid index siden, bare med en variabel der hedder $page.. Damn :/
Avatar billede jaw Nybegynder
20. juli 2005 - 15:24 #9
Jep, netop det er også et godt argument for at have sine scripts i separate filer. Så ville jeg f.eks. gøre således:
<?
echo"
<form action='./news/insert.php' method='post'>
<input type='hidden' name='page' value='".$_GET['page']."'>
//alle andre felter
";
?>

I insert.php:
<?
//scriptet og hvad der ellers skal ske
header("Location: index.php?page=".$_POST['page']);
?>

Forståeligt :) ?
Avatar billede morten_21 Nybegynder
20. juli 2005 - 15:56 #10
Arh ja, det var lidt snedigt :) Det er vel GET begge steder?

Om det bliver sådan, eller jeg må kapitulere og skrive til db'en i en anden fil, ved jeg ikke.. men tak for synspunkter, idéer og eksempler - smid et svar og du får points.
Avatar billede jaw Nybegynder
20. juli 2005 - 15:57 #11
Nej, det skal være get i formen (der henter du den fra adresselinien) og post i script-filen (der henter du den fra form-arrayet $_POST[]).

Held og lykke med det :)
Avatar billede morten_21 Nybegynder
20. juli 2005 - 18:05 #12
Takker
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
Computerworld tilbyder specialiserede kurser i database-management

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