Autor Zpráva
krteczek
Profil
zdravím a prosím o pomoc:
potřebuji v tabulce která má sloupce id, jmeno, prijmeni a další(pro tohle hledání nedůležité), zjistit, jestli se na některém řádku objevuje kombinace jmena a prijmení , a pokud ano, muže to byt jen na řadku n
mám takovou funkci:

function jmenovdb($jmeno,$prijmeni)
{
$vysledek=mysql_query("select id from lide where jmeno='".$jmeno."' && prijmeni='".$prijmeni."'" , $GLOBALS["link"]);
return (boolean) mysql_num_rows($vysledek);
}

tuhle používám na zjištění jestli se ta kombinace jmena a příjmení v tabulce objevila a funguje,
potřebuji jinou funkci která bude mít ještě jeden vstupní udaj nějak takhle:

function jmenovdbjinde ($jmeno,$prijmeni,$radek_v_db)

s tím, že kombinace jmena a přijmení se muže objevit jen na tom řadku ktery je poslan b proměnne $radek_v_db
už se stím trápím asi 3 hodiny a stále mi to nejede jak má :-(
díky krteczek
krteczek
Profil
no tak jsem na to nakonec přišel, verzí bylo několik, velikostí od popsané stránky a5 až nakonec jen mírně modifikovaný dotaz na db uvedený výše :-)
takže potřebuji z db dostat jestli se v ní vyskytuje osoba s jménem $jmeno,prijmením $prijmeni, a pokud ano,tak musí nacházet jinde než na řádku $radek_v_db
tady je kód té funkce:

function jmenovdbjinde ($jmeno,$prijmeni,$radek_v_db)
{
$vysledek=mysql_query("select * from lide where jmeno='".$jmeno."' && prijmeni='".$prijmeni."'&& id!='".$radek_v_db."'", $GLOBALS["link"]);
return (boolean) mysql_num_rows($vysledek);
}

funkce se volá :

if(jmenovdbjinde($_POST["jmeno"],$_POST["prijmeni"],$radek))
{
echo "Pokoušíte se vložit do databáze duplicitní údaje. Osoba jménem: ".$_POST["jmeno"]." a příjmením: ".$_POST["prijmeni"]. " se už v databázi vyskytuje. Pokud se jedná o jinou osobu se shodným jménem, přidejte prosím do jejího jména nějaký rozlišující údaj.";
$zapis=0;
}

takže celé to funguje takhle: opravuji vdatabázi udaje na řádku $radek a potrebuji ověřit před uložením jestli jsem náhodou nezměnil jméno apříjmení na jiné už v databázi existující, proto septám databáze jestli je v db osoba s těmito inicialy, ale jinde než na řadku $radek
pokud osoba v db není,nebo je a je na řadku $radek, vrátí nám funkce false ( což je v pořádku, to potřebuji ),jinak mi vráti true, což je špatně a já tedy znovu ukazuji formulář na opravu dat...
snad jsem to vysvětlil dostatečně pochopitelně aspoň u odpovědi, když zadání nebylo nic moc :(, tímto se omlouvám všem co chtěli pomoct, ale nepochopili zadání, protože bylo špatně položeno. Příště se budu snažit vyložit muj problém srozumitelněji. díky všem
krteczek
23k
Profil
Strasny funkce, se nedivim, ze Ti nikdo neporadi. Vic slozitejc to resit nemuzes? Aneb co je slozitejsi tim jsem lepsi???

Btw proc se podepisujes, kopirujes LEA?
krteczek
Profil
23k: 1) v čem je ta funkce tak šíleně složitá?? Myslím, že je to lepší než psát do kodu několikrát to samé, ale asi se pletu, podle toho co píšeš. máš lepší a jednodužší řešení? Sem s ním, já se rád poučím, a myslím, že každý kdo to čte.
2)podepisuji se proto že je to můj zvyk, nikoho nenapodobuji, když se koukneš ke mne na web tak všechny mé odpovědi jsou podepsané ( pokud náhodou některá ne, tak jen potvrzuje pravidlo... :-)
krteczek

PS: k odpovědi jsem se dostal až dnes, protože errortel měl nějaké problémy na základnových stanicích s gprs ( Karviná, Č.Těšín )...
Lemur
Profil *
Ohledně hledání počtu pomocí "select * from ..." a zjištění počtu vrácených řádek:
Je to neoptimální řešení, protože donutí databázi udělat dotaz, který se nakonec zahodí. Mnohel lepší je použí count() - třeba "select count(*) as pocet from ... ", vrátí se jediný řádek s polem "pocet" a to je počet řádek. A pro databázi je count() mnohem méně náročný než obyčejný select, hlavně pokud jsou pole, pomocí ktrých se tvoří podmínka, indexovaná.
krteczek
Profil
Lemur: díky, to znamená že ten dotaz by měl být nějak takhle?:


function jmenovdbjinde ($jmeno,$prijmeni,$radek_v_db)
{
$vysledek=mysql_query("select count(*) from lide where jmeno='".$jmeno."' && prijmeni='".$prijmeni."'&& id!='".$radek_v_db."'", $GLOBALS["link"]);
return (boolean) mysql_num_rows($vysledek);
}
Lemur
Profil *
Ne - to by vrátilo vždycky TRUE, správne je to takhle:


function jmenovdbjinde ($jmeno,$prijmeni,$radek_v_db)

{

$vysledek=mysql_query("select count(*) as pocet from lide where jmeno='".$jmeno."' && prijmeni='".$prijmeni."'&& id!='".$radek_v_db."'", $GLOBALS["link"]);

$radek=mysql_fetch_array($vysledek,MYSQL_ASSOC) ;

return (boolean) intval($radek["pocet"]);

}



Hlavní je: nedělat požadavky, který vrací data, pokud je třeba jen počet.
krteczek
Profil
Jé super :-) tak už to zase funguje ( podle tvého příkladu ) .
Vím tedy, že je dobré tahat jen informace o datech, pokud nepotřebuji data, a ty jsi mi ukázal jak na to, ale ještě jeden dotaz: to moje řešení je náročné i tehdy, když je očekáván návrat žádného, nebo jen jednoho řádku???
díky za pomoc a osvětu
krteczek
Lemur
Profil *
to moje řešení je náročné i tehdy, když je očekáván návrat žádného, nebo jen jednoho řádku???

Ano, i když v případě žádného řádku by to neměl být velký rozdíl. Ale pokud je to jeden a více řádků, tak se musí zbytečně číst z disku a přenášet data, která se stejně zahodí.
krteczek
Profil
Lemur: díky za vysvětlení, krteczek
Toto téma je uzamčeno. Odpověď nelze zaslat.

0