Register script werkt niet.
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
Tussen [code] en [/code] kan je jouw relevante code plaatsen.
Code (php)
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
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");
}
}
?>
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:
Kijk je SQL even goed na, krijg je errors?
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.}
Code (php)
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)
1
2
3
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.')';
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)
1
2
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)
1
2
2
echo 'Success! Data has been stored into our database!';
header("Refresh: 2, url=index.php");
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
Code (php)
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
Dit:
Code (php)
1
2
3
2
3
<?php
$checksql = 'SELECT * FROM users WHERE Username = '.$userdata.' AND Email = '.$email.' AND IP = '.$IP.'';
?>
$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):
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.
Code (php)
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
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");
}
}
?>
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?
Hou je variabelen eens buiten de SQL en gebruik haakjes om strings.
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.
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 - 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.
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)
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
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();
}
}
?>
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.
Lees en verwerk de opmerkingen van SanThe.
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.