Avatar billede only-boy Nybegynder
04. januar 2005 - 23:38 Der er 33 kommentarer og
2 løsninger

Fejl i PHP-kode

Lukket mit gamle spm. da det åbenbart var sværere end 15 point, så folk smuttede igen. Derfor dette til spm. til 30 point for løsningen af det:


- http://www.eksperten.dk/spm/577261
Avatar billede erikjacobsen Ekspert
04. januar 2005 - 23:39 #1
Du var simpelthen for utålmodig. Vi har vel også andet at lave.
Avatar billede only-boy Nybegynder
04. januar 2005 - 23:41 #2
Måske ja, men en ven nævnte lige at det nok var for lidt og det kunne jeg nok godt se så ville lige smide flere point i puljen
Avatar billede neocron Nybegynder
04. januar 2005 - 23:41 #3
Jeg postede en mulig ide - ved ikke om du har set det - det kom lige efter du lukkede den.. men here goes again:

----------------------------------------

mysql_query("INSERT INTO comments(navn, alder, telefon) VALUES('$navn', '$alder', '$telefon')") or die(mysql_error());

(ret selv din kode til, så den passer)

Men som du kan se, viser jeg hvor den skal gemme det.
  1: navn
  2: alder
  3: telefon

Og dernæst kommer de data, der skal gemmes
  1: $navn
  2: $alder
  3: $telefon

Så er jeg ihvertfald sikker på at det kommer de rigtige steder hen :)
Avatar billede mccookie Seniormester
04. januar 2005 - 23:43 #4
('','".$_POST['name']."','".$_POST['email']."',now(),'".$_POST['text']."','".$_POST['ip']."','".$_POST['parent']."')")
Avatar billede only-boy Nybegynder
04. januar 2005 - 23:47 #5
neocron -->

Som jeg skriver i det andet spm. er fejlen i denne linie så vidt jeg er orinteret:
<input type="hidden" name="ip" value="<?php $ip=$_SERVER['REMOTE_ADDR']; ?>">

Retter din kode dette, muligvis ?
Avatar billede leif Seniormester
04. januar 2005 - 23:49 #6
Hvordan fejler den ?
Avatar billede neocron Nybegynder
04. januar 2005 - 23:49 #7
Du siger at dine data bliver postet andre steder i databasen, end de bør. Så ja det gør det måske! (Medmindre jeg totalt har misforstået, selvfølgelig.. det skal jeg da ikke afvise)

Men din kode er helt gyldig - du kunne også skrive:
<?=$ip = $_SERVER["REMOTE_ADDR"]; ?>
Avatar billede mccookie Seniormester
04. januar 2005 - 23:50 #8
(  ,'".$_POST['name']."'
    ,'".$_POST['email']."'
    ,now()
    ,'".$_POST['text']."'
    ,'".$_POST['ip']."'
    ,'".$_POST['parent']."')")
Avatar billede only-boy Nybegynder
04. januar 2005 - 23:53 #9
neocron -->

Ikke denne <?=$ip = $_SERVER["REMOTE_ADDR"]; ?> det gør det kun være kan jeg se :-(
Avatar billede neocron Nybegynder
04. januar 2005 - 23:59 #10
Hov... kom til at poste svaret i den gamle topic!
Here goes again:

<input type="hidden" name="ip" value="<?=$_SERVER["REMOTE_ADDR"]; ?>">

Sådan kan den se ud (beklager forrige fejl)!
Når du kalder $ip efter at have sendt formen får du ip'en. Du kan selv teste med at smide den ind i et php dokument, uploade og vise source.
Avatar billede erikjacobsen Ekspert
05. januar 2005 - 00:04 #11
Men det er nu tosset at putte en IP ind i et felt på een side, og aflæse feltet
på en anden side, når den anden side lige så godt kunne aflæse IP-en. Faktisk
vil enhver hacker kunne indsætte en vilkårlig IP-adresse, og så er det jo ikke til
nogen nytte ;)

Men er problemet ikke med indsættelsen i databasen  -  eller hvad?
Avatar billede only-boy Nybegynder
05. januar 2005 - 00:08 #12
neocron --> Lige prøvet ovenstående, og gav samme resultat. Stor forvirring i min MySQL Database... Ipén skal den ligge i den kolonne som hedder "ip". Lige pt. ligger den ipén i en anden kolonne.
Avatar billede erikjacobsen Ekspert
05. januar 2005 - 00:09 #13
Forstår du hvad der foreslås i 04/01-2005 23:41:12 ?
Avatar billede neocron Nybegynder
05. januar 2005 - 00:10 #14
erikjacobsen har egentlig ret i det han siger. Jeg er ikke nogen større ekspert i sikkerhed som sådan, men jeg bruger heller aldrig selv $_SERVER["REMOTE_ADDR"] hvor andre kan se den. Den ryger bare ind som et led i mysql-query'en uden at blive printet til brugeren.

Hmm så ved jeg godt nok ikke lige umiddelbart. Placeres de andre data NOGENLUNDE, som de skal, hvis vi lige tæller ip-rækken fra?
Avatar billede only-boy Nybegynder
05. januar 2005 - 00:11 #15
Nej, ikke rigtigt... Men min forbindelse til databasen er lukket der, da den er færdig, i min kode vil jeg ikke kunne gøre det da den kode skal connecte databasen
Avatar billede erikjacobsen Ekspert
05. januar 2005 - 00:12 #16
04/01-2005 23:41:12 siger at du skal bruge navnene på felterne i databasen i din SQL-sætning,
og på den måde få tingene ind de rigtige steder.
Avatar billede only-boy Nybegynder
05. januar 2005 - 00:12 #17
neocron --> IPén skal ikke være synlig for brugeren, kun være gemt i databasen :-)

De øvrige felter placere sig heller ikke rigtigt, som om de skal rykkes én kolonne til højre, så vil de fleste faktisk passe.
Avatar billede neocron Nybegynder
05. januar 2005 - 00:14 #18
Jeg har aldrig oplevet det problem før. Ved ikke lige hvad det skyldes. Stemmer alle felternes navn overens osv?
Avatar billede only-boy Nybegynder
05. januar 2005 - 00:15 #19
min fil: news.display.php

<?php
include('inc.config.php');
$query = mysql_query("SELECT *,DATE_FORMAT(date,'%e/%c-%Y %T') AS date FROM news WHERE id=".$_GET['id']."");
$row = mysql_fetch_assoc($query);

echo '<h2>'.$row['title'].'</h2>';
echo '<p><b>'.$row['synopsis'].'</b></p>';
echo empty($row['image']) ? '' : '<p align="center"><img src="files/'.$row['image'].'" class="image">';
echo '</p>';
echo nl2br($row['text']);
echo '<br><br><p>Skrevet af '.$row['author'].', '.$row['date'].'</p>';
echo '<div class="hr"></div>';


$query = mysql_query("SELECT *,DATE_FORMAT(date,'%e/%c-%Y %T') AS date FROM comments WHERE parent=".$_GET['id']." ORDER BY id ASC");
if (mysql_num_rows($query) > 0) {
    echo '<a name="Kommentarer"></a><h2>Kommentarer</h2>';
    while ($row = mysql_fetch_assoc($query)) {
        echo empty($row['email']) ? htmlspecialchars($row['name']) : '<a href="mailto:'.$row['email'].'">'.htmlspecialchars($row['name']).'</a>';
        echo '&nbsp;('.$row['date'].')<br><br>';
        echo nl2br(htmlspecialchars($row['text']));
        echo '<div class="hr"></div>';
    }
}
?>

<a name="kommenter"></a><h2>Kommenter nyhed</h2>

Her kan du vælge at kommentere, ovenstående nyhed - sæt dine egne ord på og deltag i debatten.

<br>

<form method="post" action="form.handle.php">
<table border="0" width="100%">
  <tr>
    <td width="8%">Navn</td>
    <td width="1%">:</td>
    <td width="91%"> <input type="text" name="name" style="width: 167; height: 23" size="20">
    </td>
  </tr>
  <tr>
    <td width="8%">E-mail</td>
    <td width="1%">:</td>
    <td width="91%"> <input type="text" name="email" style="width: 166; height: 23" size="20"></td>
  </tr>
  <tr>
    <td width="8%" vAlign="top">Indlæg</td>
    <td width="1%" vAlign="top">:</td>
    <td width="91%">
<textarea name="text" rows="7" cols="0" style="width: 314; height: 155"></textarea></td>
  </tr>
  <tr>
    <td width="8%" vAlign="top">&nbsp;</td>
    <td width="1%" vAlign="top"></td>
    <td width="91%">
    </td>
  </tr>
  <tr>
    <td width="8%" vAlign="top"></td>
    <td width="1%" vAlign="top"></td>
    <td width="91%">

<input type="submit" value="Send">
<input type="reset" value="Slet alt" name="B1"></td>
  </tr>
</table>
<input type="hidden" name="referer" value="comment">
<input type="hidden" name="parent" value="<?php echo $_GET['id']; ?>">

</form>


Nu er den ændret til:


<?php
include('inc.config.php');
$query = mysql_query("SELECT *,DATE_FORMAT(date,'%e/%c-%Y %T') AS date FROM news WHERE id=".$_GET['id']."");
$row = mysql_fetch_assoc($query);

echo '<h2>'.$row['title'].'</h2>';
echo '<p><b>'.$row['synopsis'].'</b></p>';
echo empty($row['image']) ? '' : '<p align="center"><img src="files/'.$row['image'].'" class="image">';
echo '</p>';
echo nl2br($row['text']);
echo '<br><br><p>Skrevet af '.$row['author'].', '.$row['date'].'</p>';
echo '<div class="hr"></div>';


$query = mysql_query("SELECT *,DATE_FORMAT(date,'%e/%c-%Y %T') AS date FROM comments WHERE parent=".$_GET['id']." ORDER BY id ASC");
if (mysql_num_rows($query) > 0) {
    echo '<a name="Kommentarer"></a><h2>Kommentarer</h2>';
    while ($row = mysql_fetch_assoc($query)) {
        echo empty($row['email']) ? htmlspecialchars($row['name']) : '<a href="mailto:'.$row['email'].'">'.htmlspecialchars($row['name']).'</a>';
        echo '&nbsp;('.$row['date'].')<br><br>';
        echo nl2br(htmlspecialchars($row['text']));
        echo '<div class="hr"></div>';
    }
}
?>

<a name="kommenter"></a><h2>Kommenter nyhed</h2>

Her kan du vælge at kommentere, ovenstående nyhed - sæt dine egne ord på og deltag i debatten.

<br>

<form method="post" action="form.handle.php">
<table border="0" width="100%">
  <tr>
    <td width="8%">Navn</td>
    <td width="1%">:</td>
    <td width="91%"> <input type="text" name="name" style="width: 167; height: 23" size="20">
    </td>
  </tr>
  <tr>
    <td width="8%">E-mail</td>
    <td width="1%">:</td>
    <td width="91%"> <input type="text" name="email" style="width: 166; height: 23" size="20"></td>
  </tr>
  <tr>
    <td width="8%" vAlign="top">Indlæg</td>
    <td width="1%" vAlign="top">:</td>
    <td width="91%">
<textarea name="text" rows="7" cols="0" style="width: 314; height: 155"></textarea></td>
  </tr>
  <tr>
    <td width="8%" vAlign="top">&nbsp;</td>
    <td width="1%" vAlign="top"></td>
    <td width="91%">
    </td>
  </tr>
  <tr>
    <td width="8%" vAlign="top"></td>
    <td width="1%" vAlign="top"></td>
    <td width="91%">

<input type="submit" value="Send">
<input type="reset" value="Slet alt" name="B1"></td>
  </tr>
</table>
<input type="hidden" name="referer" value="comment">
<input type="hidden" name="parent" value="<?php echo $_GET['id']; ?>">
<input type="hidden" name="ip" value="<?php $ip=$_SERVER['REMOTE_ADDR']; ?>">
</form>

Nederst, skal den nu også hente brugerens IP og indsætte den i feltet ip. Med den gamle kode kom tingene ind det rigtige sted, men ikke når jeg får sat "ip" på ?

04/01-2005 23:41:12  I snakker om, hvor skal den indsættes i den nye kode så ?
Avatar billede erikjacobsen Ekspert
05. januar 2005 - 00:18 #20
Det skal være en ændring til den den INSERT sætning du har nu.
Avatar billede only-boy Nybegynder
05. januar 2005 - 00:19 #21
Altså:

mysql_query("INSERT INTO comments(navn, alder, telefon) VALUES('$navn', '$alder', '$telefon')") or die(mysql_error());

Istedet for:

<input type="hidden" name="ip" value="<?php $ip=$_SERVER['REMOTE_ADDR']; ?>">
Avatar billede erikjacobsen Ekspert
05. januar 2005 - 00:20 #22
nej
Avatar billede only-boy Nybegynder
05. januar 2005 - 00:22 #23
erikjacobsen --> Så er jeg desværre tabt på gulvet igen
Avatar billede erikjacobsen Ekspert
05. januar 2005 - 00:23 #24
Du har en sql INSERT sætning - det er den der er gal, og den der skal rettes, med
udgangspunkt i 04/01-2005 23:41:12 men med dine navne og værdier.
Avatar billede only-boy Nybegynder
05. januar 2005 - 00:26 #25
erikjacobsen --> Du må meget undskylde mig, men er væk omkring det. Hvis der er en fejl der, hvorfor har det så virket før, uden <input type="hidden" name="ip" value="<?php $ip=$_SERVER['REMOTE_ADDR']; ?>">
Avatar billede erikjacobsen Ekspert
05. januar 2005 - 00:30 #26
Fordi du også har ændret i din SQL INSERT sætning. Brug de navne, så ved du hvor det havner henne.
Avatar billede only-boy Nybegynder
05. januar 2005 - 00:35 #27
Ahhh, NU er jeg med :D
- "Det er ikke så svært, når man først får det lært - vi alle har vel startet ét sted" hehe...


<?php
include('inc.config.php');

if ($_POST['referer'] == 'comment') {
    if (empty($_POST['name']) && empty($_POST['text'])) {
        echo '<font color="red">Alle felter er ikke udfyldt!</font>';
    } else {
        $_POST['email'] = preg_match("/^[\w\.\-_]+@([\w\-_]+\.)+\w+$/i",$_POST['email']) ? $_POST['email'] : '';
        mysql_query("INSERT INTO comments VALUES ('','".$_POST['ip']."','".$_POST['name']."','".$_POST['email']."',now(),'".$_POST['text']."','".$_POST['parent']."')") or die(mysql_error());
        header("Location: news.display.php?id=".$_POST['parent']);
    }
}
?>


IPén kommer dog ikke med, måske har jeg sat ét ' eller " for meget ??
Avatar billede only-boy Nybegynder
05. januar 2005 - 00:37 #28
Der hvor 04/01-2005 23:41:12 kommer ind i billedet ??
Avatar billede erikjacobsen Ekspert
05. januar 2005 - 00:39 #29
Nej, gå tilbage til dit første spørgsmål, første kommentar, og følg den.
Avatar billede erikjacobsen Ekspert
05. januar 2005 - 00:41 #30
Det du har nu, 00:35:50, uden navne på felter, er såmænd godt nok, når de nu
står i den rigtige rækkefølge. Når det virker kan du jo sætte navne på felter
ind, så det bliver mere læseligt.
Avatar billede only-boy Nybegynder
05. januar 2005 - 00:44 #31
<?php
include('inc.config.php');

if ($_POST['referer'] == 'comment') {
    if (empty($_POST['name']) && empty($_POST['text'])) {
        echo '<font color="red">Alle felter er ikke udfyldt!</font>';
    } else {
        $_POST['email'] = preg_match("/^[\w\.\-_]+@([\w\-_]+\.)+\w+$/i",$_POST['email']) ? $_POST['email'] : '';
        mysql_query("INSERT INTO comments VALUES ('','".$_POST['ip']."','".$_POST['name']."','".$_POST['email']."',now(),'".$_POST['text']."','".$_POST['parent']."')") or die(mysql_error());
        header("Location: news.display.php?id=".$_POST['parent']);
    }
}
?>


IPén kommer dog ikke med, måske har jeg sat ét ' eller " for meget ??



Gentager den lige, da jeg herefter er tabt igen. Det virker stort set som det skal her, som skrevet kommer IPádressen ikke med.

Hvis jeg har ret, så går jeg over i mit gamle og nu lukkede spørgsmål og tager dig svar som er det første og erstatte det med det som er der nu ?
Avatar billede erikjacobsen Ekspert
05. januar 2005 - 00:49 #32
Ja, du skal yderligere lave den ændring, der er skrevet som det først i det andet spørgsmål.
Avatar billede only-boy Nybegynder
05. januar 2005 - 00:53 #33
Weee --> Tusind tak, kan se i min MySQL Admin at alt køre som det skal :D Smid et svar og du får smidt nogen point tilbage i nakken som tak for hjælpen og din tolmodighed med os php-begyndere :-P
Avatar billede erikjacobsen Ekspert
05. januar 2005 - 00:56 #34
Jeg samler ikke på point, tak.

Men det med IP-en som jeg skrev. Du skal nok ganske simpelt ændre det til:

mysql_query("INSERT INTO comments VALUES ('','".$_SERVER['REMOTE_ADDR']."','".$_POST['name']."','".$_POST['email']."',now(),'".$_POST['text']."','".$_POST['parent']."')") or die(mysql_error());

og fjerne dit hidden-felt i formen. Så kan du ikke hackes på lige den måde i hvert fald ;)
Avatar billede only-boy Nybegynder
02. februar 2005 - 22:59 #35
Jamen, så bliver point fjernet igen :-)
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
Vi tilbyder markedets bedste kurser inden for webudvikling

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