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

CREATE TABLE Tagok (

  id INT AUTO_INCREMENT,
  felhasznalo VARCHAR(255) NOT NULL UNIQUE,
  jelszo VACHAR(50) NOT NULL,

  PRIMARY KEY (id)

);
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:

<?php
function reg($felhasznalonev,$jelszo) {
 $connection = mysql_connect('host','username','password');
 if (!$connection) {
  $return = 'Nem sikerült csatlakozni az adatbázishoz';
 } else {
  mysql_select_db('adatbazisom');
  $result = mysql_query("SELECT felhasznalo FROM tagok WHERE username='$felhasznalonev'");
  $rows = mysql_num_rows($result);
  if ($rows > 0) {
   $return = 'Már van ilyen néven felhasználó';
  } else {
   mysql_query("INSERT INTO tagok(id,felhasznalo,jelszo) values('','$username','password')");
   $return = 'Köszönjük, hogy regisztrált';
  }
 }
 return $return;
}
?>
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:
<?php
//Mezők ellenőrzése:
if ((!$_POST[felhasznalonev]) || (!$_POST[jelszo])) {
  echo "A regisztrációhoz mindkét mezőt ki kell töltened";
  exit;
}
//Megvizsgáljuk hogy ez a név szerepel-e az adatbázisban:
$vizsossz = mysql_connect("localhost", "robertm", "mullins");
mysql_select_db("forum",$vizsossz);
$vizssql = "SELECT felhasznalonev from tagok WHERE felhasznalonev='$_POST[felhasznalonev]'";
$eredmeny = mysql_query($vizssql,$vizsossz) or
die(mysql_error());
$sorok_szama = mysql_num_rows($eredmeny) or
die(mysql_error());
if ($sorok_szama == 1) {
  echo "$_POST[felhasznalonev] néven már van regisztrált felhasználó!";
  exit;
}
//Összeköttetés kiépítése:
$ossz = mysql_connect("localhost", "robertm", "mullins");
//Adatbázis kiválasztása:
mysql_select_db("forum",$ossz);
//SQL utasítás létrehozása:
$sql = "INSERT INTO tagok VALUES ('','$_POST[felhasznalonev]','$_POST[jelszo]')";
//SQL utasítás futtatása:
if (mysql_query($sql,$ossz)) {
  echo "A $_POST[felhasznalonev] nevet sikeresen regisztráltad.";
} else {
  echo "Hiba történt!";
}
?>
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'