Šta je novo?

PHP/MySQL pitanje.

Popokatepetl

Čuven
Učlanjen(a)
10.12.2002
Poruke
31
Poena
604
Ovako, imam sajt kome ce se moci pristupati iskljucivo uz korisnicko ime i lozniku. Svaki clan mora popuniti pristupnicu kojom obezbjedjuje sljedece podatke:

http://user0403.else-hosting.net/adresar/prijavnica.htm

Tu ima nekih 7 stavki i sve su obavezne.

Kasnije, korisnik moze da pozeli da se upise u nas adresar.
Adresar mozete pogledati ovdje:

http://user0403.else-hosting.net/adresar/adresar.htm

Kao sto vidite, pristupnica i adresar sadrza 6 zajednickih polja koja su kod obe forme obavezna, i plus neka dodatna za adresar koja nisu obavezna.

Ja bih sada htjela da user ne bi ponovo ispisivao i slao u bazu iste podatke on vec dobije popunjeno tih prvih 6 polja.
Posto je ionako logovan na stranicu sa korisnickim imenom, ima svoj ID i zna se o kom je korisniku rijec. Ovim takodje sprijecavam da neko da drugom licu sifru, pa da se drugo lice dodje upisati u adresar sa svojim podacima.

E sad, ovo ne zelim napravit kao hidden polja, jednostavno zbog toga jer hocu da korisnik vidi koje je podatke upisao pri regstraciji i da mu se stavi do znanja da ce ti podaci pritiskom na dugme upisi me u adresar postati dostupni i drugim clanovima. Zato sam napravila ta polja kao read only. Mozda ne moraju cak niti biti polja, moze obicna tabela, ali mi je ovako prakticnije.

Ono sto me zanima jeste kako iz baze da selektujem vrijednosti za value u tim poljima i kako da se ispisu. Umjesto ovoga npr ime Petar (nekom ce stajati Sasa, nekom Milica itd)

Mislim cak da nema potreba da u adresar.php skriptu definisem ta polja i saljem ih u bazu, jer su vec jednom poslana (pri registraciji) i nema potrebe da se dva puta insertuju. Samo ce se bazi pridodati ove cetiri stavke ICQ, MSN, Yahoo, interesovanja ako su naravno ispunjene.

Moja originalna baza za registraciju je glasila:

CREATE TABLE users (
userid SMALLINT NOT NULL AUTO_INCREMENT,
prezime VARCHAR(25) NOT NULL DEFAULT '',
ime VARCHAR(25) NOT NULL DEFAULT '',
godiste SMALLINT NOT NULL DEFAULT '',
grad VARCHAR(50) NOT NULL DEFAULT '',
zemlja CHAR(2) NOT NULL DEFAULT '',
email_address VARCHAR(50) NOT NULL DEFAULT '',
username VARCHAR(25) NOT NULL DEFAULT '',
password VARCHAR(255) NOT NULL DEFAULT '',
user_level enum('0','1','2','3') NOT NULL DEFAULT '0',
signup_date DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
last_login DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
activated enum('0','1') NOT NULL DEFAULT '0',
PRIMARY KEY (userid)
) TYPE=MyISAM COMMENT='Membership Information';

Ona ne sadrzi ta dodatna polja iz adresara. Zanima me sta je bolje.

Da napravim novu tabelu za ove cetiri stavke ICQ, MSN, Yahoo, interesovanja, pa povezem adresar tabelu sa registracija tabelom putem ID usera – PRIMAR KEY
ili, a nisam sigurna da to moze, dodam odmah u startu ovoj takva cetiri polja mada znam da se ona nece popunjavati pri registraciji.

Moze li neko na osnovu prilozenog da mi predlozi neko rjesenje.
Kako da organizujem bazu?

Pretpostavljam da mi jos treba u formi za adresar kao hidden polje userID koje ce se slati bazi da identifikuje usera.

Znaci pitanja su kako pozivam za value vrednost iz baze za odrenjenog usera ovih prvih 6 polja (nekako preko selecta) i kako je najpamentije da organizujem bazu, uzimajuci u obzir da ove dvije stavke (adresar i pristupnica/registracija) dijele neka polja i podatke.


P.S. kao sto vidite iz prakticnih razloga value za zamlju su njihove dvokodne oznake:
zemlja CHAR(2) NOT NULL DEFAULT '',
npr:
<OPTION value="YU">Serbia and Montenegro</OPTION>

Pretpostavljam znaci da mi nece moci vratiti za zemlju bas Serbia and Montenegro vec samo YU ili se to bez mnogo komplikacija moze ispraviti nekako da imam puni naziv?
 
Ovo mi je recimo vrlo bitno. Taj dinamicki value ako je to ikako moguce, jer ce mi biti potrebno jos na par mjesta, recimo kod e-mail forme, pa da u polje ime i email vec budu upisani podaci korinsikovi, a on samo popuni prostor za poruku.

Vjerovanto bi se ovo moglo rijesiti i pomocu kukija, ali ne znam ni to da izvedem :(
 
u tabelu users unesi i atribute za icq, msn i sl i onda kada ubacujes novog korisnika njih opstavi na neku vrednost. lepo si pretpostavila da ces podatke uzimati iz baze preko select naredbe. znaci bice:
select *
from users
where userId = $userid
 
Hvala, to sam rijesila, medjutim imam jos jedno pitanje.

Koristila sam ovaj upit da mi prebroji clanove:

SELECT COUNT(userid) FROM users;

i to je ok, izbaci mi broj clanova. Medjutim ja hocu da izbrojim samo one clanove koji su aktivirali svoj nalog:

activated enum('0','1') NOT NULL DEFAULT '0',

Trenutno ima 7 clanova, od kojih jedan nije aktivirao nalog. Znaci treba da izbaci 6.
Ako dodam WHERE activated = 1 kao uslov, izbaci mi jednog umjesto 6 clanova.
Ako dodam WHERE activated > 0 kao uslov, izbaci mi 7 umjesto 6 clanova.

Takodje kako treba da izgleda PHP script koji bi mi odstampao tu vrijednost na nekoj strani.

Imala bih <? include("broj_clanova.php"); ?>

Sta da pisem u broj_clanova.php?
 
Poslednja izmena:
Probaj ovako:

SELECT COUNT(userid) from users WHERE activated!=0
 
Opet izbacuje 7. a jedan korisnik nije aktivirao clanstvo, znaci ima ih sest. Sad je malo upisa pa mogu da vidim stanje, ali kasnije...
Hm, ne znam u cemu je problem. Imal li neke veze to sto je jedan user obrisan pa kljucevi idu ovako:
1 2 3 4 5 6 8
Zato i koristim COUNT a ne MAX funkciju i fino mi izbaci 7, tj ukupan broj upisa, ali nece da prihvati ovaj uslov.

I jos, kako bi isao taj skript.
Nesto ovako, samo u necem gresim.

<?
$db = @mysql_connect(localhost, user442, *******);
@mysql_select_db(user442, $db);

$sql = SELECT COUNT(userid) FROM users;
@mysql_query($sql);

echo $sql;
?>

I dobijam poruku: Parse error: parse error, unespected T_STRING in srv/user442/members.php on line 5.
 
imas gomilu nacina, sa ili bez COUNT, evo ti dva gotova + jedan u teoriji, pa ti probaj - naravno, podesi sve promenljive (za konektovanje na bazu, sredi imena tabela, atributa i ostalo, ovo je sve sa mojim nazivima)

ovo je bez COUNT-a, znaci selektujes sve pa izbrojis

Kod:
<?php
$broj = 0; //ovde smestas broj aktiviranih korisnika, znaci obican brojac
$conn=mysql_connect("localhost", "root", "ke0ps"); //menjaj

$kveri= "SELECT `id` FROM `stats` WHERE `id` > 0"; //menjaj atribute
if (!$conn) die ("Ne mogu da se povezem sa bazom."); //opciono
mysql_select_db("stats",$conn) or die ("Ne mogu da otvorim bazu.");  //promeni ime tabele
$qw=mysql_query($kveri) or die('Greska u kveriju.'); 

while($rowsearch = mysql_fetch_array($qw)) $broj++; //sa svakim pronadjenim rekordom, povecavas promenljivu za 1

echo("Broj korisnika: $broj");
 
mysql_close();        
?>
a evo ti i sa COUNTom:

Kod:
<?php
$conn=mysql_connect("localhost", "root", "ke0ps"); //menjaj
mysql_select_db("stats",$conn) or die ("Ne mogu da otvorim bazu."); 
$kveri= "SELECT COUNT(*) FROM `stats` WHERE `id` > 0"; 
$rezultat = mysql_query($kveri); 
$broj = mysql_result($rezultat,0,0); 
echo("Broj korisnika: $broj");
mysql_close();        

?>
treci nacin je da referenciras COUNT kao virtuelni atribut, ono SELECT COUNT(*) AS broj FROM `stats` WHERE `id` > 0 pa da izbacis broj, tj da ga fetchujesh - mozes da probas sva tri nacina, pa da izmeris koji se najbrze izvrsava i da koristis njega - svi provereno rade.

Rezultat nema veze sa kljucem, mozes da imas i 33 55 676 777, on ce da ti vrati 4 rekorda, samo pazi sta ti je restrikcija (while), naravno.

to sto ti kazes nema nikakvog smisla - ako imas 7 clanova, i oni za atribut `activated` imaju jedinice, osim jednog koji ima nulu, WHERE `activated` > 0 MORA da ti vrati 6 clanova, ako ti vraca 7 kao sto kazes, onda svi imaju jedinicu i kraj price - kveri ti je okej, ali ti verovatno rekordi ne valjaju, proveri ti sadrzaj te baze, a mozda i skriptu koja upisuje u atribut `activated`, moguce da ti tu nesto ne sljaka.

pozdrav!
 
imas gomilu nacina za ovime... ja to radim obicno ovako

Function Countid() {
$sql = "Select Count(*) as abc from users";
$result = @mysql_query($sql) ;
$fields = @mysql_fetch_array($result);
return $fields["abc"];
}
to je princip :)... doduse najlakse je otvoris tabelu iz mysql control centera i on ti sam prebroji :)

imam samo jedno pitanje za keopsa... vidim da ovde koristis mysql_close();
da li je to neohodno i sta se desava ako je ne zatvaras... u principu na svkoj strani ti pises mysql_connect()
 
E, hvala problem je rijesen, a sto se ticalo uslova activated = 1 , ovo 1 je trebalo staviti pod jednostuke navodnike, a sam upit pod dvostruke.
Znaci "SELECT COUNT (userid) FROM users WHERE activated = '1'"
Onda vrati bas ono sto je trebalo.
 
@Popokatepetl: upravo tako, sorry, trebalo je da bolje pogledam strukturu tvoje baze -enum daje objekte tipa string, koji se moraju staviti pod jednostruke navodnike ako hoces da ih pozivas direktno preko vrednosti - postoji i varijanta preko indexa, koju si ti nesvesno koristila kada si rekla where activated = 0, sto je isto kao da mu trazis where activated is null jer je index za null vrednosti u enumeraciji nula, u tvom konkretnom slucaju postoji jos i index za '0' koji je jedinica i index za '1' - dvojka (tako ide sa indexima, kao u nizu, s tim sto je prva vrednost za index [0] rezervisana za invalid tj. kod tebe NULL unos) sto daje upravo ono sto si ti rekla, ako jedan ima nulu, a sestorica jedinicu, > 0 ce izbaciti svih 7, a =1 ce traziti samo one sa nulom, tj. izbacice jednog baju. nebitno, ali nije lose znati i tu varijantu, ako imas malo kompleksniji enum mozes lako da primenis indexiranje.

@Predsednik: da, to je treci nacin koji sam pomenuo i koji ljudi najcesce koriste... iskreno, nisam merio brzinu izvrsavanja ovih kverija, vrlo je moguce da bi se to najbrze izvrsilo, ali dobro, kome treba i kome je stalo do brzine izvrsavanja, moz' lako da izmeri. mysql_close(); je bespotrebna stvar, ja je uglavnom stavljam iz navike, ali prakticno moze da se posmatra kao suvisan deo koda jer ce PHP automatski zatvoriti konekciju kada dodje do kraja izvrsavanja skripe, osim u slucaju kada je u pitanju stalna (persistant) konekcija ostvarena sa pconnect. znaci ne treba ti, osim ako imas nekoliko konekcija, pa kao eto, stedis resurse zatvarajuci one koji ti postanu nepotrebni :)

pozdrav!
 
Nazad
Vrh Dno