Avatar billede far_mand Nybegynder
06. juni 2004 - 12:18 Der er 27 kommentarer og
1 løsning

Brugersystem hvor et navn kun kan bruges engang

Hejsa..

På mit brugersystem er der en bruger som hedder "admin", men jeg vil jo ikke have andre også opretter en bruger som hedder admin med fx. stort N!!
Så hvad skal jeg indsætte for at man kun kan oprette et brugernavn engang?? // Når jeg logger ind som admin, kan jeg fx. skrive det sådan: AdmIn, og så står bogstaverne sådan, jeg vil gerne have at det bare står som "admin" lige meget om man skriver med stort/småt!!!

Hjælp, håber i forstår det :)!
Avatar billede jakobclausen Nybegynder
06. juni 2004 - 12:23 #1
Der er to løsninger - du kan tjekke det med php eller lade din database tjekke det:

(1) Med php:
<?
# forbindelse til database
$result = mysql_query("SELECT * FROM tabel WHERE brugernavn='$_POST[brugernavn]'");
$count = mysql_num_rows($result)

if($count == 0)
{
    # opret brugernavn
}
else
{
    echo "Brugernavnet er optaget";
}
?>

NB! $_POST[brugernavn] - brugernavnet du vil se om der er oprettet

(2) Mysql:

Hvis du laver feltet med brugernavn UNIQUE, kan du køre en INSERT, og fejler den, så er det optaget.
Avatar billede dennismp Nybegynder
06. juni 2004 - 12:24 #2
// Lav til det lowercase.
$brugernavn = strtolower($brugernavn);

Du kan sætte en unique-constraint på din tabel(?) så vil du få en sql fejl hvis der oprettes en bruger med samme navn som en eksisterende.

Omvendt kan du også lave en select før du opretter, hvor du tjækker om navnet er i brug.
Avatar billede steines Nybegynder
06. juni 2004 - 12:35 #3
Går ud fra du bruger mysql, så en måde at gøre det på kunne være:

//her kalder du feltet fra formen
$navn = $_REQUEST['navn']

$conn = mysql_connect("localhost", "bruger", "password");
mysql_select_db("din_database");

$navn = strtolower($navn);

$resultat = mysql_query("select * from tblbruger WHERE navn='$navn'");

$maxcount = mysql_affected_rows();
if ($maxcount == 0)
{
    $sql = "INSERT INTO tblbruger (navn) VALUES ('$navn')";
    $resultat = mysql_query($sql,$conn);

    if (!$resultat)
        {
        die('Invalid query: ' . mysql_error());
    }
    else
    {
    ?>
      <H3>Bruger oprettet</H3>   
    <?php   
    }
}
else
{
?>
  <H3>Brugernavn allerede brugt</H3>
<?php   
}   

mysql_close($conn);

Dette forudsætter at du gemmer dine brugernavne som små bogstaver. Dette er dog ikke noget problem, da du kan bruge strtolower(brugernavn) på de brugernavne du vil gemme. Husk bare at når folk skal logge ind skal du også lave et strtolower() på deres login.

Håber det hjælper.
Avatar billede detox Nybegynder
06. juni 2004 - 12:50 #4
steines -> Dit forslag vil ikke virke, da: mysql_affected_rows() ikke virker på SELECT forespørgsler (kun INSERT, UPDATE og DELETE).
Avatar billede dennismp Nybegynder
06. juni 2004 - 12:55 #5
Jeg ville nok sparer lidt af mysqls arbejde og bruge:

$resultat = mysql_query("select count(*) from tblbruger WHERE navn='$navn'");
$maxcount = mysql_result($resultat,0,0);

istedet for at smide data væk på den måde .
Avatar billede jakobclausen Nybegynder
06. juni 2004 - 12:56 #6
Vil lige nævne det igen.

Det hele kan klares UDEN PHP - ved at sætte brugernavn-feltet til UNIQUE
Avatar billede detox Nybegynder
06. juni 2004 - 12:57 #7
if (mysql_result(mysql_query("select count(*) from tabel_navn where lower(bruger)='".strtolower($bruger)."'"),0) == 0) {
    // brugeren findes ikke
}
Avatar billede steines Nybegynder
06. juni 2004 - 12:57 #8
Det har du da ret i. Brug i stedet mysql_num_rows() den returnerer antallet af rækker i forspørgslen.

$maxcount = mysql_num_rows($resultat);
Avatar billede steines Nybegynder
06. juni 2004 - 12:59 #9
-> dennismp: Du sparer da ikke mysqls arbejde fordi du spørger på den måde. Der løber du da også alle poster igennem for at finde antallet af poster hvor navn = $navn, gør du ikke?!?
Avatar billede dennismp Nybegynder
06. juni 2004 - 13:00 #10
jakob: "Det hele"? Orv, hvordan får du valideret brugernavnet så det ikke indholder ulovlige tegn - og hvordan får du apache til at snakke med mysql, så vi ikke behøver php.. :o)
Avatar billede dennismp Nybegynder
06. juni 2004 - 13:03 #11
steines: Jo det gør. Om du tæller antal rækker der opfylder dine betingelse(r) eller om du skal finde returnere alt information på de rækker der opfylder det samme betingelser.

Det første kan den bruge index'es til.. det andet bliver den nød til at hive fat i hele rækken og giver ikke mysql samme mulighed for kun at gøre brug af indexes = ekstra arbejde.
Avatar billede steines Nybegynder
06. juni 2004 - 13:05 #12
Nåå ja ok... kunne selvfølgelig have valgt "select id from tabel where navn='$navn'" så returnerer den også kun et index.

My mistake. Godt set ;o)
Avatar billede steines Nybegynder
06. juni 2004 - 13:09 #13
Hvis jeg forstår jakob ret, så mener han at man kan bruge "navn" som unikt felt, og derved få mysql til at styre det. Problemet er, at fortælle brugeren at navnet er brugt når denne skriver fx. AdMiN hvis man ikke bruger php.... hvad siger du jakob?
Avatar billede dennismp Nybegynder
06. juni 2004 - 13:11 #14
Han kan vel bare bruge lcase/lower()..
Avatar billede steines Nybegynder
06. juni 2004 - 13:13 #15
Det var nu mere for at få jakob's forklaring på hans non-php html-kode
Avatar billede dennismp Nybegynder
06. juni 2004 - 13:16 #16
Jooh..

Hvis alle usernames er lowercase så er det vel intet problem i at

INSERT INTO users (navn, .. ) VALUES(lower('$name'), ...

Jeg kan ikke se/forstå problemet.
Avatar billede jakobclausen Nybegynder
06. juni 2004 - 13:16 #17
steines >> hvis du ved oprettelse af ny bruger, indtaster et navn der i forvejen er taget, vil der opstå en mysql fejl og man kan f.eks. ved en error udskrive at brugernavnet er optaget.
Vil lige pointere at dette kun er til at tjekke om navnet er taget - så helt at undgå php kan man ikke, men det kan mindskes.
Avatar billede steines Nybegynder
06. juni 2004 - 13:18 #18
jakob: Ok.. det var bare fordi du skrev at det kunne gøres uden php.

dennis: Jeg skrev i mit første indlæg at han skulle gemme sine brugernavne som små bogstaver "Dette forudsætter at du gemmer dine brugernavne som små bogstaver", så det har du ret i.
Avatar billede far_mand Nybegynder
12. juni 2004 - 10:21 #19
Undskyld, har ikke været her i lang tid..
Men har ikke alt for meget styr på det med PHP :)
HVor skal jeg indsætte det i siger henne?
Der hvor man opretter bruger / logger ind eller noger?
Er der nogle af php-koderne i vil se?
Avatar billede jakobclausen Nybegynder
12. juni 2004 - 10:36 #20
far_mand >> Hvis du bruger min løsning skal du gøre:

(1) Gå ind i din database og sætte "funktionen" UNIQUE på feltet med brugernavne
(2) bruge nedenstående metode, når du opretter et brugernavn:

INSERT INTO users (navn, .. ) VALUES(lower('$name'), ...

På denne måde skulle man ikke kunne oprette to brugernavne der er ens, uanset hvordan de skrives.
Avatar billede far_mand Nybegynder
12. juni 2004 - 14:42 #21
Jamen, dump'en til brugere ser sådan ud

CREATE TABLE minichat3 (
  id int(4) unsigned NOT NULL auto_increment,
  nick varchar(20) NOT NULL default '',
  pass varchar(20) NOT NULL default '',
  status int(1) NOT NULL default '1',
  onlinetid int(15) NOT NULL default '0',
  credits int(4) NOT NULL default '0',
  chatlines int(5) NOT NULL default '0',
  age char(2) NOT NULL default '',
  email varchar(40) NOT NULL default '',
  free_text longtext NOT NULL,
  PRIMARY KEY  (id,id)
) TYPE=MyISAM;

Skal jeg så bare lave en: INSERT INTO minichat3 (nick) VALUES(lover('$nick'),  ??

Og hvor skal jeg ændre det UNIQUE?
Avatar billede jakobclausen Nybegynder
12. juni 2004 - 14:55 #22
Du skal køre denne sql i din database - det vil sætte kolonnen "nick" til Unique:

ALTER TABLE `minichat3` ADD UNIQUE (`nick`)

Og bruger nedenstående sql til at oprette brugernavnene med.

INSERT INTO minichat3 (nick) VALUES(lower('$nick'));
Avatar billede jakobclausen Nybegynder
12. juni 2004 - 14:56 #23
Forklaring:
Ved at sætte Unique på din kolonne, kan man ikke oprette samme værdi to gange. Og i din sql bruger du lower(), til at lave det om til små bogstaver - så AdMiN = admin, og kan derfor ikke oprettes.
Avatar billede far_mand Nybegynder
13. juni 2004 - 08:20 #24
Den første virker med at man ikke kan oprette andre bruger med samme navn, men denne

INSERT INTO minichat3 (nick) VALUES(lower('$nick'));

Opretter bare en bruger med navn "$nick" :(
Avatar billede jakobclausen Nybegynder
13. juni 2004 - 08:57 #25
Prøv med:

"INSERT INTO minichat3 (nick) VALUES(lower('".$_POST['nick']."'))";

Du skal sørge for at feltet hvor brugeren indtaster det ønskede brugernavn hedder 'nick'
Avatar billede far_mand Nybegynder
17. juni 2004 - 14:24 #26
Altså jeg skal bare indsætte dette i minm mysql:
INSERT INTO minichat3 (nick) VALUES(lower('".$_POST['nick']."'))";

??

Og den php side hvor man opretter brugere hedder "new_user" - Men den hedder nick i sqlen..
Avatar billede jakobclausen Nybegynder
17. juni 2004 - 16:21 #27
Du skal bruge denne sql på den side, der skal oprette brugere i databasen:
INSERT INTO minichat3 (nick) VALUES(lower('".$_POST['nick']."'))";

$_POST['nick'] er navnet på det felter hvor brugeren taster det ønskede brugernavn - har du valgt at kalde den noget andet skifter du blot det ud med "nick"
Avatar billede far_mand Nybegynder
19. juni 2004 - 19:36 #28
<?
require("config.php");
require("funktioner.php");

if ($_POST[action] == "signup"){
    $nick = CheckNick($_POST[nick],"nick");
    $nick = format($_POST[nick]);
    $pass = CheckNick($_POST[pass],"password");
    $pass = htmlentities($_POST[pass]);
    $email = addslashes($_POST[email]);
    Signup($nick,$pass,$email);
}
else {
?>
<HTML>
<HEAD>
<link rel="stylesheet" type="text/css" HREF="style.css">
</HEAD>
<BODY>

<div align="center" class="alm-text">
  <h1>MiniChat 3</h1>
</div>
<div align="center" CLASS="normal"><a href="index.php">Index</a> | <a href="oversigt.php"><?=Language("59");?></a> | <a href="new_user.php"><?=Language("60");?></a> | <a href="forgot_pass.php"><?=Language("61");?></a> |<a href="toplist.php">Top20</a></div>
<table width="300" border="1" cellspacing="0" cellpadding="0" align="center" bordercolor="#000000" class="normal">
  <tr>
    <td bgcolor="#84B0DD" bordercolor="#84B0DD">
      <div align="center"><b><?=Language("68");?></b></div>
    </td>
  </tr>
  <tr>
    <td bgcolor="#eeeeee" bordercolor="#eeeeee"><?=Language("67");?>!</td>
  </tr>
</table>
<br>
<? if ($_GET[msg]){?>
<table width="300" border="1" cellspacing="0" cellpadding="0" align="center" bordercolor="#000000" class="normal">
  <tr>
    <td bgcolor="#84B0DD" colspan="2" bordercolor="#84B0DD">
      <div align="center"><b><?=Language("66");?>!</b></div>
    </td>
  </tr>
  <tr>
    <td bgcolor="#eeeeee" colspan="2" bordercolor="#eeeeee"><?=Language("65");?>! :)</td>
  </tr>
</table>
<?}
else {?>
<form action="new_user.php" method="post">
  <table width="300" border="1" cellspacing="0" cellpadding="0" align="center" bordercolor="#000000" class="normal">
    <tr bgcolor="#84B0DD">
      <td bordercolor="#84B0DD" colspan="2">
        <div align="center"><b><?=Language("69");?></b></div>
      </td>
    </tr>
    <tr>
      <td bgcolor="#eeeeee" bordercolor="#eeeeee" width="107"><b><?=Language("38");?></b></td>
      <td bordercolor="#eeeeee" bgcolor="#eeeeee" width="187">
        <input type="text" name="nick">
      </td>
    </tr>
    <tr>
      <td bgcolor="#eeeeee" bordercolor="#eeeeee" width="107"><b><?=Language("62");?></b></td>
      <td bordercolor="#eeeeee" bgcolor="#eeeeee" width="187">
        <input type="password" name="pass">
      </td>
    </tr>
    <tr>
      <td bgcolor="#eeeeee" bordercolor="#eeeeee" width="107"><b><?=Language("63");?></b></td>
      <td bordercolor="#eeeeee" bgcolor="#eeeeee" width="187">
        <input type="text" name="email">
      </td>
    </tr>
    <tr bgcolor="#84B0DD" bordercolor="#84B0DD">
      <td>&nbsp;</td>
      <td>
        <input type="hidden" name="action" value="signup">
        <input type="submit" value="<?=Language("64");?>!">
      </td>
    </tr>
  </table>
</form>
<? } ?>
</BODY>
</HTML>
<? } ?>

Men hvor skal jeg indsætte dette:
INSERT INTO minichat3 (nick) VALUES(lower('".$_POST['nick']."'))";

??
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