Permalänk
Medlem

[PHP] Registrering + PunBB

Jag sitter och pillar med en registreringssida kopplad mot PunBB-databasen. Jag har krånglat fram lösningar för det mesta nu känns det som, men jag vet inte vilken kvalitet koden håller eller hur den kan förbättras. PHP är nytt för mig så tips som inte hör till just den här koden uppskattas också.

Det skulle vara kul att vakna upp och få se några svar i den här tråden som hjälper mig

Seriösa och konstruktiva svar uppskattas! Om det är av intresse kan jag ladda upp resten av koden som inte hör till just den här sidan men jag tycker det framgår ganska bra i namnen på funktionerna, etc. vad de gör.

Ursäkta om jag skriver lite luddigt eller tänker oklart.

<?php if (!session_id()) { session_start(); } require 'common.php'; htmlStart('TEST AREA'); // MYSQL CONNECTION $dbHost = "127.0.0.1"; $dbUsername = "root"; $dbPassword = ""; $dbDatabase = "testarea"; // CONNECT TO SERVER $dbConnection = mysql_connect($dbHost, $dbUsername, $dbPassword); if (!$dbConnection) { die('Could not connect: '.mysql_error()); } // SELECT DATABASE mysql_select_db($dbDatabase, $dbConnection); echo '<div id="content">'; // FIRST TIME OUTPUT (FIRST STEP) if (!$_GET['action'] && !$registrationFailed) { ?> <div class="window"> <h2>Skapa ett konto:</h2> <form method="post" action="?action=next"> <table class="registerInput"> <tr> <td><strong>Användarnamn</strong></td> <td><input type="text" name="username" size="20" tabindex="1" /></td> </tr><tr> <td><strong>Förnamn</strong></td> <td><input type="text" name="firstname" size="20" tabindex="2" /></td> </tr><tr> <td><strong>Efternamn</strong></td> <td><input type="text" name="surname" size="20" tabindex="3" /></td> </tr><tr> <td><strong>E-post</strong></td> <td><input type="text" name="email" size="20" tabindex="4" /></td> </tr><tr> <td><strong>Lösenord</strong></td> <td><input type="password" name="password" size="15" tabindex="5" /></td> </tr><tr> <td><strong>Upprepa lösenord</strong></td> <td><input type="password" name="password2" size="15" tabindex="6" /></td> </tr><tr> <td> </td><td><input type="submit" value="Nästa" tabindex="7" /></td> </tr> </table> </form> <?php } // PERFORM TESTS ON FORM DATA if ($_GET['action'] == 'next' && !$passed) { // GET FORM DATA $username = $_POST['username']; $firstname = ucfirst($_POST['firstname']); $surname = ucfirst($_POST['surname']); $email = strtolower($_POST['email']); $password = $_POST['password']; $password2 = $_POST['password2']; $_SESSION['username'] = $username; // VALIDATION function checkForm($username, $firstname, $surname, $email, $password, $password2) { echo "\n".'<div class="registerNotices">'."\n<ul class=\"window\">\n<strong>Följande fel uppstod:<br /></strong>\n"; // PERFORM THESE TESTS IF YOU PLAN TO USE THE SAME USER TABLE AS PUNBB if (!strcasecmp($username, 'Guest') || !strcasecmp($username, 'Gäst')) error('Användarnamnet får inte vara "Gäst" eller "Guest".'); if (preg_match('/[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/', $username)) error('Användarnamnet får inte vara en IP-adress.'); if ((strpos($username, '[') !== false || strpos($username, "]") !== false) && strpos($username, "'") !== false && strpos($username, "'") !== false) error('Användarnamnet innehåller otillåtna tecken.'); if ('funkar inte så bra här') error('Användarnamnet innehåller BBCode.'); $sqlUsername = mysql_real_escape_string($username); // CHECK IF USERNAME EXIST IN DATABASE $dbQuery = "SELECT * FROM forum_users WHERE username='".$sqlUsername."'"; $dbResult = mysql_query($dbQuery); // IF ROW IS FILLED THAN REPORT ERROR if (mysql_num_rows($dbResult) != 0) { error('Användarnamnet används redan.'); } // CHECK THAT NO STRING IS TOO LONG OR TOO SHORT function checkLength($var, $type, $min, $max) { global $passed; $short = 'et du angav är för kort.'; $long = 'et du angav är för långt.'; if (strlen($var) < $min) { error($type.$short); } elseif (strlen($var) > $max) { error($type.$long); } else { $passed = true; } } checkLength($username, 'Användarnamn', 2, 20); checkLength($firstname, 'Förnamn', 2, 20); checkLength($surname, 'Efternamn', 2, 20); checkLength($password, 'Lösenord', 4, 15); // CHECK THAT E-MAIL ADDRESS IS VALID function checkEmail($var) { global $passed; if (!ereg("^[_a-zA-Z0-9-]+(\.[_a-zA-Z0-9-]+)*@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*$", $var)) { error('E-postadressen du angav är ogiltig.'); } else { $passed = true; } } checkEmail($email); // CHECK THAT PASSWORDS MATCH function checkPassword($password, $password2) { global $passed; if ($password == $password2) { $passed = true; } else { error('Lösenorden du angav matchar inte.'); } } checkPassword($password, $password2); echo "\n</ul>\n</div>\n"; } checkform($username, $firstname, $surname, $email, $password, $password2); } // DO THIS IF FORM DOESN'T VALIDATE if ($registrationFailed == true) { ?> <div class="window"> <h2>Gör om, gör rätt:</h2> <form method="post" action="?action=next"> <table class="registerInput"> <tr> <td><strong>Användarnamn</strong></td> <td><input type="text" name="username" size="20" tabindex="1" value="<?php echo $username; ?>" /></td> </tr><tr> <td><strong>Förnamn</strong></td> <td><input type="text" name="firstname" size="20" tabindex="2" value="<?php echo $firstname; ?>" /></td> </tr><tr> <td><strong>Efternamn</strong></td> <td><input type="text" name="surname" size="20" tabindex="3" value="<?php echo $surname; ?>" /></td> </tr><tr> <td><strong>E-post</strong></td> <td><input type="text" name="email" size="20" tabindex="4" value="<?php echo $email; ?>" /></td> </tr><tr> <td><strong>Lösenord</strong></td> <td><input type="password" name="password" size="15" tabindex="5" /></td> </tr><tr> <td><strong>Upprepa lösenord</strong></td> <td><input type="password" name="password2" size="15" tabindex="6" /></td> </tr><tr> <td> </td><td><input type="submit" value="Försök igen" tabindex="7" /></td> </tr> </table> </form> <?php } // ONLY DO THIS IF FORM IS VALID (SECOND STEP) if ($_GET['action'] == 'next' && !$registrationFailed) { $authorized = true; echo '<div class="window"'; echo '<h2>Är uppgifterna rätt?</h2>'."\n"; echo '<p>'; echo 'Användarnamn: '.$username.'<br />'."\n"; echo 'Riktigt namn: '.$firstname." ".$surname.'<br />'."\n"; echo 'E-postadress: '.$email."<br />\n"; echo "\n".'</p>'."\n<br />\n"; ?> <strong><a href="?action=register">Ja, registrera mig nu!</a></strong><br/><br /> <a href="index.php">Nej, registrera mig inte.</a><br /> <?php } // REGISTER USER (FINAL STEP) if ($_GET['action'] == 'register' && $authorized && !$registrationFailed) { $now = time(); // ADD USER IN DATABASE $dbQueryAdd = "'INSERT INTO forum_users (username, group_id, password, email, email_setting, save_pass, timezone, language, style, registered, registration_ip, last_visit)" . " VALUES('".$username."', '4', '".sha1($password)."', '".$email."', '1', '1', '1', 'Swedish', 'Sulfur', '".$now."', '".get_remote_address()."', '".$now."'"; $dbAdd = mysql_query($dbQueryAdd) or error(mysql_error()); mysql_query($dbQueryAdd) or error(mysql_error($dbConnection)); } // ERRORS function error($message) { global $passed, $registrationFailed; $passed = false; $registrationFailed = true; echo "<li>\n"; echo $message."\n"; echo "</li>\n"; } echo '<br class="clear" />'; echo '</div>'."\n"; echo '</div>'."\n"; htmlEnd(); // CLOSE DATABASE CONNECTION mysql_close($dbConnection); ?>

Edit:

// Formaterar namnen // MAKE PROPER NAME function formatName($firstname) { $string = ucwords(ereg_replace("()-", "\\1 ", $firstname)); return (str_replace(" ", "-", $string)); } // Exempel $firstname = formatName('sven bertil'); // Sven-Bertil $surname = str_replace("-", " ", formatName('bergkvist-andersson')); // Bergkvist Andersson

Visa signatur

"'We're pro-life.' Eww, you look it! You look like you're filled with life."
UNIX man pages online, GNU/Linux-schemaprogram för LiU

Permalänk

Varför inte hacka register.php istället? Det gjorde jag.

$firstname = ucfirst($_POST['firstname']); $surname = ucfirst($_POST['surname']);

Vet inte exakt hur ucfirst fungerar, men vad händer om någon heter "Stenberg Lind" altså har två efternamn, inte något stort problem iofs.

if ('funkar inte så bra här') error('Användarnamnet innehåller BBCode.');

Antar at det är med flit, du kanske skulle kommentera bort koden istället?

Hmm, är det okej om jag snor(och anpassar) din kod lite närden är färdig? Då slipper jag patcha register.php igen för att lägga till fält för namn.

Visa signatur

Python-IRC på svenska: #python.se

Permalänk
Medlem

Jag har modifierat register.php tidigare men jag tycker det känns som att man får så dålig överblick över koden i slutändan

Jo, 'funkar inte så bra'-delen blev jag tvungen att lägga till för att det skulle se rätt ut här i forumet bara.

Det där med två efternamn måste lösas, det blir samma fel om man skriver in exempelvis britt-marie som förnamn. Ändrat, se första inlägget

Det är lugnt om du snor kod

Jag tror allt annat fungerar bra nu förutom att lägga in själva användaren i databasen, vet inte riktigt vad som är fel där men det ska jag nog kunna komma på själv nu när jag fått sova lite.

Visa signatur

"'We're pro-life.' Eww, you look it! You look like you're filled with life."
UNIX man pages online, GNU/Linux-schemaprogram för LiU

Permalänk
Hedersmedlem

Byt ut

$string = ucwords(ereg_replace("()-", "\\\\1 ", $firstname));

mot

$string = ucwords(preg_replace("/-/", " ", $firstname));

Snabbare...

EDIT: Eller vafan.

$string = ucwords(str_replace("-", " ", $firstname));

Samma sak.

Visa signatur

Vim
Kinesis Classic Contoured (svart), Svorak (A5)
Medlem i signaturgruppen Vimzealoter.

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av m0REc
Byt ut

$string = ucwords(ereg_replace("()-", "\\\\1 ", $firstname));

mot

$string = ucwords(preg_replace("/-/", " ", $firstname));

Snabbare...

EDIT: Eller vafan.

$string = ucwords(str_replace("-", " ", $firstname));

Samma sak.

Hehe, jag som planerat att försöka använda ereg och dess gelikar så mycket som möjligt får att få lite större erfarenhet av regular expressions

Visa signatur

"'We're pro-life.' Eww, you look it! You look like you're filled with life."
UNIX man pages online, GNU/Linux-schemaprogram för LiU

Permalänk
Hedersmedlem

Använd inte ereg. Använd preg_ isf, de är snabbare...

Men där man kan slippa undan utan kan man lika gärna strunta i det, det blir så otroligt segt och jobbigt för servern annars.

Visa signatur

Vim
Kinesis Classic Contoured (svart), Svorak (A5)
Medlem i signaturgruppen Vimzealoter.

Permalänk
Medlem

Din session_start() ligger inte på första raden (efter <?php) så det ska tekniskt sett inte fungera. Gör det de?

Visa signatur

Swec @ 2001 / Chalmerist - Javisst!
'Den som har flest prylar när han dör vinner!'

Permalänk
Medlem

Den klagar inte på nått. Det räcker väl med att session_start() inte körs efter att man skickat ut någon data till besökaren?

Visa signatur

"'We're pro-life.' Eww, you look it! You look like you're filled with life."
UNIX man pages online, GNU/Linux-schemaprogram för LiU

Permalänk
Hedersmedlem
Citat:

Ursprungligen inskrivet av Zapher
Din session_start() ligger inte på första raden (efter <?php) så det ska tekniskt sett inte fungera. Gör det de?

Ja, det fungerar.
Du har missuppfattat. Det är som med header(), sålänge den ligger innan output börjar skickas är det lungt.

Visa signatur

Vim
Kinesis Classic Contoured (svart), Svorak (A5)
Medlem i signaturgruppen Vimzealoter.

Permalänk
Medlem

Är jag helt borta? Jag hade för mig att man inte ens fick ha ett mellanslag innan. Vad är det jag tänker på?

Visa signatur

Swec @ 2001 / Chalmerist - Javisst!
'Den som har flest prylar när han dör vinner!'

Permalänk
Citat:

Ursprungligen inskrivet av Zapher
Är jag helt borta? Jag hade för mig att man inte ens fick ha ett mellanslag innan. Vad är det jag tänker på?

Du får inte ha några mellanslag innan <?php.

Permalänk
Hedersmedlem
Citat:

Ursprungligen inskrivet av sprucetwig
Du får inte ha några mellanslag innan <?php.

Återigen fel. Jag har kört både mellanslag och tabbar.

Annars skulle väl inte

<p><?php echo $var; ?></p>

fungera?

Visa signatur

Vim
Kinesis Classic Contoured (svart), Svorak (A5)
Medlem i signaturgruppen Vimzealoter.

Permalänk
Medlem

Nene, så kanske det var.

Visa signatur

Swec @ 2001 / Chalmerist - Javisst!
'Den som har flest prylar när han dör vinner!'

Permalänk
Citat:

Ursprungligen inskrivet av m0REc
Återigen fel.

Vad är rätt då?

Permalänk
Hedersmedlem
Citat:

Ursprungligen inskrivet av sprucetwig
Vad är rätt då?

Vet inte vad ni tänker på...

Inte stött på något sådant. Möjligen att ni blandar ihop det med output.
Eller det kanske kan vara rätt på ett sätt, så här:

<?php session_start(); ?>

(notera mellanslaget innan <?php...

Det blir ju output i HTML...

Visa signatur

Vim
Kinesis Classic Contoured (svart), Svorak (A5)
Medlem i signaturgruppen Vimzealoter.

Permalänk
Citat:

Ursprungligen inskrivet av m0REc
Vet inte vad ni tänker på...

Inte stött på något sådant. Möjligen att ni blandar ihop det med output.
Eller det kanske kan vara rätt på ett sätt, så här:

<?php session_start(); ?>

(notera mellanslaget innan <?php...

Det blir ju output i HTML...

Jag var nog väldigt otydlig, jag menade helt enkelt att man inte får ha någon output innan <?php om man ska köra en session_start(). Såg nu att du redan påpekat det.