Register script werkt niet.

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Tolga Kavi

Tolga Kavi

10/02/2012 16:06:38
Quote Anchor link
Goedendag allen,

Mijn naam is Tolga, ik ben nieuw op dit forum en ik loop vast met mijn registratie script. Ik krijg geen mysql_error() meldingen terwijl ik dat er wel bij heb staan.

Ik kan de code hier wel posten maar hoe doe ik dit?
Tussen code tags of iets anders?

Met vriendelijke groet,

Tolga Kavi
 
PHP hulp

PHP hulp

09/11/2024 02:10:21
 
- Ariën  -
Beheerder

- Ariën -

10/02/2012 16:14:17
Quote Anchor link
Tussen [code] en [/code] kan je jouw relevante code plaatsen.
 
Tolga Kavi

Tolga Kavi

10/02/2012 16:25:51
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?php
include ('database.inc.php');

// Post the form data and prevent mysql injection.
$userdata = mysql_real_escape_string($_POST['user_name']);
$passdata = mysql_real_escape_string($_POST['password']);
$passdata2 = mysql_real_escape_string($_POST['password2']);
$email = $_POST['email'];
$IP = $_SERVER['REMOTE_ADDR'];


// Connect to the database and check if either the username, ip, or email is registered.
$checksql = 'SELECT * FROM users WHERE Username = '.$userdata.' AND Email = '.$email.' AND IP = '.$IP.'';
$checkquery = mysql_query($checksql, $db_link) or die ('Unable to check for existing records. ' . mysql_error());

$count = mysql_num_rows($checkquery);

// Check if any records exist, else post to database.
if ($count > 0) {
    
    // Throw an error message for data that already exists.
    if ($count['IP'] > 0) {
        echo 'Sorry, your IP: '.$IP.' already has been registered, we only allow one account per IP.';
    }
elseif ($count['Username'] > 0) {
        echo 'Sorry, it seems your username: '.$userdata.' has already been taken.';
    }
elseif ($count['Email'] > 0) {
        echo 'Sorry, it seems this email address is already registered.';
    }
}
else {
    
    // Connect to the database and fill in the data.
    $sql = 'INSERT * INTO users (ID, Username, Password, Password2, Email, Status, Rank, IP)
    VALUES('
.$userdata.', MD5('.$passdata.'), SHA2('.$passdata2.', 256), '.$email.', Disabled, User, '.$IP.')';
    $query = mysql_query($sql, $db_link) or die ('Unable to enter information. ' . mysql_error());
    $result = mysql_affected_rows($query);
    
    if ($result > 0) {
        
        // Show success and redirect.        
        echo 'Success! Data has been stored into our database!';
        header("Refresh: 2, url=index.php");
    }
}


?>

Het register script:
 
Eddy B

Eddy B

10/02/2012 17:34:44
Quote Anchor link
Kijk je SQL even goed na, krijg je errors?
 
Tolga Kavi

Tolga Kavi

10/02/2012 17:37:12
Quote Anchor link
Dat is het hem nou juist.
Ik krijg geen mysql_error() output naast de tekst die ik heb neergezet. In ieder geval ben ik erachter gekomen dat hij bij de select al fout gaat.

Met vriendelijke groet,

Tolga Kavi
N.B overigens. http://digital-universe.nl/reg_form.php voor als u het zelf wilt proberen met een test account aan te maken, wat ik nu krijg is alleen, Unable to check existing records. {Hier zou mysql_error() moeten komen, maar dat is niet het geval.}
 
Jens erd

Jens erd

10/02/2012 17:45:33
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
$checksql = 'SELECT * FROM users WHERE Username = '.$userdata.' AND Email = '.$email.' AND IP = '.$IP.'';

Plaats ""-haakjes om tekst heen, dat zou een hele vooruitgang moeten zijn.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
    $sql = 'INSERT * INTO users (ID, Username, Password, Password2, Email, Status, Rank, IP)
    VALUES('.$userdata.', MD5('.$passdata.'), SHA2('.$passdata2.', 256), '.$email.', Disabled, User, '.$IP.')';
 

Een ID wordt als het goed is al opgehoogd, die mag je weglaten. 2 maal een wachtwoord opslaan is wat overbodig (en gevoeliger voor hackers), en md5() en SHA2() zijn functies binnen php en niet van Mysql. Uiteindelijk moet dit werken;
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
    $sql = "INSERT INTO users (Username, Password, Password2, Email, Status, Rank, IP)VALUES('".$userdata."', '".MD5($passdata)."', '".SHA2($passdata2, 256)."', '".$email."', Disabled, User, '".$IP.")"';
 


Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
        echo 'Success! Data has been stored into our database!';
        header("Refresh: 2, url=index.php");

gaat natuurlijk niet werken, stuur eerst je headers en dan pas kun je gaan echo'en o.i.d.
Gewijzigd op 10/02/2012 17:46:31 door Jens erd
 
Eddy B

Eddy B

10/02/2012 17:45:47
Quote Anchor link
Tolga,

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
INSERT INTO users (Username, Password, Password2, Email, Status, Rank, IP) VALUES ('username', MD5('password'), SHA2('password', 256), 'email', 'Disabled', 'User', '127');

Ik heb het getest, en dat werkt.

Een aantal punten:
- INSERT * INTO bestaat niet, een asterix is voor het selecteren van velden.
- gebruik geen hoofdletters in je database structuur
- gebruik de md5 of sha2 functies van PHP en niet die van MySQL
 
Erwin H

Erwin H

10/02/2012 17:46:52
Quote Anchor link
Je hebt geen quotes om je variabelen staan in de query, dus die waardes worden niet in de query verwerkt.
Dit:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$checksql
= 'SELECT * FROM users WHERE Username = '.$userdata.' AND Email = '.$email.' AND IP = '.$IP.'';
?>

Moet dit worden (met wat enters om het beter leesbaar te maken):
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?php
$checksql
= "SELECT *
  FROM users
  WHERE Username = '"
.$userdata."'
  AND Email = '"
.$email."'
  AND IP = '"
.$IP."'";
?>
 
Frank WD

Frank WD

10/02/2012 17:47:30
Quote Anchor link
Zit deze is boven aan je pagina. Hier mee zal je eigelijk een error moeten krijgen.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
ini_set('display_errors', 0); // 0 = uit, 1 = aan
error_reporting(E_ALL);
?>


Tevens moet je even kijken naar een goede foutafhandeling.
or die is namelijk oud en word niet meer gebruikt.

Zoals ze op dit forum altijd zeggen over or die.
Je gaat zelf ook niet dood als je iets fout doet.
 
Tolga Kavi

Tolga Kavi

10/02/2012 18:08:27
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?php
ini_set('display_errors', 1); // 0 = uit, 1 = aan
error_reporting(E_ALL);
?>

<?php
include ('includes/database.inc.php');

// Post the form data and prevent mysql injection.
$userdata = mysql_real_escape_string($_POST['user_name']);
$passdata = mysql_real_escape_string(sha1($_POST['password']));
$email = $_POST['email'];
$IP = $_SERVER['REMOTE_ADDR'];


// Connect to the database and check if either the username, ip, or email is registered.
$checksql = "SELECT *
  FROM users
  WHERE Username = '"
.$userdata."'
  AND Email = '"
.$email."'
  AND IP = '"
.$IP."'";
$checkquery = mysql_query($checksql) or die ('Unable to check for existing records. ' . mysql_error());

$count = mysql_num_rows($checkquery);

// Check if any records exist, else post to database.
if ($count > 0) {
    
    // Throw an error message for data that already exists.
    if ($count['IP'] > 0) {
        echo 'Sorry, your IP: '.$IP.' already has been registered, we only allow one account per IP.';
    }
elseif ($count['Username'] > 0) {
        echo 'Sorry, it seems your username: '.$userdata.' has already been taken.';
    }
elseif ($count['Email'] > 0) {
        echo 'Sorry, it seems this email address is already registered.';
    }
}
else {
    
    // Connect to the database and fill in the data.
    $sql = "INSERT
    INTO users
    (Username, Password, Email, Status, Rank, IP)
    VALUES
    ('"
$userdata'", '"$passdata"', '"$email"', Disabled, User, "'.$IP.'")"';
    $query = mysql_query($sql) or die ('Unable to enter information. ' . mysql_error());
    $result = mysql_affected_rows($query);
    
    if ($result > 0) {
        
        // Show success and redirect.        
        echo 'Success! Data has been stored into our database!';
        header("Refresh: 2, url=index.php");
    }
}


?>


Ik heb de code aangepast waar nodig, en ik krijg nu dit:

Unable to enter information. Column count doesn't match value count at row 1
En dit na het verwijderen van ID, ligt het dan aan de instelling waaronder mijn sql server draait? of moet ik om het ID kolom heen werken?
 
Eddy B

Eddy B

10/02/2012 18:19:46
Quote Anchor link
Hou je variabelen eens buiten de SQL en gebruik haakjes om strings.
 
Obelix Idefix

Obelix Idefix

10/02/2012 18:28:13
Quote Anchor link
Kijk naar de kleuren in je code (insert-query). Je ziet dat het dan niet klopt/goed gaat. Zie ook opmerking van Eddy.

Daarnaast: na header wordt exit geadviseerd.

Regel 9 t/m 12 zijn niet nodig; je kopieert nu variabelen.
mysql_real_escape_string gebruik je in een query.
 
- SanThe -

- SanThe -

10/02/2012 19:11:08
Quote Anchor link
Opmerkingen op je laatste script:

Regel 4 en 5: Niet php sluiten en dan weer openen. Hierdoor kan je de welbekende error 'Headers already send' error krijgen.
Regel 9, 10, 11 en 12: Een password hoef je niet te beveiligen want daar gaat een MD5() overheen. Waarom beveilig je email en ip niet. Dat is nu een sql-injection-lek.
Regel 21: Or die() is geen nette manier. Bouw nette foutafhandeling in.
Regel 29, 31 en 33: $count is een getal en géén array().
Regel 43: Data hoort tussen enkele quotes te staan.
Regel 44: Or die() is geen nette manier. Bouw nette foutafhandeling in.
Regel 50 en 51: Moeten omgedraaid worden in verband met 'Headers already send' error.
 
Tolga Kavi

Tolga Kavi

10/02/2012 19:16:02
Quote Anchor link
- SanThe - op 10/02/2012 19:11:08:
Opmerkingen op je laatste script:

Regel 4 en 5: Niet php sluiten en dan weer openen. Hierdoor kan je de welbekende error 'Headers already send' error krijgen.
Regel 9, 10, 11 en 12: Een password hoef je niet te beveiligen want daar gaat een MD5() overheen. Waarom beveilig je email en ip niet. Dat is nu een sql-injection-lek.
Regel 21: Or die() is geen nette manier. Bouw nette foutafhandeling in.
Regel 29, 31 en 33: $count is een getal en géén array().
Regel 43: Data hoort tussen enkele quotes te staan.
Regel 44: Or die() is geen nette manier. Bouw nette foutafhandeling in.
Regel 50 en 51: Moeten omgedraaid worden in verband met 'Headers already send' error.

@SanThe
Hoe zou ik IP kunnen beveiligen dan? Ook gewoon mysql_real_escape_string($var)??

En bedankt allen voor jullie feedback:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?php
ini_set('display_errors', 1); // 0 = uit, 1 = aan
error_reporting(E_ALL);
?>

<?php
include ('includes/database.inc.php');

// Post the form data and prevent mysql injection.
$userdata = mysql_real_escape_string($_POST['user_name']);
$passdata = mysql_escape_string(sha1($_POST['password']));
$email = $_POST['email'];
$IP = $_SERVER['REMOTE_ADDR'];


// Connect to the database and check if either the username, ip, or email is registered.
$checksql = "SELECT *
  FROM users
  WHERE Username = '$userdata'
  AND Email = '$email'
  AND IP = '$IP'"
;
$checkquery = mysql_query($checksql);
if (!$checkquery) {

die ('Unable to check for existing records: ' . mysql_error());
}


$count = mysql_num_rows($checkquery);

// Check if any records exist, else post to database.
if ($count > 0) {
    
    // Throw an error message for data that already exists.
    if ($count['IP'] > 0) {
        echo 'Sorry, your IP: '.$IP.' already has been registered, we only allow one account per IP.';
    }
elseif ($count['Username'] > 0) {
        echo 'Sorry, it seems your username: '.$userdata.' has already been taken.';
    }
elseif ($count['Email'] > 0) {
        echo 'Sorry, it seems this email address is already registered.';
    }
}
else {
    
    // Connect to the database and fill in the data.
    $sql = "INSERT
    INTO users
    (Username, Password, Email, Status, Rank, IP)
    VALUES('$userdata',
    '$passdata',
    '$email', 'Disabled', 'User', '$IP')"
;
    $query = mysql_query($sql);
    if (!$query) {
        echo 'Unable to add data: ' . mysql_error();
    }

        
    
    if ($query) {
        
        // Show success and redirect.        
        header("Refresh: 2; url=index.php");
        echo 'Data added.';
        exit();
    }
}


?>


Op dit moment heb ik de script zo hier en daar aangepast. En hij werkt.
Ik zal er nog meer aan sleutelen en jullie feedback meenemen.
 
Obelix Idefix

Obelix Idefix

10/02/2012 19:18:52
Quote Anchor link
Je script zoals het er nu staat is niet correct.
Lees en verwerk de opmerkingen van SanThe.
 
- SanThe -

- SanThe -

10/02/2012 19:25:25
Quote Anchor link
Tolga Kavi op 10/02/2012 19:16:02:
Hoe zou ik IP kunnen beveiligen dan? Ook gewoon mysql_real_escape_string($var)??


Uiteraard.

Tolga Kavi op 10/02/2012 19:16:02:
Op dit moment heb ik de script zo hier en daar aangepast. En hij werkt.


Dat het werkt is zo te zien puur mazzel, want er zitten nog behoorlijk grove fouten in.

Haal ook alle $vars buiten de (php)quotes.
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.