Permalänk
Medlem

Gästbok i php

Jag vill börja med att be om ursäkt för att jag spammar sönder detta forum, men det är ett suveränt sätt att få adekvata svar snabbt :).

Jag håller på att fipplar med en gästbok, och har fått den att fungera så att den läser upp inläggen under formuläret, så långt allt väl. De jag skulle vilja ha hjälp med är hur jag ska förhindra att nya inlägg skapas i gästboken genom att man uppdaterar sidan. Jag vill ju bara ha nya inlägg om man skriver något och trycker på skickaknappen.

<?php // // Check if Save-button was pressed, save the ad if true. // if(isset($_POST['doCreate'])) { $ad[] = strip_tags($_POST["pubdate"]); $ad[] = strip_tags($_POST["content"]); $stmt = $db->prepare("INSERT INTO guest (pubdate,content) VALUES (?,?)"); $stmt->execute($ad); $output = "Lade till ett nytt meddelande med id " . $db->lastInsertId() . ". Rowcount is = " . $stmt->rowCount() . "."; } // // Create a select/option-list of the ads // $stmt = $db->prepare('SELECT * FROM guest;'); $stmt->execute(); $res = $stmt->fetchAll(PDO::FETCH_ASSOC); $select = "<select id='input1' multiple name='article'>"; foreach($res as $ad) { $select .= "<option value='{$ad['id']}'>{$ad['id']}. {$ad['content']} </option>"; } $select .= "</select>"; ?> <form method="post"> <fieldset> <p> <textarea style="width:100%;" name="content"></textarea> </p> <p> <label for="input2">Datum:</label><br> <input type="link" class="text" name="pubdate"> </p> <p> <input type="submit" name="doCreate" value="Skicka"> </p> </fieldset> </form> <?php // // // Välj // $stmt = $db->prepare('SELECT * FROM guest ORDER BY PUBDATE DESC;'); $stmt->execute(); $res = $stmt->fetchAll(PDO::FETCH_ASSOC); $current = null; ?> <!-- Loopar igenom artiklarna --> <?php if ($current == null): ?> <?php foreach($res as $content): ?> <p><?php echo $content['pubdate']; ?><br> <?php echo $content['content']; ?></p><hr> <?php endforeach; ?><?php endif?>

Visa signatur
Permalänk

Nu var det RIKTIGT längesedan jag kodade. Men jag har för mig att det här ska lösa problemet:

<form method="post" action="index.php">

Byt ut "index.php" emot vad filen heter för själva gästbokssidan.

Permalänk
Medlem
Skrivet av Subdubwise:

Nu var det RIKTIGT längesedan jag kodade. Men jag har för mig att det här ska lösa problemet:

<form method="post" action="index.php">

Byt ut "index.php" emot vad filen heter för själva gästbokssidan.

Nja, det hjälper inte..men tack ändå!

Visa signatur
Permalänk
Skrivet av Marie96:

Nja, det hjälper inte..men tack ändå!

Det här då kanske?

<?php session_start(); if(isset($_POST['doCreate'])) { $ad[] = strip_tags($_POST["pubdate"]); $ad[] = strip_tags($_POST["content"]); $stmt = $db->prepare("INSERT INTO guest (pubdate,content) VALUES (?,?)"); $stmt->execute($ad); $_SESSION['output'] = "Lade till ett nytt meddelande med id " . $db->lastInsertId() . ". Rowcount is = " . $stmt->rowCount() . "."; header('Location: index.php'); } ?>

Så vitt jag minns handlar allting om att "refresha" sidan för att på så vis inte kunna trycka F5 och få upp dialogrutan, från webbläsaren, om man vill skicka den angivna datan igen.

Permalänk
Skrivet av Marie96:

Jag vill börja med att be om ursäkt för att jag spammar sönder detta forum, men det är ett suveränt sätt att få adekvata svar snabbt :).

Jag håller på att fipplar med en gästbok, och har fått den att fungera så att den läser upp inläggen under formuläret, så långt allt väl. De jag skulle vilja ha hjälp med är hur jag ska förhindra att nya inlägg skapas i gästboken genom att man uppdaterar sidan. Jag vill ju bara ha nya inlägg om man skriver något och trycker på skickaknappen.

<?php // // Check if Save-button was pressed, save the ad if true. // if(isset($_POST['doCreate'])) { $ad[] = strip_tags($_POST["pubdate"]); $ad[] = strip_tags($_POST["content"]); $stmt = $db->prepare("INSERT INTO guest (pubdate,content) VALUES (?,?)"); $stmt->execute($ad); $output = "Lade till ett nytt meddelande med id " . $db->lastInsertId() . ". Rowcount is = " . $stmt->rowCount() . "."; } // // Create a select/option-list of the ads // $stmt = $db->prepare('SELECT * FROM guest;'); $stmt->execute(); $res = $stmt->fetchAll(PDO::FETCH_ASSOC); $select = "<select id='input1' multiple name='article'>"; foreach($res as $ad) { $select .= "<option value='{$ad['id']}'>{$ad['id']}. {$ad['content']} </option>"; } $select .= "</select>"; ?> <form method="post"> <fieldset> <p> <textarea style="width:100%;" name="content"></textarea> </p> <p> <label for="input2">Datum:</label><br> <input type="link" class="text" name="pubdate"> </p> <p> <input type="submit" name="doCreate" value="Skicka"> </p> </fieldset> </form> <?php // // // Välj // $stmt = $db->prepare('SELECT * FROM guest ORDER BY PUBDATE DESC;'); $stmt->execute(); $res = $stmt->fetchAll(PDO::FETCH_ASSOC); $current = null; ?> <!-- Loopar igenom artiklarna --> <?php if ($current == null): ?> <?php foreach($res as $content): ?> <p><?php echo $content['pubdate']; ?><br> <?php echo $content['content']; ?></p><hr> <?php endforeach; ?><?php endif?>

Skicka användaren tillbaka till sidan, efter att denna har postat inlägget.

Visa signatur
Permalänk
Medlem
Skrivet av Subdubwise:

Det här då kanske?

<?php session_start(); if(isset($_POST['doCreate'])) { $ad[] = strip_tags($_POST["pubdate"]); $ad[] = strip_tags($_POST["content"]); $stmt = $db->prepare("INSERT INTO guest (pubdate,content) VALUES (?,?)"); $stmt->execute($ad); $_SESSION['output'] = "Lade till ett nytt meddelande med id " . $db->lastInsertId() . ". Rowcount is = " . $stmt->rowCount() . "."; header('Location: index.php'); } ?>

Så vitt jag minns handlar allting om att "refresha" sidan för att på så vis inte kunna trycka F5 och få upp dialogrutan, från webbläsaren, om man vill skicka den angivna datan igen.

Funkar perfekt! Tack, SweClockers är bäst!!

Skrivet av Kebabhyvlarn:

Skicka användaren tillbaka till sidan, efter att denna har postat inlägget.

Är det det jag gör med Subdubwise kodsnutt?

Visa signatur
Permalänk
Skrivet av Marie96:

Är det det jag gör med Subdubwise kodsnutt?

Yes

Visa signatur
Permalänk
Medlem

Ja, du använder header('Location: ') för att dirigera om personen till en annan sida, i detta fallet gör du det för du vill tömma dina post-variabler som formen skickade med. Så ifall sidan laddas om är dessa tomma och gästboken uppdateras inte en extra gång.

Permalänk
Medlem
Skrivet av Kebabhyvlarn:
Skrivet av taailyn.:

Ja, du använder header('Location: ') för att dirigera om personen till en annan sida, i detta fallet gör du det för du vill tömma dina post-variabler som formen skickade med. Så ifall sidan laddas om är dessa tomma och gästboken uppdateras inte en extra gång.

Mmm, misstänkte det..:)

Visa signatur
Permalänk
Skrivet av Marie96:

Funkar perfekt! Tack, SweClockers är bäst!!

Kul att kunna vara till hjälp!

För att förtydliga lite: jag ändrade också din variabel $output till en session $_SESSION['output']. Med tanke på att sidan laddas om, tack vare header('Location: index.php'), så skulle datan i $output inte finnas kvar. Därför använde jag mig istället av session_start(); i början av koden, för att "aktivera" sessions, och sedan sparade jag den datan i en cookie istället, så att datan består även om sidan laddas om. Då sparas datan som en kaka i klientens webbläsare.

Så om du vill skriva ut den datan skriver du bara echo $_SESSION['output'] så ligger datan kvar trots att sidan har laddats om.

Det går givetvis att förenkla det hela genom att skriva så här också:

$output = $_SESSION['output'];

Du kan också skriva så här för att uppdatera sidan, så slipper du bry dig om vad filen heter (exempelvis index.php eller guestbook.php)

header('location: ' . $_SERVER['PHP_SELF']);

Ville bara vara tydlig, ber om ursäkt om det låter som att jag dumförklarar dig!

Permalänk
Medlem
Skrivet av Subdubwise:

Kul att kunna vara till hjälp!

För att förtydliga lite: jag ändrade också din variabel $output till en session $_SESSION['output']. Med tanke på att sidan laddas om, tack vare header('Location: index.php'), så skulle datan i $output inte finnas kvar. Därför använde jag mig istället av session_start(); i början av koden, för att "aktivera" sessions, och sedan sparade jag den datan i en cookie istället, så att datan består även om sidan laddas om. Då sparas datan som en kaka i klientens webbläsare.

Så om du vill skriva ut den datan skriver du bara echo $_SESSION['output'] så ligger datan kvar trots att sidan har laddats om.

Det går givetvis att förenkla det hela genom att skriva så här också:

$output = $_SESSION['output'];

Du kan också skriva så här för att uppdatera sidan, så slipper du bry dig om vad filen heter (exempelvis index.php eller guestbook.php)

header('location: ' . $_SERVER['PHP_SELF']);

Ville bara vara tydlig, ber om ursäkt om det låter som att jag dumförklarar dig!

Hehe, nä ingen fara, information är bra
Jag hade redan session_start() i mina filer, de andra två snuttarna var lätta att förstå. Ofta tycker jag att det är så med PHP, att förstå koden är inga problem, men att hitta egna lösningar på php.net är svårt.
Tack för hjälpen.

Visa signatur
Permalänk
Medlem

Jag lånar tråden lite. Har försökt trixa lite med PHP senaste dagarna men har verkligen fastnat i nybörjarträsket. Jag försöker redigera inlägg skrivna i gästboken, men inget händer. Felmeddelandet jag får säger: "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 'WHERE id=1' at line 1". Jag har försökt finna en lösning i timmar men inget löser mitt problem. Förmodligen är svaret uppenbart, därför har jag dragit mig för att fråga.

edit.php

<?php $username="root"; $password=""; $database="ggb"; $id = $_GET['id']; mysql_connect('localhost',$username,$password) or die("Cannot connect"); @mysql_select_db($database) or die("Unable to select database"); $order = "SELECT * FROM gb where id=$id"; $result = mysql_query($order); $row = mysql_fetch_array($result); ?> <body> <form action="update.php" method="post"> <input type="hidden" name="id" value="<?php echo $row['id']; ?>"> Namn:<input type="text" name="Namn" value="<?php echo $row['Namn']; ?>"> <br>Text: <textarea name="Medd" rows="5"><?php echo $row['Medd']; ?></textarea> <input type="submit" value="Skicka" name="submit"> </form> </body> <?php mysql_close(); ?>

update.php

<?php $username="root"; $password=""; $database="ggb"; mysql_connect('localhost',$username,$password) or die("Cannot connect"); @mysql_select_db($database) or die("Unable to select database"); $id = $_REQUEST['id']; $Namn = $_REQUEST['Namn']; $Medd = $_REQUEST['Medd']; $sql = "UPDATE gb SET Namn='$Namn', Medd='$Medd', WHERE id=$id"; $result= mysql_query($sql); if($result) { echo "Successful"; } else { echo mysql_error(); } ?> <body><br><br> <a href="view.php">Go back</a> </body>

Har ni även andra tips så får det gärna flikas in! Bättre att lära sig rätt från början. Såga mig inte från fotknölarna bara..

Permalänk
Medlem
Skrivet av Gigabayt:

Jag lånar tråden lite. Har försökt trixa lite med PHP senaste dagarna men har verkligen fastnat i nybörjarträsket. Jag försöker redigera inlägg skrivna i gästboken, men inget händer. Felmeddelandet jag får säger: "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 'WHERE id=1' at line 1". Jag har försökt finna en lösning i timmar men inget löser mitt problem. Förmodligen är svaret uppenbart, därför har jag dragit mig för att fråga.

edit.php

<?php $username="root"; $password=""; $database="ggb"; $id = $_GET['id']; mysql_connect('localhost',$username,$password) or die("Cannot connect"); @mysql_select_db($database) or die("Unable to select database"); $order = "SELECT * FROM gb where id='$id'"; $result = mysql_query($order); $row = mysql_fetch_array($result); ?> <body> <form action="update.php" method="post"> <input type="hidden" name="id" value="<?php echo $row['id']; ?>"> Namn:<input type="text" name="Namn" value="<?php echo $row['Namn']; ?>"> <br>Text: <textarea name="Medd" rows="5"><?php echo $row['Medd']; ?></textarea> <input type="submit" value="Skicka" name="submit"> </form> </body> <?php mysql_close(); ?>

update.php

<?php $username="root"; $password=""; $database="ggb"; mysql_connect('localhost',$username,$password) or die("Cannot connect"); @mysql_select_db($database) or die("Unable to select database"); $id = $_REQUEST['id']; $Namn = $_REQUEST['Namn']; $Medd = $_REQUEST['Medd']; $sql = "UPDATE gb SET Namn='$Namn', Medd='$Medd', WHERE id='$id'"; $result= mysql_query($sql); if($result) { echo "Successful"; } else { echo mysql_error(); } ?> <body><br><br> <a href="view.php">Go back</a> </body>

Har ni även andra tips så får det gärna flikas in! Bättre att lära sig rätt från början. Såga mig inte från fotknölarna bara..

Det fetstilta är saker som du bör se över, detta är sårbar kod som går att utnyttja.

$id = $_GET['id'];
$id = $_REQUEST['id'];
$Namn = $_REQUEST['Namn'];
$Medd = $_REQUEST['Medd'];

Kolla upp mysql_real_escape_string åtminstone, verkar även vara sårbar för XSS men antar att det bara är du som ska ha tillgång till detta.

Du bör förövrigt gå över till MySQLi eller PDO då mysql kommer att sluta fungera i framtiden, hur långt bort det är vet jag inte.
Har du testat att bara sätta en enkel apostrof ' runt id i SQL-queryn?

Gjorde det i din kod nu, tror det inte ska behövas men går att testa.
Är det på båda sidorna eller bara på ena som det krånglar?

Permalänk
Inaktiv

Du ska inte ha ett kommatecken efter $Medd' i din query. Sen som BuruZ säger bör du se över SQL Injections.

$sql = "UPDATE gb SET Namn='$Namn', Medd='$Medd' WHERE id=$id";

Permalänk
Medlem
Skrivet av BuruZ:

Det fetstilta är saker som du bör se över, detta är sårbar kod som går att utnyttja.

$id = $_GET['id'];
$id = $_REQUEST['id'];
$Namn = $_REQUEST['Namn'];
$Medd = $_REQUEST['Medd'];

Kolla upp mysql_real_escape_string åtminstone, verkar även vara sårbar för XSS men antar att det bara är du som ska ha tillgång till detta.

Du bör förövrigt gå över till MySQLi eller PDO då mysql kommer att sluta fungera i framtiden, hur långt bort det är vet jag inte.
Har du testat att bara sätta en enkel apostrof ' runt id i SQL-queryn?

Gjorde det i din kod nu, tror det inte ska behövas men går att testa.
Är det på båda sidorna eller bara på ena som det krånglar?

Jag ska ta mig en närmare titt på just säkerhet efter att ha fått en liten uppfattning om hur saker och ting fungerar ihop. Jag kommer nog använda mig av Mysqli om inte ni har några invändningar.

Skrivet av anon150287:

Du ska inte ha ett kommatecken efter $Medd' i din query. Sen som BuruZ säger bör du se över SQL Injections.

$sql = "UPDATE gb SET Namn='$Namn', Medd='$Medd' WHERE id=$id";

Tänka sig.. att jag stirrat mig blind på allt annat och provat mig fram men missat att ta bort kommatecknet. Tack för hjälpen!

Permalänk
Inaktiv
Skrivet av Gigabayt:

Jag ska ta mig en närmare titt på just säkerhet efter att ha fått en liten uppfattning om hur saker och ting fungerar ihop. Jag kommer nog använda mig av Mysqli om inte ni har några invändningar.

Har du inte använt MySQLi förr tycker jag du ska satsa på PDO istället. Jag gjorde "misstaget" att lära mig MySQLi istället för PDO och skulle definitivt valt PDO om jag fick välja nu. Här finns en jämförelse: http://net.tutsplus.com/tutorials/php/pdo-vs-mysqli-which-sho...

Permalänk
Medlem
Skrivet av Gigabayt:

Jag ska ta mig en närmare titt på just säkerhet efter att ha fått en liten uppfattning om hur saker och ting fungerar ihop. Jag kommer nog använda mig av Mysqli om inte ni har några invändningar.

Vad jag förstår är PDO ett bättre sätt att koppla upp sig mot en databas.
I min gästbok ovan använder jag mig av PDO, iofs mot SQLite istället för MySQL, men man behöver bara ändra ett par saker för att få det funka med andra databaser.
Den här bloggposten har jag haft mycket hjälp av. http://wallmander.net/1108-pdo-mysql-funktionerna-php-5/

Passar på att posta den slutgiltiga versionen av ovan gästbokskod, om den är till någon nytta.

<?php session_start(); // // Connect to the database // date_default_timezone_set('Europe/Copenhagen'); $db = new PDO("sqlite:dagbok.sqlite"); $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING); // Display errors, but continue script ?> <p>Skriv något!</p> <?php // // Check if Save-button was pressed, save the ad if true. // if(isset($_POST['doCreate'])) { $ad[] = date('Y-m-d H:i'); $ad[] = strip_tags($_POST["content"]); if (!empty($_POST["content"])) { $stmt = $db->prepare("INSERT INTO guest (pubdate,content) VALUES (:current_timestamp, :content)"); $stmt->execute($ad); $_SESSION [$output] = "Lade till ett nytt meddelande med id " . $db->lastInsertId() . ". Rowcount is = " . $stmt->rowCount() . "."; header('Location: mess.php'); }else{ echo "Tom ruta? Det funkar inte!"; } } ?> <form method="post" action="mess.php"> <fieldset> <p> <textarea style="width:100%;" name="content"></textarea> </p> <p> <input type="submit" name="doCreate" value="Skicka"> </p> </fieldset> </form> <?php // // // Välj artiklar // $stmt = $db->prepare('SELECT * FROM guest ORDER BY ID DESC ;'); $stmt->execute(); $res = $stmt->fetchAll(PDO::FETCH_ASSOC); $current = null; ?> <!-- Loopar igenom artiklarna --> <?php if ($current == null): ?> <?php foreach($res as $content): ?> <p><?php echo $content['pubdate']; ?><br> <?php echo $content['content']; ?></p><hr> <?php endforeach; ?><?php endif?> </article> </div>

edit, resultatet av denna kod kan fö beskådas här http://magdalenawidegren.se/mess

Visa signatur