Stránka 1 z 1

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

Napsal: pon 22. čer 2009, 00:01
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

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

Napsal: pon 22. čer 2009, 18:36
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.

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

Napsal: úte 23. čer 2009, 12:39
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

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

Napsal: úte 23. čer 2009, 16:45
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

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

Napsal: úte 23. čer 2009, 17:38
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

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

Napsal: stř 24. čer 2009, 20:43
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.

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

Napsal: stř 24. čer 2009, 22:46
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

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

Napsal: pát 26. čer 2009, 02:02
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:

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

Napsal: pát 26. čer 2009, 13:01
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