ugrás a tartalomhoz

SQL mezőtulajdonságok nevei és használatuk

Robertm · 2005. Dec. 25. (V), 23.20
Üdv!
A kérdésem a következő lenne:Szeretnék a MySql parancssori felületén keresztül táblákat létrehozni.Sajnos a mezőtulajdonságokat ismerem, de alkalmazni nem tudom mert a pontos parancsokat nem ismerem.
Konkrét problémám:Szeretnék egy tag-nyilvántartó adattáblát:
id (ezt szeretném auto_increment tulajdonságúra állítani)
felhasznalonev (nem lehet azonos, talán unique parancs)
jelszo(text)

Sajnos a Mysql mindig hibát dob ki...
Ha esetleg valamilyen segédletet kaphatnék...(Magyarul!)
Vagy a pontos szintaktikát, megköszönném.
 
1

Nem konkrét válasz

krey · 2005. Dec. 25. (V), 23.36
Sajnos a mysql-hez kuka vagyok, de annyi biztos, hogy néhány elvi hiba is akad abban amit tervezel. Azt, hogy ne lehessen 2 ugyanolyan felhasználónév, azt az adatbázist módosító scriptben (pl.: php) ajánlott megoldani. Egészegyszerűen SELECT-tel ellenőrzöd, hogy van-e már ilyen érték az adatbázisban, a felhasznalonev "oszlopban".
A másik pedig az, hogy a jelszavakat nem érdemes szövegként tárolni, lehetőség szerint alkalmazz valamilyen "vissza-nem-fordítható" kódolást rajta, ha érted mire gondolok.
Amúgy, ha konkrét segítséget szeretnél érdemes beírni a mysql hibát, hátha csak valami szintaktikai hibát vétettél...

krey
2

hash érték mint "kódolás"

Robertm · 2005. Dec. 25. (V), 23.41
Köszönöm krey, valamennyit segítettél.Olvastam a hash érték bevezetését a "vissza nem fordítható" kódolással kapcsolatban.
Szintaktikai hibára nem gyanakszom mert könyvből próbálok okoskodni :)
6

Miért is?

Bártházi András · 2005. Dec. 26. (H), 13.19
Miért gondolod, hogy egy SELECT-es ellenőrzés jó megoldás az egyező felhasználónevek vizsgálatára? Mi történik, ha lekérdezed, nincs, közben valaki más beszúr, és te is beszúrsz ugyanazzal a felhasználónévvel?

-boogie-
7

Hááát

krey · 2005. Dec. 26. (H), 14.25
Nem igazán számítok egynél több írás/olvasásra egyszerre. Egyébként teljesen igazad van, kissé figyelmetlen voltam.

krey
12

Akkor hogyan?

Anonymous · 2005. Dec. 26. (H), 23.05
Akkor mi a helyes út, annak a kivédésére, hogy ne regisztrálhassanak többen ugyanazzal a névvel?
3

A kód

Török Gábor · 2005. Dec. 26. (H), 10.28
  1. CREATE TABLE Tagok (  
  2.   
  3.   id INT AUTO_INCREMENT,  
  4.   felhasznalo VARCHAR(255) NOT NULL UNIQUE,  
  5.   jelszo VACHAR(50) NOT NULL,  
  6.   
  7.   PRIMARY KEY (id)  
  8.   
  9. );  
Annyival kiegészíteném, hogy ebben az esetben nem feltétlen szükséges egy ID bevezetése, ha amúgyis a felhasználónév egyértelműen meghatároz egy sort. Jelszónak pedig butaság volna a TEXT típus, bőven elegendő a VARCHAR(255), nem hiszem, hogy valaki ennél hosszabb jelszóval dolgozna. (Sőt, még ezt is túl lazának érzem.) Ha a jelszót hashelt formában tárolod (javasolt), akkor pedig a megvalósítástól függően állítsd be fix hosszúságúra a CHAR mezővel.

Segédletként pedig böngészd a hivatalos dokumentációt, tudom, hogy nem magyar, mégis ezt ajánlom.
4

Köszönet!

Robertm · 2005. Dec. 26. (H), 12.27
Köszönöm kedves Török Gábor! Nagyon sokat segítettél mind a kóddal mind pedig az ötleteiddel.Újabb kérdésem:krey tanácsára nem birizgáltam a felhasznalonev mezőt,hanem az űrlaphoz tartozó php motort kezdtem olyan formában hegeszteni,hogy: csináltam egy SELECT lekérdezést a scriptem elején amiben vizsgáltam hogy létezik-e ebben az oszlopban ilyen bejegyzés.Krey alapgondolata kiváló (szerintem) de sajnos jégre szaladtam mert nem látom át teljesen hogyan lehetne ezt vizsgálni majd az 'IF' függvénnyel reagálni rá...Létezik a php utasításkészletében egy 'mysql_string' vizsgáló függvény-féleség??? És ha igen akkor hogyan kell deklarálni??
5

Hm....

krey · 2005. Dec. 26. (H), 13.06
Na most, amennyire én tudom, az if inkább vezérlő függvény, sőt akármi de nem függvény.
De megmutatom mire gondoltam:
  1. <?php  
  2. function reg($felhasznalonev,$jelszo) {  
  3.  $connection = mysql_connect('host','username','password');  
  4.  if (!$connection) {  
  5.   $return = 'Nem sikerült csatlakozni az adatbázishoz';  
  6.  } else {  
  7.   mysql_select_db('adatbazisom');  
  8.   $result = mysql_query("SELECT felhasznalo FROM tagok WHERE username='$felhasznalonev'");  
  9.   $rows = mysql_num_rows($result);  
  10.   if ($rows > 0) {  
  11.    $return = 'Már van ilyen néven felhasználó';  
  12.   } else {  
  13.    mysql_query("INSERT INTO tagok(id,felhasznalo,jelszo) values('','$username','password')");  
  14.    $return = 'Köszönjük, hogy regisztrált';  
  15.   }  
  16.  }  
  17.  return $return;  
  18. }  
  19. ?>  
Egyébként ez a kód nem szentírás, szóval lehetnek benne hibák, szóval inkább a gondolatmenetet nézd meg és írd meg a saját verziódat!
(Egyébként ezt a megoldást felejtheted is el, Bártházi András most cáfolt rá a gondolatmenetem helyességére)
8

Más....

Robertm · 2005. Dec. 26. (H), 14.32
Én így írtam meg a szkriptemet, és most FÉLIG működik ha benn van egy olyan név amit fel szeretnék venni, akkorsikerül kiugrani a scriptből egy üzenettel.
A NAGY gondom az, hogy Új nevet egyáltalán nem tudok felvenni mert ebben az esetben a script fuása mindenféle hibaüzenet nélkül megszakad :((((
Voila:
  1. <?php  
  2. //Mezők ellenőrzése:  
  3. if ((!$_POST[felhasznalonev]) || (!$_POST[jelszo])) {  
  4.   echo "A regisztrációhoz mindkét mezőt ki kell töltened";  
  5.   exit;  
  6. }  
  7. //Megvizsgáljuk hogy ez a név szerepel-e az adatbázisban:  
  8. $vizsossz = mysql_connect("localhost""robertm""mullins");  
  9. mysql_select_db("forum",$vizsossz);  
  10. $vizssql = "SELECT felhasznalonev from tagok WHERE felhasznalonev='$_POST[felhasznalonev]'";  
  11. $eredmeny = mysql_query($vizssql,$vizsosszor  
  12. die(mysql_error());  
  13. $sorok_szama = mysql_num_rows($eredmenyor  
  14. die(mysql_error());  
  15. if ($sorok_szama == 1) {  
  16.   echo "$_POST[felhasznalonev] néven már van regisztrált felhasználó!";  
  17.   exit;  
  18. }  
  19. //Összeköttetés kiépítése:  
  20. $ossz = mysql_connect("localhost""robertm""mullins");  
  21. //Adatbázis kiválasztása:  
  22. mysql_select_db("forum",$ossz);  
  23. //SQL utasítás létrehozása:  
  24. $sql = "INSERT INTO tagok VALUES ('','$_POST[felhasznalonev]','$_POST[jelszo]')";  
  25. //SQL utasítás futtatása:  
  26. if (mysql_query($sql,$ossz)) {  
  27.   echo "A $_POST[felhasznalonev] nevet sikeresen regisztráltad.";  
  28. else {  
  29.   echo "Hiba történt!";  
  30. }  
  31. ?>  
9

Emberi butaság avagy köszi a jelszót

krey · 2005. Dec. 26. (H), 21.29
Először is szeretném megköszönni az összes rosszindulatú ember nevében, hogy közzétetted a jelszavad (remélem, hogy valamelyik admin cenzúrázza majd).
Másodszor: a kód több részen is hibás, csodálom, hogy egyáltalán működik.
Most nem fogom felsorolni az összes hibát, de szerintem érdemes lenne elolvasnod néhány leírást alaposabban.
A legalabvetőbb, hogy a $_POST asszociatív tömb elemeit sztringekkel lehet elérni. Tehát
Nem $_POST[valtozo], hanem $_POST['valtozo'].
Másrészt csúnya dolog a die, főleg ha a mysql hibát íratod ki vele...
A felhasználók nem szokták értékelni.
Én azt javaslom, hogy nézz át néhány ingyenes auth scriptet (http://www.google.com) és aztán készítsd el a sajátodat.

krey
10

Butaság a butaság? :)

Robertm · 2005. Dec. 26. (H), 22.14
krey, csak nem komolyan gondolod hogy egy példában számítanak a jelszavak?:)
Ez a kód amit itt látsz egy béta verzió alfa előzetese :)
A die(()) pedig a saját tájékoztatásomra való.
A kód pedig nem hibás több részen, mert működött ameddig az első SQL lekérdezést
nem tettem bele.
A $_POST[valtozo] vagy a $_POST['valtozo'] jelen esetben funkcionalitásában teljesen mindegy, ha pedig úgy érzed nem kívánod a hibáimat felsorolni, akkor feleslegesen ütötted be azt az X karaktert, mert nem kívánok auth scriptekkel keresztrejtvényesdit játszani,hanem konkrét segítséget várok.
13

Bocsi

krey · 2005. Dec. 26. (H), 23.34
Aranyos, hogy kitaláltál különjelszót a weblabornak:)
Bocsánatot kérek, csak rossz tapasztalatokból mondhatom, hogy vannak emberek akik ezt megteszik (nem feltétlen jelszóval, a legutóbb IP-vel láttam)
Egyébként a dolog amit az asszociatív tömbös cuccról írtam hülyeségnek bizonyult. Talán ezért szeretem a php-t. Ez a legengedékenyebb nyelv, amit valaha használtam. Tényleg bocsi, csak ahhoz vagyok szokva, hogy még a változó típusokat is nekem kell átalakítanom (pl.: C#).
Egyébként még annyit, hogy érdemes "keresztrejtvényesdit" játszani, én például nem egy "szép" megoldást tanultam így.
15

<Nincs cím>

Anonymous · 2005. Dec. 27. (K), 00.40
Nagyon nem mindegy hogy $_POST['valtozo'] vagy $_POST[valtozo]. Az mas kerdes hogy a "php okosabb mint te" :)
Szvsz ha ez annyira prealfa kod, akkor hasznalod az error_reporting (E_ALL) -t is. Es meglepo modon akkor latnod (latnad?) miertis mondasz butasagot :)
Mindettol fuggetlenul szemetseg beledkotnom mert alapvetoen a segitseged megfelelo a kerdezonek. Igazabol csak az zavart hogy csori kreyt meggyozted hogy o a hulye :) Megyek hamutszorni a fejemre :)
11

Manual, debug

attlad · 2005. Dec. 26. (H), 22.50
Átnézedő részek a kézikönyvbe:

Miért nem jó az $ize[bigyo] forma?
http://hu.php.net/manual/hu/language.types.array.php#language.types.array.ize-bigyo

Stringek - Egyszerű szintaxis
http://hu.php.net/manual/hu/language.types.string.php#language.types.string.parsing.simple

Írasd ki az SQL utasításaidat egy echo-val.
14

<Nincs cím>

Anonymous · 2005. Dec. 27. (K), 00.20
Jelen esetben kulonosebben nem szamit, de hibas a selectnel hasznalt gondolkodasmod. Ugyanis elofordulhatna (itt nem, de sztem nem szabad rossz gondolatmenetet rogziteni), hogy feleslegesen nagy adatforgalmat generalsz.
A select helyes(ebb)en:
SELECT COUNT(*) AS Cnt FROM tagok WHERE username='akarmi'