Špatně položený dotaz do databáze?

Vývojová prostředí, aplikace, skripty, http://www... síťové programy, internet, sdílení...
Odpovědět
Balin.Tomas
Nováček
Nováček
Registrován: 28. kvě 2009

Špatně položený dotaz do databáze?

Příspěvek od Balin.Tomas »

Prosím o pomoc, mám vytvořenou funkci

Kód: Vybrat vše

function emailpocet ()
{
  if (!isset($_SESSION['tarif']) and ($_SESSION['uzivatel']))return false;
  $vysledek=mysql_query("select tarif_id from tarif where tarif_id='".$_SESSION['tarif']."' and email_pocet<=(SELECT SQL_CALC_FOUND_ROWS COUNT uzivatel_id from email where uzivatel_id='".$_SESSION['uzivatel']."')");
  if(mysql_num_rows($vysledek) == 1 ) return true;
else return false;
}
kterou používám zde

Kód: Vybrat vše

if(isset($_POST['pridat_email'])){
    $email_t=trim($_POST['email_t']);
    if (!muzepridatemail ()) {$bl="administrace-email&Alert=12"; 
					header("location: $bl");   
          }elseif (!emailpocet ()) {$bl="administrace-email&Alert=15"; 
					header("location: $bl");  
    }else{ 
            if (!JeEmail($_POST["email_t"])) {
          $bl="administrace-email&Alert=6"; 
					header("location: $bl");
          }elseif (kontrolaemail($_POST['email_t'])) {
          $bl="administrace-email&Alert=2"; 
					header("location: $bl");
          }else{
          $VlozData=mysql_query("INSERT INTO email (uzivatel_id,email_t) VALUES ('".$_SESSION['uzivatel']."', '".$_POST['email_t']."')") or die (mysql_error());   
          $bl="administrace-email&Alert=4"; 
					header("location: $bl"); 
          }    
    }
Mělo by to fungovat takto Dvě tabulky: TARIF se sloupci "tarif_id" a "email_pocet" a druhá tabulka EMAIL "uzivatel_id" a "email".
V Tabulce tarif je kolik emailu se muze u příslušného tarifu přidat.Když chce uživatel přidat email, zkontroluje se v tabulce tarif -$_SESSION['tarif'] kolik emailu může mít, podle toho se zkontroluje v tabulce email kolik jich uživatel - $_SESSION['uzivatel'] má a podle toho mu dovolí nebo nedovolí přidat email.
Problém je že to nefunguje.Chyba se žádná neukazuje a email přidává stále.
Děkuji za každou radu
arxeiss
Začátečník
Začátečník
Uživatelský avatar
Registrován: 19. črc 2008
Bydliště: Krmelín (předměstí Ostravy)
Kontaktovat uživatele:

Re: Špatně položený dotaz do databáze?

Příspěvek od arxeiss »

Nevím, ale jsem někde četl, že jelikož to potom doplňuješ příkazem WHERE tak SQL_CALC_FOUND_ROWS COUNT je ti tam nanic protože on počítá stejně všechno, není jednodušší použít COUNT() ? Pokud se pletu tak mě opravte.

Edit:\\ Už vím kde je chyba, teda docela se v tom motám, ale ty z té DB vytahuješ tarif_id a pokud se nemýlím tak v té tabulce budeš mít dycky pouze jedenkrát ten tarif_id, protože u něho je číslo kolik mailu může mít, a pak to dycky vrací TRUE :wink:
Teď jsem přišel na další chybu u toho strašného SQL příkazu který vidím poprvé, se nepoužívá na konci to COUNT je možné že tím to vrátí dycky méně než máš ten email_pocet Mé vědomosti na SQL moc nesahají, to beru jen tak okrajově k čemu to používám, tak nemůžu říct, proč to nikdy nekrachne na tom logickém součinu AND

Edit2:\\ Tak ten tvůj příkaz SQL_CALC_FOUND_ROWS počítá všechno i podle WHERE ale ignoruje LIMIT.
PC : CPU: C2D E5200 2500Mhz @ 3750Mhz a AC Freezer 7PRO MB: Gigabyte GA-P31-DS3L rev.2,1 GPU: ATI Radeon 3650HD 256MB RAM: A-Data Vitesta 2x2GB Zdroj: Forton OEM 400W HDD: Samsung F2 500GB
Netbook : Asus EEE CPU: Intel Atom N270 1,6GHz RAM: A-Data 2GB HDD: 250GB 5400ot/min
Balin.Tomas
Nováček
Nováček
Registrován: 28. kvě 2009

Re: Špatně položený dotaz do databáze?

Příspěvek od Balin.Tomas »

Zeptám se na toto, kdybych počet emailu v tarifu měl v session a uživatelovi emaily počítal pomocí COUNT, jak by potom mělo vypadat php?
Vím jak zapsat vytažení z databáze,session, ale jak to porovnat?
DĚKUJI
arxeiss
Začátečník
Začátečník
Uživatelský avatar
Registrován: 19. črc 2008
Bydliště: Krmelín (předměstí Ostravy)
Kontaktovat uživatele:

Re: Špatně položený dotaz do databáze?

Příspěvek od arxeiss »

A proč by jsi to dával do session? Nejsem si 100% jistý ale zkus použít toto, pokud ti to nepojede tak napiš.

Kód: Vybrat vše

$dotaz = "SELECT COUNT(*) FROM `email` WHERE uzivatel_id=' '  ;";
$mailu = mysql_result(mysql_query($dotaz),0); // To zjistí kolik už má přidaných mailů
$dotaz = "SELECT email_pocet FROM tarif WHERE tarif_id='' ;";
$muze = mysql_query($dotaz); // Kolik jich mít může
if($mailu < $muze){
  return true;
}else{
  return false;
}
Jěště bych se zeptal zkušenějších proč tam musí být to mysql_result u toho COUNT, když to tam nebylo tak mi to vracelo pole, které jsem nemohl projet foreach protože mi to psalo Invalid argument supplied for foreach() ani to nešlo projet mysql_fetch_array
PC : CPU: C2D E5200 2500Mhz @ 3750Mhz a AC Freezer 7PRO MB: Gigabyte GA-P31-DS3L rev.2,1 GPU: ATI Radeon 3650HD 256MB RAM: A-Data Vitesta 2x2GB Zdroj: Forton OEM 400W HDD: Samsung F2 500GB
Netbook : Asus EEE CPU: Intel Atom N270 1,6GHz RAM: A-Data 2GB HDD: 250GB 5400ot/min
OndraSter
Středně pokročilý
Středně pokročilý
Uživatelský avatar
Registrován: 22. úno 2006
Bydliště: Praha / ČVUT FIT
Kontaktovat uživatele:

Re: Špatně položený dotaz do databáze?

Příspěvek od OndraSter »

Samotné mysql_query totiž vrací jen Resource a ne pole. mysql_result z toho vytáhne první sloupec (a jediný), viz http://cz.php.net/mysql_result
PC: i5-2500k 4.5GHz/24GB RAM/GTX560 Ti 1GB/>5TB - W7 Prof x64; Microsoft SideWinder X3 notebook: HP 6715b (4GB RAM) - W7 Prof x64;
mobil: Nokia Lumia 800 Cyan, 16GB; tablet: Toshiba Portege M200 (2GB, 64GB SSD, GeForce FX5200) - W7 Prof x32


Nahraďte Arduino výkonnější variantou!
Vývojová prostředí a nástroje | Webové prohlížeče | Seznam freehostingů
Balin.Tomas
Nováček
Nováček
Registrován: 28. kvě 2009

Re: Špatně položený dotaz do databáze?

Příspěvek od Balin.Tomas »

arxeiss píše:A proč by jsi to dával do session? Nejsem si 100% jistý ale zkus použít toto, pokud ti to nepojede tak napiš.
Tak jsem to zkoušel, zkusil jsem to i samostatně bez dalších podmínek a stále mi to do databáze zapisuje.
arxeiss
Začátečník
Začátečník
Uživatelský avatar
Registrován: 19. črc 2008
Bydliště: Krmelín (předměstí Ostravy)
Kontaktovat uživatele:

Re: Špatně položený dotaz do databáze?

Příspěvek od arxeiss »

Když mi něco takového nejede, tak zkouším si tam kde by to mohlo krachovat, tak si tam dodám echo ať aspoň přibližně zjistím kde mám chybu, takže u tebe jestli ti to vrací true nebo false, tak vyvolej tu funkci a dej tam

Kód: Vybrat vše

if(emailpocet()==TRUE){
echo "true";
}else{
echo "false";
}
Nebo tak nějak to zkoušej, fakt nevím kde by tam mohla být chyba.

Edit:\\ Zkoušel jsem si to u sebe, a narazil jsem na problém, tady máš jak jsem to udělal a jede mi to :wink:

Kód: Vybrat vše

$dotaz = "SELECT COUNT(*) FROM `email` WHERE uzivatel_id='1' ;";
$mailu = mysql_result(mysql_query($dotaz),0); // To zjistí kolik už má přidaných mailů
$dotaz = "SELECT email_pocet FROM tarif WHERE tarif_id='1';";
$muze = mysql_result(mysql_query($dotaz),0); // Kolik jich mít může
if($mailu < $muze){
  echo "můžeš";
}else{
  echo "nemůžeš";
}
dodal jsem tam u toho druhého dotazu do DB mysql_result a teď mi to jede v pohodě, jinak tabulky mám tak jak jsem to pochopil

Kód: Vybrat vše

Tabulka TARIF
tarif_id   |   email_pocet 
   1	 |         4

Tabulka email
uzivatel_id   |     email 
1	      |    sdf@sf.cz
1	      |   faslfk@df.cz
1	      |    fsd@ad.ad
PC : CPU: C2D E5200 2500Mhz @ 3750Mhz a AC Freezer 7PRO MB: Gigabyte GA-P31-DS3L rev.2,1 GPU: ATI Radeon 3650HD 256MB RAM: A-Data Vitesta 2x2GB Zdroj: Forton OEM 400W HDD: Samsung F2 500GB
Netbook : Asus EEE CPU: Intel Atom N270 1,6GHz RAM: A-Data 2GB HDD: 250GB 5400ot/min
Balin.Tomas
Nováček
Nováček
Registrován: 28. kvě 2009

Re: Špatně položený dotaz do databáze?

Příspěvek od Balin.Tomas »

arxeiss píše: Nebo tak nějak to zkoušej, fakt nevím kde by tam mohla být chyba.
Edit:\\ Zkoušel jsem si to u sebe, a narazil jsem na problém, tady máš jak jsem to udělal a jede mi to
Přišel jsem na to, ale bez toho druhýho dotazu, s ním mi to pořád nešlo a když jsem místo toho tam dal Session_tarif tak to šlo, ale to bych musel psát ty id tarifů podle toho.Co jsi mi poradil ty je super a jede to, Takže opět moc děkuji. :worship:
arxeiss
Začátečník
Začátečník
Uživatelský avatar
Registrován: 19. črc 2008
Bydliště: Krmelín (předměstí Ostravy)
Kontaktovat uživatele:

Re: Špatně položený dotaz do databáze?

Příspěvek od arxeiss »

V pohodě, jsem rád že ti to jede. Mi to nedošlo když jsem to psal poprvé že to zase vrátí pole, až jak jsem si to zkoušel u sebe tak jsem si tam dal ať mi to echne obě ty proměnné a to druhé mi to napsalo Resource id #4 tak jsem tam pak dal ten mysql_result
PC : CPU: C2D E5200 2500Mhz @ 3750Mhz a AC Freezer 7PRO MB: Gigabyte GA-P31-DS3L rev.2,1 GPU: ATI Radeon 3650HD 256MB RAM: A-Data Vitesta 2x2GB Zdroj: Forton OEM 400W HDD: Samsung F2 500GB
Netbook : Asus EEE CPU: Intel Atom N270 1,6GHz RAM: A-Data 2GB HDD: 250GB 5400ot/min
Odpovědět

Zpět na „Programování a web“