PHP MYSQL - selectování v ciklu – PHP – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

PHP MYSQL - selectování v ciklu – PHP – Fórum – Programujte.comPHP MYSQL - selectování v ciklu – PHP – Fórum – Programujte.com

 

Sigi
~ Anonymní uživatel
5 příspěvků
22. 9. 2015   #1
-
0
-

Dobrý den, už tři dny se mi nedaří řádně zprovoznit vytahování dat z DB.

Mám pocit, že jsem se zamotal do hrozné pavučiny, potřebuji pouze zobrazit vybrané řádky z tabulky COMMENTS. 
ID těchto řádků jsou uložena jako string v bunce článku v tabulce ARTICLES. (string protože se mi nedařilo uložit pole do DB )

Problém je takový, že pokud si vytvořím pole s hledanými ID tak vše funguje. Ale pokud použiji funkci která mi vytvoří pole tak se mi vypíše jen první vyhledaný obsah.

Kod:

// Tato funkce mi vyhledá v tabulce s článkny(ARTICLES) clanek s celym obsahem sloupcu
function dbsearch($connect, $table, $search_id, $search_value ){
     $if="SELECT * FROM $table WHERE `$search_id`='$search_value' ";
    $navrat=mysql_db_query("myforum", $if, $connect);
    while($row = mysql_fetch_array($navrat)){   
        $return[]=$row;
    }
    return $return;
}

$id_a = 157; //idečko hledaného článku.
// zde se mi ulozi obsah clanku do pole m_article
$m_article = dbsearch($connect, "ARTICLES", "ID", $id_a )or die(" Debugg from: clanek.php: Cannot use function dbsearch. CODE 258. ");
 
// Zde vyhledám v klici COMMENTS a obsah koments ulozim do $m_comments.

foreach ($m_article as $array){
    foreach ($array as $key =>  $value  ){
        if ($key == "COMMENTS"){
            $m_comments = explode(",",$value); // zde se string is ID komentářů prevede do pole
   
        }
    }
}

// zde je funkce pro otevreni radku s clankem
 function open($result){
    while($row1 = mysql_fetch_array($result)){$return=$row1;}

    foreach ($return as $value){    
        if (!is_numeric($r)  ){
            $vypis.= $value;    
        }

    }    
    return $vypis;
}

// Na zaver forem projedu matici M_COMMENTS a obsah vypíši ...
foreach ($m_comments as $id_c){
     $if = ("SELECT * FROM COMMENTS WHERE ID_TIME='".($id_c)."' ");
    $result = mysql_query($if, $connect) or die("CODE 778");
     echo open($result); // vypis obsahu komentare
    echo "<br>"; // dalsi radek pro oddeleni komentaru
}

/*
ZDE - se vypise jen obsah prvniho nalezeneho radku...

Když ale manuálně nastavím matici takto :
 $m_comments = null;
 $m_comments[0]=20092015123947;
 $m_comments[1]=20092015123841;
 $m_comments[2]=20092015123327;

a zadám ciklaci tak vse funguje ....
*/

Zkušenějším to celé asi přinde jako matlanice, tak prosím poradit a né odsuzovat.

Když by se někdo ptal proč na komentáře nepoužiji nějaké FrameWorky tak tímhle se chci naučit jak vlastně fungje php..
Předem dík za jakoukoliv pomoc.

Nahlásit jako SPAM
IP: 90.182.180.–
Sigi
~ Anonymní uživatel
5 příspěvků
22. 9. 2015   #2
-
0
-

Oprava chyby v
        if (!is_numeric($r)  ){
            $vypis.= $value;    
        }

Zapoměl jsem odstranit podmínku s numericou...

Nahlásit jako SPAM
IP: 90.182.180.–
ondrej39+1
Věrný člen
22. 9. 2015   #3
-
0
-

#1 Sigi
Prosím tě, kde ses naučil označovat proměnné tak příšernými názvy?

Nahlásit jako SPAM
IP: 79.141.243.–
Inject all the dependencies!
Sigi
~ Anonymní uživatel
5 příspěvků
22. 9. 2015   #4
-
0
-

#3 ondrej39
Tohle je odpověď která mi pomůže asi jako sláma v botech...  Jinak, před liftingem kódu užívám docela šílené názvy, za to se čtenářům omlouvám.

Nahlásit jako SPAM
IP: 90.182.180.–
Kit+15
Guru
22. 9. 2015   #5
-
0
-

#1 Sigi
Máš chybu v návrhu DB. Zkus místo sloupce COMMENTS v tabulce `ARTICLES` vytvořit sloupeček `article_id` v tabulce `comments`. Tím se ti to celé změní a zároveň významně zjednoduší.

Všimni si, že identifikátory v databázích píši malými _písmeny_s_podtržítkem. Je to zvyk, kterého je dobré se držet.

Je také dobré zapomenout na existenci die(). Docela trpím, když můj skript má chcípnout. To jsi asi vyhrabal v nějaké hodně staré učebnici, stejně jako ten zastaralý ovladač MySQL. Dnes se místo toho používá PDO, který toho umí víc a je rychlejší.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:207:e...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Sigi
~ Anonymní uživatel
5 příspěvků
22. 9. 2015   #6
-
0
-

#5 Kit
Takž epokud chápu zprávně místo abych načítal ID komentářů z tabulky článku a pak je vyhledával, bude lepší vyhledadat ID článku v tabulce komentářů?

Vím, že komentářů je poměrově k článkům více, proto jsem chtěl hledat spíš v tabulce kde je méně hodnot.

Určitě se se vrhnu co nejdříve na OOP, procedurální sestavování je čistě na naučení. 
Zakusím to teda překopat.

Poznámka:
Kód z vrchu mi začal fungovat když jsem pokaždé před voláním mysql_querry přidal nový Connect...
Jenže připojovat se tolikrát k DB je šílenost.
Stále nechápu proč to ale nefunguje - jestli rozumíš ?  Tu logiku proč manuálně nastavené pole jede ale vytažené z DB už ne... 

Nahlásit jako SPAM
IP: 90.182.180.–
Kit+15
Guru
22. 9. 2015   #7
-
0
-

#6 Sigi
Chápu, proč ti to nefunguje, ale je zcela zbytečné spravovat shnilý kód. Proto jsem nejprve napsal, jak si máš změnit strukturu databáze. Všechny komentáře si pak vytáhneš jediným dotazem: 

SELECT * FROM comment WHERE article_id = :id

a většina cyklů tím zmizí.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:207:e...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Sigi
~ Anonymní uživatel
5 příspěvků
22. 9. 2015   #8
-
0
-

#7 Kit
Teď si připadám jak hňup. Chyby ve všech jazicích php i cz .. 

Ještě poslední dotaz.  Prosím Tě,  ukládám do tabulky v DB nový řádek a mám nastaveno auto_increment.
Jak zjistím jaký ID se vytvořilo?  Resp. je nějaká funkce co vrací vytvořené ID ?  Zatím to řeším pomocí vlastního ÍD založené na časovém kodu (ID_TIME=01012015125959) . Je to podle mě zbytečné pracné a dlouhé ale jelikož anglicky a rusky jen louskám tak mi google zatím moc neporadil.

Nahlásit jako SPAM
IP: 90.182.180.–
Kit+15
Guru
22. 9. 2015   #9
-
0
-

#8 Sigi
Abychom byli přesní, tak chyby ve všech jazycích, PHP i cs...

Je na to určena SQL funkce LAST_INSERT_ID(), ale pokud přejdeš k PDO, tak je tam k tomuto účelu přímo vytvořena metoda lastInsertId(). Nemusíš se tedy psát s dalším SQL dotazem. Pouze mi tak trochu uniká, k čemu to potřebuješ. Většinou mě tento údaj vůbec nezajímá, protože svědčí o chybě v návrhu.

ID si nech normálně generovat datovým typem SERIAL (je aliasem pro "BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE"). Jeho hodnota tě v podstatě zajímat nemusí. Slouží pouze k jednoznačné identifikaci záznamu a k vytváření vazeb mezi tabulkami - zbytek aplikace se o něj téměř nemusí zajímat.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:207:e...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
peter
~ Anonymní uživatel
4016 příspěvků
23. 9. 2015   #10
-
0
-

Kit - Premyslel jsem ted, s tim last_insert_id nebo pres sql dotaz, co to udela, kdyz daji dva ruzni uzivatele temer soucasne INSERT? Pak obema vrati stejne last insert id, pokud to nezavolaji hned. Pak by tedy mozna bylo lepsi to uzavrit oboje do transakci.

Jinak, treba, kdyz vytvaris treba mail s prilohami, tak, dokud mail neulozis, tak nemas realne id, takze k nemu nemuzes vazat prilohy, ne? takze bud to navrhnes tak, aby se to ulozilo nebo tam udelas fiktivni tmp_id a nebo to ulozis do pomocne tabulky "rozepsane".

Nahlásit jako SPAM
IP: 2001:718:2601:258:79b5:c2...–
Kit+15
Guru
23. 9. 2015   #11
-
0
-

#10 peter
Místo přemýšlení si to vyzkoušej: Otevři si MySQL konzoli ve dvou konzolích. V jedné si vytvoř tabulku cat(id serial, name varchar(30); Vytvoř záznam, třeba INSERT INTO cat (name) VALUES ('Anita'); Ve druhém okně přidej jiný záznam, např. INSERT INTO cat (name) VALUES ('Brita'); a spusť SELECT LAST_INSERT_ID(); Potom tentýž příkaz spusť i v tom prvním okně.

Zjistíš, že na tohle transakci nepotřebuješ. Klidně si zadej SELECT * FROM cat; uvidíš dva záznamy. SELECT LAST_INSERT_ID();  ti stále bude hlásit "1".

Zrovna u e-mailu se to dá jednoduše obejít tím, že využiješ MIME z RFC 2822, ale budiž. Klidně použij LAST_INSERT_ID(). Jenom tě upozorňuji, že nepatří do standardu SQL a proto ji ostatní databáze zpravidla nemají. Ona totiž není potřebná, vázat přílohy můžeš i bez ní. Je to jen o pohodlí.

Běžně se používá i další ID, které jsi nešikovně nazval tmp_id a nesprávně označil jako fiktivní. Naopak je to obvykle to pravé ID, které se prezentuje vně databáze - např. PSČ, IČ, DIČ, nickname nebo v případě e-mailu ID zprávy, které se obvykle generuje jako hash.

Přidání kotěte ke kočce uděláš i bez znalosti ID: 

INSERT INTO kitten (name, born, cat_id) VALUES (
    'Gusta',
    '2015-05-14',
    (SELECT id FROM cat WHERE name='Brita')
);
Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:207:e...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
peter
~ Anonymní uživatel
4016 příspěvků
24. 9. 2015   #12
-
0
-

Ok, ok, jen se ptam.

Email jsem uvedl jako takovy priklad, pac ten zna kazdy a vi, ze se tam daji pridavat prilohy. Samozrejme si to musis predstavit databazove. Prilohy pak musis provazat s id emailu.

Tak si vem jiny priklad, clanek a prilohy. Normalni clovek si predstavuje, ze pri vytvareni clanku tam prida i prilohy. Ale, dokud nekliknes Ulozit clanek, tak nemas id, takze nemuzes do db pridat prilohu a provazat ji na clanek. Ale pritom prilohu lze nahrat jedine pres prochazet, ze uz se posle na server. Tudiz ji nekde musis mit.
V tom pripade tedy musis clanek bud predtim ulozit a nebo jej ulozit do jine tabulky, treba rozepsane. Nebo, pri kliknuti na button Pridat clanek vytvorit clanek, ktery pak smazes, pokud uzivatel neklikne Ulozit clanek.

Proste je to takovy nazorny priklad, kdy se to id sikne.
Samozrejme se tomu snazim vyhybat a resit to jinak. Kazda dobra db sleduje trendy a takovou funkci ma. Ted nedavno, tak max 6 mesicu zpet jsem videl clanek o novych db funkcich, jen jsem ziral, pac takove konstrukce by mne nenapadlo ani zkouset :)

Nahlásit jako SPAM
IP: 2001:718:2601:258:6458:9d...–
Kit+15
Guru
24. 9. 2015   #13
-
0
-

#12 peter
Mýlíš se. Například PostgreSQL tuto funkci nemá, protože ji nepotřebuje. Používá jiný (a mnohem lepší) mechanismus přidělování ID: Dostaneš ho ještě před uložením článku či e-mailu.

PostgreSQL považuji za jednu z nejlepších databází vůbec.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:207:e...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 20 hostů

Podobná vlákna

PHP + Mysql — založil marzelo

MySQL a PHP... — založil Anonymní uživatel

Php a mysql — založil janik366

Php+mysql — založil bernie

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý