[MySQL] Na 99 records zijn alle nieuwe entries leeg

Pagina: 1
Acties:

  • ericafterdark
  • Registratie: Januari 2002
  • Laatst online: 01-12 20:02
Hi,

Ik heb een simpel gastenboek draaien op een website en ik maak gebruik van PHP en een MySQL database.

De volgende velden heb ik in de database:

rec_id
naam
email
website
location
comments
ip_address
datesubmitted

Probleem dat er optreed is als volgt.
Sinds dat we bij rec_id 100 zitten, krijg ik alleen maar lege records in mijn database te zien.
Wat je ook invult, hij maakt wel een record aan en noemt hem inmiddels 106 (aantal testjes) maar alle velden op de datum na zijn leeg.

Het gastenboek zelf laat uiteraar dus ook een lege entry zien.

Dit is het HTTP forumuliertje:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
<form action="http://www.domeintjeenzo.nl/gastenboek/addrecord.php" method="post" name="gastenboek" onSubmit="return validate()">
          <table width="410" border="0" align="center" cellpadding="0" cellspacing="5" class="content">
            <tr>
              <td scope="col"><div align="right">Naam</div></td>
              <td scope="col">
                <div align="left">
                  <label>
                  <input type="text" id="nme" name="name" maxlength="30" size="30" />
                  </label>
              </div></td>
            </tr>
            <tr>
              <td><div align="right">E-mail</div></td>
              <td>
                <div align="left">
                  <label>
                  <input type="text" id="eml" name="email" maxlength="200" size="30" />
                  </label>
              </div></td>
            </tr>
            <tr class="content">
              <td class="content"><div align="right">Website</div></td>
              <td><div align="left">
                  <label>
                  <input type="text" id="site" name="website" maxlength="200" size="30" />
                  </label>
              </div></td>
            </tr>
            <tr class="content">
              <td class="content"><div align="right">Plaats</div></td>
              <td><div align="left">
                  <label>
                  <input type="text" id="loc" name="location" maxlength="200" size="30" />
                  </label>
              </div></td>
            </tr>
            <tr class="content">
              <td valign="top" class="content"><div align="right">Bericht</div></td>
              <td>
                <div align="left">
                  <label>
                  <textarea id="comm" name="comments" cols="45" rows="10"></textarea>
                  </label>
              </div></td>
            </tr>
            <tr class="content">
              <td class="content">&nbsp;</td>
              <td><input type="submit" name="Submit" value="Plaats bericht" /></td>
            </tr>
            <tr class="content">
              <td class="content"><div align="right"></div></td>
              <td>                <div align="left">
                  <label><span class="style1">* Naam &amp; Bericht zijn verplicht
                  <br />
                  * Reclame is niet toegestaan ! </span></label></div></td>
            </tr>
        </table>
    </form>


Dit is mijn addrecord.php pagina:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
<?php

//Setup the username, password and database name.

    $dbaddress = "db.pcextreme.nl";

    $user      = "xxxxxxxxxxxxx";

    $password  = "xxxxxxxxxxx";

    $db        = "xxxxxxxxxxxx";

//Make a link to the database, then test the connection. If it cant link, due to bad username

//password, permissions, whatever, kill the process.

    $link = mysql_connect($dbaddress, $user, $password);

    if (!$link) die ("cant connect to mysql");

//select the database once connected.

    mysql_select_db($db, $link) or die ("cannot connect"); 

//Fieldnames used

//rec_id

//name

//email

//website

//location

//comments

//ip_address

//datesubmitted


// Record the ip address because it gives us a weird, creepy, almost erotic sense of power

$ip_address = GetHostByName($REMOTE_ADDR); 

//set up the query to insert the entry into the guestbook

    $query = "INSERT INTO guestbook ( name, email, website, location, comments, ip_address, datesubmitted )

            values ( '$name', '$email', '$website', '$location', '$comments', '$ip_address', NOW() )";

//run the query

    mysql_query($query, $link) or die (mysql_error());

//close the sql connection.

    mysql_close($link);

//Email the form

   if ( count ( $HTTP_POST_VARS ) ) {

    foreach ( $HTTP_POST_VARS as $key=>$value ) {

      $msg.="$key: $value\n";

     }

    }

    $msg.="\n\n\nIP Info: $REMOTE_ADDR - ".gethostbyaddr($REMOTE_ADDR)."\n";

// headers for the email listed below

    $headers .= "From: $email\n";

    $headers .= "Content-Type: text/plain; charset=iso-8859-1\n";

    $recipient="YOU@DOMAIN.COM";

    $subject="New Entry Into The Guestbook";

    mail($recipient, $subject, stripslashes($msg), $headers); 

//Once the data is entered, redirect the user back to the guestbook

   header("location: http://www.mijndomeintjeenzo.nl/index.php?pagina=gastenboek");

?>


Waar kan het probleem liggen?

[ Voor 32% gewijzigd door ericafterdark op 19-12-2006 19:22 ]

Hier had uw reclame kunnen staan.


  • Intrepidity
  • Registratie: December 2003
  • Laatst online: 24-06-2024
Mijn eerste ingeving zou zeggen dat je als veldlengte voor rec_id 2 hebt ingesteld, maar aangezien je zegt id 106 te krijgen zou dat het niet mogen wezen..

Trouwens nog wel een security-gerelateerde opmerking:
values ( '$name' )
das niet veilig.. doe het liever zo:
values ( ' " . $name . " '
(zonder spaties tussen de ' en ", was even om duidelijk te maken wat er staat)
Misschien gaat mysql daarom wel op zijn plaat.. als iemand namelijk iets met een aanhalingsteken als naam in zou voeren eindigt volgens mysql de naam-string..

[ Voor 11% gewijzigd door Intrepidity op 19-12-2006 19:09 ]


  • ericafterdark
  • Registratie: Januari 2002
  • Laatst online: 01-12 20:02
Intrepidity schreef op dinsdag 19 december 2006 @ 19:07:
Mijn eerste ingeving zou zeggen dat je als veldlengte voor rec_id 2 hebt ingesteld, maar aangezien je zegt id 106 te krijgen zou dat het niet mogen wezen..

Trouwens nog wel een security-gerelateerde opmerking:
values ( '$name'
das niet veilig.. doe het liever zo:
values ( ' " . $name . " ' [enzovoort]
Misschien gaat mysql daarom wel op zijn plaat.. als iemand namelijk iets met een aanhalingsteken als naam in zou voeren eindigt volgens mysql de naam-string..
Ja hij telt gewoon door. De datum vult hij ook in. Maar alle andere velden processed hij niet door.

Bedankt voor de goede tip trouwens, dat ga ik ook aanpassen dan.


-edit-


Even een update.

Wanneer ik handmatig via PHPMyAdmin een entry toevoeg gaat alles zonder problemen.
Probleem treedt dus op bij het toevoegen van een entry via HTTP.

[ Voor 11% gewijzigd door ericafterdark op 19-12-2006 19:15 ]

Hier had uw reclame kunnen staan.


  • DexterDee
  • Registratie: November 2004
  • Laatst online: 18:35

DexterDee

I doubt, therefore I might be

Intrepidity schreef op dinsdag 19 december 2006 @ 19:07:
Trouwens nog wel een security-gerelateerde opmerking:

[...]

das niet veilig.. doe het liever zo:

[...]

(zonder spaties tussen de ' en ", was even om duidelijk te maken wat er staat)
Misschien gaat mysql daarom wel op zijn plaat.. als iemand namelijk iets met een aanhalingsteken als naam in zou voeren eindigt volgens mysql de naam-string..
Dat is even onveilig. In de variabele kan nog steeds een single quote zitten. Er is maar 1 veilige methode en dat is de quotes escapen in de variabelen die je in je SQL query gebruikt.

Klik hier om mij een DM te sturen • 3245 WP op ZW


  • ericafterdark
  • Registratie: Januari 2002
  • Laatst online: 01-12 20:02
Ik blijf mijn script verbeteren zo :)

Maar goed, terug ontopic. Het probleem is dus geisoleerd naar HTTP. Het probleem ontstaat wanneer iemand het formulier invult en de pagina die ik hierboven al plaatste de entry maakt. Rechtstreeks een entry maken via PHPMyAdmin levert geen problemen op.

Hoe kan ik dit oplossen?

[ Voor 12% gewijzigd door ericafterdark op 19-12-2006 19:24 ]

Hier had uw reclame kunnen staan.


  • orf
  • Registratie: Augustus 2005
  • Laatst online: 19:21

orf

Heeft je webhoster niet simpelweg register globals uitgezet?
Je script is oud en kan daardoor problemen geven.

  • Helza
  • Registratie: Maart 2003
  • Laatst online: 15:34
Controleer eens of de waarden van $name etc allemaal wel gevult zijn.
Tenzij je namelijk register globals aan hebt staan gaat dit niet werken.

even later doe je namelijk dit:
if ( count ( $HTTP_POST_VARS ) ) {
foreach ( $HTTP_POST_VARS as $key=>$value ) {
$msg.="$key: $value\n";

  • kenneth
  • Registratie: September 2001
  • Niet online

kenneth

achter de duinen

DexterDee schreef op dinsdag 19 december 2006 @ 19:19:
Dat is even onveilig. In de variabele kan nog steeds een single quote zitten. Er is maar 1 veilige methode en dat is de quotes escapen in de variabelen die je in je SQL query gebruikt.
1? Je vergeet parameterization :) Dé veiligste manier die ook nog 'ns een hoop met datums en floats bespaart.


/offtopic :P

Look, runners deal in discomfort. After you get past a certain point, that’s all there really is. There is no finesse here.


  • DexterDee
  • Registratie: November 2004
  • Laatst online: 18:35

DexterDee

I doubt, therefore I might be

kenneth schreef op dinsdag 19 december 2006 @ 19:36:
[...]

1? Je vergeet parameterization :) Dé veiligste manier die ook nog 'ns een hoop met datums en floats bespaart.


/offtopic :P
/offtopic

Parameterization helpt alleen als je in je parameters object de strings óók escaped naar je SQL output. Toegegeven is de kans op fouten met parameterization kleiner doordat je een meer structurelere manier van queries bouwen gebruikt, maar de initiele escape zul je toch echt zelf moeten programmeren in je parameters object of je zult een framework moeten zoeken die dat voor je doet. En als je dan toch met db abstractie frameworks aan de slag gaat, kun je evengoed voor DB objects of een ORM framework gaan.

In de pure zin van het woord is het dus nog steeds zo dat escaping (in welke vorm dan ook) de enige veilige methode is. Hoe je dit bereikt (met een functie of met behulp van parameterization) is toch van ondergeschikt belang :)

/ontopic

Kun je eens een SQL dump maken van de structure van je tabel? Misschien kunnen we daar nog wat eigenaardigheden mee ontdekken.

Klik hier om mij een DM te sturen • 3245 WP op ZW


  • Helza
  • Registratie: Maart 2003
  • Laatst online: 15:34
Als je PHP 5 gebruik is het zeker aan te raden om PDO te gebruiken en de bind parameter methode :)
Uniforme database commando's voor alle databases en sql injection beveiliging :)

  • ericafterdark
  • Registratie: Januari 2002
  • Laatst online: 01-12 20:02
Thanks iedereen voor de info.

Met dank aan een php/mysql wizzard hier naast me hebben we snel het script kunnen aanpassen.
Wat is het geval, global_registers staat dus inderdaad uit. De webhoster heeft het uitgezet.


Ik heb dit stukje code (met wat hulp):

code:
1
2
3
4
5
//set up the query to insert the entry into the guestbook

    $query = "INSERT INTO guestbook ( name, email, website, location, comments, ip_address, datesubmitted )

            values ( '$name', '$email', '$website', '$location', '$comments', '$ip_address', NOW() )";



Aangepast naar:

code:
1
2
3
4
5
6
7
8
9
10
11
//set up the query to insert the entry into the guestbook

    $query = "INSERT INTO guestbook ( name, email, website, location, comments, ip_address, datesubmitted ) " .

            "values (" .
        "'" . mysql_real_escape_string($_POST['name'], $link) . "', " .
        "'" . mysql_real_escape_string($_POST['email'], $link) . "', " .
        "'" . mysql_real_escape_string($_POST['website'], $link) . "', " .
        "'" . mysql_real_escape_string($_POST['location'], $link) . "', " .
        "'" . mysql_real_escape_string($_POST['comments'], $link) . "', '" .
        $ip_address . "', NOW() )";


Probleem opgelost :D

Hier had uw reclame kunnen staan.


  • DexterDee
  • Registratie: November 2004
  • Laatst online: 18:35

DexterDee

I doubt, therefore I might be

Je kunt die code echt een heel stuk korter maken nog met bijvoorbeeld deze functie:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function quote_smart($value)
{
   if( is_array($value) ) { 
       return array_map("quote_smart", $value);
   } else {
       if( get_magic_quotes_gpc() ) {
           $value = stripslashes($value);
       }
       if( $value == '' ) {
           $value = 'NULL';
       } if( !is_numeric($value) || $value[0] == '0' ) {
           $value = "'".mysql_real_escape_string($value)."'";
       }
       return $value;
   }
}


Zo wordt je code met behulp van die functie zo:
PHP:
1
2
3
4
5
6
$sqlfields = quote_smart( $_POST );

$query = "INSERT INTO guestbook ( name, email, website, location, comments, ip_address, datesubmitted ) 
         values ( {$sqlfields['name']}, {$sqlfields['email']},
         {$sqlfields['website']}, {$sqlfields['location']}, 
         $ip_address, NOW() )";

Een stuk korter zo :)

Klik hier om mij een DM te sturen • 3245 WP op ZW

Pagina: 1