Autor Zpráva
skrepyKOKO
Profil
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
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
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
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
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']
že?

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
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
tak ten kod od o_O funguje,ale zapisuje jen id_kategorie,nezapisuje id_clanku ani id pro celej ten sloupec
o_O
Profil
skrepyKOKO:
Vložte
$idClanek = mysql_insert_id();
hned pod vytváření článku. Pokud by to i tak nic nezapisovalo, zkuste ho vypsat, jestli vůbec ID článku obsahuje.
skrepyKOKO
Profil
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
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']));
ať víme, proč.

když označím 2 checkboxy
Pole se prochází celé, chyba musí být někde jinde.
skrepyKOKO
Profil
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
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
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
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
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
skrepyKOKO:
Tak v LEFT JOINu v podmínce přepište ks.ID na ks.id_kategorie.
skrepyKOKO
Profil
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
skrepyKOKO:
Co takto vyzkoušet? Do where si dejte ks.id_clanku.

Pak by to mělo jít.
skrepyKOKO
Profil
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
skrepyKOKO:
Vypište si mysql_error(), tam se dozvíte kde je chyba.
skrepyKOKO
Profil
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
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
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
$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. ")); 
Chybu jsem zvýraznil.
skrepyKOKO
Profil
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
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
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..:)

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0