Autor | Zpráva | ||
---|---|---|---|
skrepyKOKO Profil |
#1 · Zasláno: 29. 8. 2011, 01:04:10 · Upravil/a: skrepyKOKO
ahoj,kategorie celkově mě fungují,jen je potřebuju dát do administrace kde je budu moct v článkách přidělovat...
možná bych to i udělal,ale jak to chci to neudělám... v databázi mám spojovací tabulku kde mám id článku a id kategorie+id toho celýho mno,a já bych potřeboval,když zakřížkuju třeba 2 checkboxy,tak aby to udělalo ty dva záznamy...pro id clanku např 1 a id kategorii 1,2 takhle vypadá checkbox <input type="checkbox" name="kat[]" value="<? echo $kat["zaznam"];?>"> <? echo $kat["zaznam"]; ?> a takhle ukládání článku <?php { require_once('../../otevridb.php'); if (!databaze()) break; // Uložení článku. @$vysledek = mysql_query( "INSERT INTO clanky (nazev, autor, datum, text)". " VALUES ('{$_REQUEST['nazev']}', '{$_SESSION['jmeno']}',". " CURRENT_TIMESTAMP(),'{$_REQUEST['telo']}')"); if (!$vysledek) { echo "Číslo chyby: ".mysql_errno()."<br />chaba: ".mysql_error(); exit; } } while (false); // tady odtud to mám už blbé,uložení samotného článku funguje v pohodě,jen prostě ty kategorie.. //a nějak udělat ještě to aby ukládalo při více zaškrtnutých checkboxech { // Uložení kategorie. @$kategorie= mysql_query( "INSERT INTO kategorie_spoj (id,id_clanku,id_kategorie, check)". " VALUES ('','','implode($_POST['kat'])',"."check)"); if (!$kategorie) { echo "Číslo chyby: ".mysql_errno()."<br />Popis chyby: ".mysql_error(); exit; } mysql_close(); } while (false); header("Location: CLANEK_index.php"); ?> Snad máte dostatečné informace.. doufám že mě pomůžete...tohle bych asi sám neudělal, |
||
Alphard Profil |
#2 · Zasláno: 29. 8. 2011, 01:21:02 · Upravil/a: Alphard
Začněte tím, jakou strukturu má tabulka kategorie_spoj, doufám, že všechny sloupce jsou číselné. To implode se mi nelíbí (krom toho, že s jedním parametrem udělá pěkný guláš, takto se nemůže vyhodnotit, to byste zjistil, kdybyste si ten dotaz vypsal.
Pokud jde o řešení, použijte cyklus: $idClanek = mysql_insert_id(); foreach($_POST['kat'] as $c) { mysql_query('insert into kategorie_spoj (id_clanku, id_kategorie) values ('.$idClanek.', '.(int) $c.')'); // šetrnější na výkon by bylo sestavit páry článek - kategorie, ale uložení článku nebude asi tak časté, aby bylo třeba to řešit } Proč tam píšete ty konstrukce {} while (false); fakt nechápu. |
||
o_O Profil |
#3 · Zasláno: 29. 8. 2011, 01:27:41 · Upravil/a: o_O
Alphard:
Nemyslím si, že je vhodné provádět MySQL příkazy přímo ve foreachu. Ne, že by to bylo až tak zatěžující pro MySQL, ale raději bych neučil neznalé takovýmto prasárnám. $idClanek = mysql_insert_id();$values=Array(); foreach($_POST['kat'] as $c) $values[]='('.$idClanek.', '.(int) $c.')'; mysql_query('insert into kategorie_spoj (id_clanku, id_kategorie) values '.implode(",",$values)); |
||
Alphard Profil |
#4 · Zasláno: 29. 8. 2011, 01:31:32
o_O:
Uditoval jsem to na 5x, dopsal jsem to tam. Článek se bude přidávat maximálně několikrát za den, pár ušetřených dotazů nic neznamená. Někomu, kdo jako logické bloky používá {} while (false); doporučuji to nejjednodušší.
|
||
skrepyKOKO Profil |
#5 · Zasláno: 29. 8. 2011, 09:49:13 · Upravil/a: skrepyKOKO
no,tabulka kategorie_spoj je číselná 1 a 0...
ID | id_clanku | id_kategorie jak tak koukám,tak v ukládání id_clanku tam mám vlastně +1 id při vložení nového článku,jak to pozná to uložení kategorie jaký se zrovna ukládá id?nemělo by se to upravit nějak? třeba $i+ apod?.. Alphard: ano,když jsem šel spát tak jsem si uvědomil že vlastně ukládám text když mám v tabulce int,tím pádem tam budu muset dát jen $_post['kat'] jinač k tomu zatěžování mysql,hostuju na free hostingu,a ktomu ta moje stránka má docela už dost dotazu na stránku,pak to budu muset nějak upravit aby to bylo co nejmín zatížený... PS: script Alphard ukládá to pouze 0 jak u id_clanku tak i id_kategorie |
||
o_O Profil |
#6 · Zasláno: 29. 8. 2011, 09:59:47
skrepyKOKO:
„nemělo by se to upravit nějak? třeba $i+ apod?..“ Slepě kopírujete kód a neučíte se z něj. ID článku zjišťuje funkce mysql_insert_id(), která vrací ID posledního vloženého řádku. |
||
skrepyKOKO Profil |
#7 · Zasláno: 29. 8. 2011, 10:03:10
tak ten kod od o_O funguje,ale zapisuje jen id_kategorie,nezapisuje id_clanku ani id pro celej ten sloupec
|
||
o_O Profil |
#8 · Zasláno: 29. 8. 2011, 10:05:29
skrepyKOKO:
Vložte $idClanek = mysql_insert_id(); |
||
skrepyKOKO Profil |
#9 · Zasláno: 29. 8. 2011, 10:16:13 · Upravil/a: skrepyKOKO
už to vypisuje..
Akorát to id no..furt zapisuje 0 místo aby zapisoval 1,2,3,4,5...apod.. jo a ještě jsem zjistil,že když označím 2 checkboxy tak se zapíše jen jeden,právě mě šlo o to,aby se zapisovaly všechny zaškrtlý.. a jelikož to je spojovací tabulka,tak to bude muset vlastně udělat novej sloupec,že když zaškrtnu 1,2 a id clanku bude např 98 tak aby se vytvořily 2 sloupce s id_clanku 98 a id_kategorie 1 a 2..šlo by to nějak? |
||
o_O Profil |
#10 · Zasláno: 29. 8. 2011, 10:24:21
skrepyKOKO:
„Akorát to id no..furt zapisuje 0 místo aby zapisoval 1,2,3,4,5...apod..“ Vypište před scriptem: die(var_dump($_POST['kat'])); „když označím 2 checkboxy“ Pole se prochází celé, chyba musí být někde jinde. |
||
skrepyKOKO Profil |
#11 · Zasláno: 29. 8. 2011, 10:29:23 · Upravil/a: skrepyKOKO
array(2) { [0]=> string(1) "1" [1]=> string(1) "2" } asi vím proč to nevypisuje ty 2 checkboxy..jelikož to má stejnou ID tedy 0,a když se udělá jeden dotaz s id 0 tak pak nemůže udělat další dotaz se stejným ID...tedy myslím:) PS zatím to vypadá takto: die(var_dump($_POST['kat'])); $idClanek = mysql_insert_id(); $values=Array(); foreach($_POST['kat'] as $c) $values[]='('.$idClanek.', '.(int) $c.')'; mysql_query('insert into kategorie_spoj (id_clanku, id_kategorie) values '.implode(",",$values)); |
||
o_O Profil |
#12 · Zasláno: 29. 8. 2011, 11:18:51
skrepyKOKO:
„jelikož to má stejnou ID tedy 0,a když se udělá jeden dotaz s id 0 tak pak nemůže udělat další dotaz se stejným ID“ Eh? Nějak nechápu. kategorie_spoj.ID má přeci nastaveno PRIMARY auto_increment, ne? |
||
skrepyKOKO Profil |
#13 · Zasláno: 29. 8. 2011, 11:57:36
aha,tak nato jsem zapoměl mu přiřadit auto increment:D už to fakčí díky moc:D
když jsem u toho,chci se zeptat,při upravování článku,tam mám kategorie,taky v checkboxu... mno,a chci udělat,že když bude ten článek přiřazen k nějaké kategorii,třeba novinky,tak aby to bylo zaškrtlý.. zkouším to vyřešit tímto způsobem: do tabulky kategorie_spoj jsem dal další sloupec s názvem check,a jako výchozí hodnotu checked pak jsem udělal takovýto script: $kategorie_spoj = mysql_query("SELECT * FROM kategorie_spoj WHERE id_clanku='{$_GET['IDCL']}'"); while($checked=mysql_Fetch_array($kategorie_spoj)) { $kategorie = mysql_query("SELECT id,zaznam FROM kategorie"); while($kat=mysql_Fetch_array($kategorie)) { ?> <tbody> <tr> <td><input type="checkbox" name="C1" value="ON" <? echo $checked["check"]; ?>> <? echo $kat["zaznam"]; ?></td><br> <td></td> <td></td> </tr> </tbody> <?}}?> vlastně mělo by to dělat toto: když budu upravovat článek třeba s ID 80,tak to vytáhnu z www pomocí GET ten IDCL,a udělám dotaz na kategorie_spoj kde zjistím jaký článek edituju,(vyberu jen id clanku s ID 80.to pak dám do echa jako checked do checkboxu jenže to zaškrtne všechny checkboxy,nevíte kde dělám chybu? PS: prominte za takovýto popis funkce,moc výřečnej nejsem:D |
||
o_O Profil |
#14 · Zasláno: 29. 8. 2011, 12:03:09 · Upravil/a: o_O
Hm, šlo by to přes group_concat.
Například: // Vybereme všechny kategorie $kat=mysql_fetch_assoc(mysql_query("SELECT group_concat(zaznam) AS kat FROM kategorie_spoj ks LEFT JOIN kategorie k ON (ks.ID=k.id) WHERE ID=$idClanku")); $kat_array=explode(",",$kat['kat']); // vytvoříme pole v kterém budou všechny kategorie while(/*výpis kategorií*/){ echo '<input type="checkbox" name="kat[]" value="value"'.(in_array($vypisKategorii['zaznam'],$kat_array) ? ' checked="checked"':null).'>'; } |
||
skrepyKOKO Profil |
#15 · Zasláno: 29. 8. 2011, 12:45:33 · Upravil/a: skrepyKOKO
tohle bych řekl že nepujde...mám to uplně jinak...
tabulka kategorie: id | zaznam id= té kategorie zaznam= název kategorie když dám id 1 tak to napíše např novinky Tabulka kategorie_spoj id | id_clanku | id_kategorie | check id=id celého sloupce(nepoužívám,jen prostě aby tam byl nějakej primary) id_clanku= id článku id_kategorie = id kategorie z tabulky kategorie(nahoře) check= to bych měl mít jakoby na to zaškrtávání,když vytvořím článek a přiřadím k němu nějakou kategorii,tak se mu tam dá checked, a tak jsem myslel že by se to nějak dalo udělat že zjistím ID kategorie+id editujícího článku,a udělám záznam toho check a dám vlastně do checkboxu že je zaškrtnutý jenže to zaškrtává všechny checkboxy.. |
||
o_O Profil |
#16 · Zasláno: 29. 8. 2011, 13:45:49
skrepyKOKO:
Tak v LEFT JOINu v podmínce přepište ks.ID na ks.id_kategorie. |
||
skrepyKOKO Profil |
#17 · Zasláno: 29. 8. 2011, 14:25:51
takže by to mělo bejt takhle?
$idClanku=$_GET['IDCL']; $kat=mysql_fetch_assoc(mysql_query("SELECT group_concat(zaznam) AS kat FROM kategorie_spoj ks LEFT JOIN kategorie k ON (ks.id_kategorie=k.id) WHERE ID=$idClanku")); $kat_array=explode(",",$kat['kat']); // vytvoříme pole v kterém budou všechny kategorie while(/*výpis kategorií*/){ echo '<input type="checkbox" name="kat[]" value="value"'.(in_array($vypisKategorii['zaznam'],$kat_array) ? ' checked="checked"':null).'>'; } a co ten WHERE ID=$idClanku? to where se vztahuje ke kategorie že?ale kategorie nemám udělaný podle ID článku... |
||
o_O Profil |
#18 · Zasláno: 29. 8. 2011, 14:38:12
skrepyKOKO:
Co takto vyzkoušet? Do where si dejte ks.id_clanku. Pak by to mělo jít. |
||
skrepyKOKO Profil |
#19 · Zasláno: 29. 8. 2011, 14:52:17 · Upravil/a: skrepyKOKO
píše to
Warning: mysql_fetch_assoc() expects parameter 1 to be resource, boolean given in /home/users/mojestranka.cz/web/administrace/admin/CLANEK_editace_clanku.php on line 252 neboli v tom WHERE když tam dám ten ks.id_clanku |
||
o_O Profil |
#20 · Zasláno: 29. 8. 2011, 14:57:03
skrepyKOKO:
Vypište si mysql_error(), tam se dozvíte kde je chyba. |
||
skrepyKOKO Profil |
#21 · Zasláno: 29. 8. 2011, 16:06:53 · Upravil/a: skrepyKOKO
pokud to vypisuju tu chybu správně,tak to napsalo
Query was empty jenže jak to může být prázdný když to v databázi je? chci se zeptat na ten dotaz jestli ho správně chápu $kat=mysql_fetch_assoc(mysql_query("SELECT group_concat(zaznam) AS kat FROM kategorie_spoj ks // tohle vybere zaznam z kategorie_spoj? LEFT JOIN kategorie k ON (ks.id_kategorie=k.id) WHERE ks.id_clanku. ")); // připojí to tabulku kategorie,a dál nevím...takovýhle způsob vidím poprvě... PS: ještě se chci zeptat zda si pochopil tu strukturu mojí tabulky..jelikož jestli to je tak že zaznam se bere z kategorie_spoj tak to je blbě.. jinač díky že se semnou zabíváš..:)vím že to je semnou složitý:D |
||
o_O Profil |
#22 · Zasláno: 29. 8. 2011, 17:01:56
skrepyKOKO:
MySQL příkaz by se dal napsat česky asi takto: VYBER všechny(sloupec zaznam) POJMENUJ JAKO kat Z kategorie_spoj ks PŘIPOJ TABULKU kategorie k SE VZTAHEM (kategorie_spoj.id_kategorie=kategorie.id) KDE kategorie_spoj.id_clanku SE ROVNÁ id článku Vybere to všechny záznamy, takže například "Novinky,SPAM,Blbosti,Vtípky,...", ty se pak v PHP rozloží podle čárky a vytvoří se z nich pole. U každé kategorie se pak porovná, zda zrovna tento článek obsahuje stejnou kategorii a podle toho se vypíše checked="checked". Ukažte, prosím, přesně jak vypadá Váš MySQL příkaz a zkuste i vypsat obsah (die("SELECT ...")), ten se občas také hodí. |
||
skrepyKOKO Profil |
#23 · Zasláno: 29. 8. 2011, 17:34:11
takže ten zaznam se bere z kategorie_spoj,jelikož v kategorie_spoj zaznam nemám,ten je v kategorie jen..v kategorie_spoj to je jen spojovací tabulka,kde spojuje id_clanku s id_kategorii..
jestli myslíte script tak ten vypadá takto je to to jak jste napsal tady... <?php require_once "../../otevridb.php"; OtevriDB(); $idClanku=$_GET['IDCL']; $kat=mysql_fetch_assoc(mysql_query("SELECT group_concat(zaznam) AS kat FROM kategorie_spoj ks LEFT JOIN kategorie k ON(ks.id_kategorie=k.id) WHERE ks.id_clanku. ")); $kat_array=explode(",",$kat['kat']); while($kat["zaznam"]) { ?> <tbody> <tr> <? echo '<input type="checkbox" name="kat[]" value="value"'.(in_array($vypisKategorii['zaznam'],$kat_array) ? ' checked="checked"':null).'>'; ?> <td></td> <td></td> </tr> </tbody> <?}?> |
||
o_O Profil |
#24 · Zasláno: 29. 8. 2011, 18:03:34
$kat=mysql_fetch_assoc(mysql_query("SELECT group_concat(zaznam) AS kat FROM kategorie_spoj ks LEFT JOIN kategorie k ON(ks.id_kategorie=k.id) WHERE ks.id_clanku. ")); |
||
skrepyKOKO Profil |
#25 · Zasláno: 29. 8. 2011, 18:20:23
no to já vím odzačátku že to je chyba ve WHERE...ale jde o to,že bych řekl že toto fungovat nemůže,jelikož nevím jak bych to napsal..ten dotaz je uplně jinej...např to jak si napsal
o_O: „VYBER všechny(sloupec zaznam) POJMENUJ JAKO kat Z kategorie_spoj“ v tom případě sloupec zaznam z tabulky kategorie_spoj... v tabulce kategorie_spoj sloupec zaznam není...to by chtělo abych ti poslal celej ten script,aby ses nato koukl že to tam opravdu je tak jak říkám,a abych tady zbytečně nespamoval...nemáš prosím nějakej kontakt?skype/icq?byl bych moc rád...díky |
||
o_O Profil |
#26 · Zasláno: 30. 8. 2011, 07:48:55
skrepyKOKO:
1) SELECT (výběr toho co se má vybrat) vybírá ze všech tabulek které jsou v MySQL příkazu. 2) Tato diskuse vše archivuje, bude lepší to dořešit tady, aby toto téma další příchozí se stejným problémem mohli najít a zdárně vyřešit svůj problém. 3) Jestli vážně nevidíte kde je chyba, bude lepší programování nechat. Nebudu Vám radit úplné základy. |
||
skrepyKOKO Profil |
#27 · Zasláno: 30. 8. 2011, 09:49:42 · Upravil/a: skrepyKOKO
celou noc jsem nadtím přemýšlel,a už to chápu...
tudíž jsem upravil ten where,a už to všechno jde.. moc díky..:) |
||
Časová prodleva: 14 let
|
0