21. září bude sraz! Od 18.00 v restauraci Tradice v Praze u Anděla
« 1 2 3 4 5 6 »
Autor Zpráva
Alphard
Profil
peta:
1. $head je ve 4. parametru, pokud nezadáš, je tam defaultně prázdný řetězec.
2, 3. Tahle stojí za úvahu, co si myslí kolegové?
Tori
Profil
Když teď na to koukám, From: nepatří mezi základní hlavičky? :) (viz „To by ze základních hlaviček mohlo být vše“) Mohla by být uvedena ještě před prvním použitím base64_encode, aby bylo vidět ten rozdíl: "Když zadávám jen e-mail, napíšu to jako obyč.text, ale když zadávám jméno (=diakritika, mezery), musím ho zakódovat."

Ad petův návrh: 4.parametr funkce cs_mail by mohl být povinný (aspoň From: musím zadat vždy), pak by ho šlo rovnou použít jako první prvek pole:
$head = array(trim($head));
$head = ... MIME, další hlavičky
Alphard
Profil
Měnit povinnost parametrů se mi příliš nelíbí. Jedním z prvotních záměrů bylo vytvořit funkci, která se parametry co nejméně odlišuje od základního použití mail().
Davex
Profil
Alphard:
2, 3. Tahle stojí za úvahu, co si myslí kolegové?
ad 2) To je věc vkusu. Pro začátečníka mi použití pole nepřipadá vhodné.

ad 3) Když už to peta nakousl, tak zrovna v tomto kódu je úplně jiná chyba než tam snad vidí, ale nechce se mi v tom moc vrtat. Hlavička From by se asi mohla přesunout z parametru do proměnné, aby to tolik nemátlo a všechny volitelné údaje byly u sebe na jednom místě.

(Délka řádku v hlavičce by neměla přesáhnout tuším 78 znaků, takže by se mělo např. u Subject použít iconv_mime_encode a u From něco jiného - na jméno asi mb_encode_mimeheader + něco, co vhodně rozlouží dlouhý řádek na víc řádků podle MIME RFC. Kompletní řešení v tuto chvíli nemám. Osobně používám PHPMailer, kde řeším jen nekompatibility mezi verzemi PHP.)
Alphard
Profil
Tak teď nevím, jestli to nějak řešit. Že nám chybí nějaká ošetření vím (i když ne konkrétně), ale zase současná funkce pro běžné použití zdá se funguje dobře a přitom ji ještě může pochopit začátečník, aspoň myslím. Jak začneme používat věci uvedené v [#4], nemá zřejmě cenu to ani popisovat, prostě copy&paste. Chceme to?
Davex
Profil
Alphard:
Hlavní problém je asi v tom, že kdybychom chtěli mít dokonalý kód, tak by narostl natolik, že by se asi původní účel kódu „nakopnout“ úplně vytratil. S aktuálním kódem žádné problémy dlouho nebyly (pokud si to někdo nerozbil). Možná by se mohl kód zjednodušit zrušením kódování base64 těla zprávy a použitím 8bit, ale nemám to vyzkoušené na žádném starším systému, kde by teoreticky mohl nastat nějaký problém.

Můj závěr je tedy takový - nešahat zbytečně na něco, co funguje.
Alphard
Profil
Davex:
zrušením kódování base64 těla zprávy a použitím 8bit
Na tohle jsem se už dříve (několik let zpátky) díval a problém byl v dobré escapovací funkci. imap_8bit() vyžaduje rozšíření IMAP, které ne všude jde. Nová alternativa quoted_printable_encode() je zase od 5.3 :-/ Máte někdo něco vyzkoušeného se širokou podporou? Snad neříkám blbosti, sám používám Nette\Mail a spokojenost.

nešahat zbytečně na něco, co funguje
Taky jsem do toho za 3 a půl roku šahal minimálně :-)
peta
Profil
1 - Ano, head je prazdne, ale kdyz zapnes zobrazovani chyb, tak to vypise error. Takze ten kod je vlastne chybny.
2 - Ano, ja vim, ze to trochu komplikuje jednoduchy kod. Je to jen napad, jak se zbavit chyby ukonceni radku.
3 - Pokud ten kod nemuze primo pouzit ke kodu uvedenemu vys, pak zacatecnik to nedokaze spojit s $head nebo pripsat ke kodu. Pak mu musis odpovidat na dotaz, jak to ma propojit.
Davex
Profil
peta:
ad 1) Jakou chybu to vypíše? Tento kód je v pořádku.
function cs_mail($to, $predmet, $zprava, $head = "")
{
    $predmet = "=?utf-8?B?".base64_encode(autoUTF($predmet))."?=";
    $head .= "MIME-Version: 1.0".PHP_EOL;
    // ...
}
peta
Profil
Ano. Nicmene od zacatku prispevku #4, ktery maily rozebira, tam nikde takovy radek neni. Nebo zacinas cist od prostredka? Chapej, tam se popisuje neco, co jeste nebylo receno. Je to podobne, jak kdyz nevysvetlis cizi slovo, zkratku.
Tori
Profil
Možná by se hodilo do části Návrh aplikace přidat odkaz na Majklův návod includování skriptů podle parametru GET (klasické index.php?page=stranka1 --> include "stranka1.php";)? Podrobně popsal řešení, zatímco v tom vlákně od Joan je to spíš naznačené a podrobně se řeší jiné věci.
Alphard
Profil
Tori:
Můžeš prosím uvést odkaz na vlákno s Majklovým příspěvkem?

Zpětně zůstal nezpracován petův návrh na přidání návodu jak vypsat chyby, to by se mělo doplnit doplnit. Na řešení formulací v tom mail teď nemám sílu.

[#10]
Jo takhle, já se pořád díval do kódu. Smazal jsem tedy . v prvním přiřazení.
Tori
Profil
Alphard:
Omlouvám se, přehlédnutí, doplněno.
Jan Tvrdík
Profil
• typo „přesnut“
• sjednotit odkazy na stejný mirror (míchání cz.php.net a www.php.net)
• aktualizovat odkaz http://zdrojak.root.cz/n/php/clanky/ a http://zdrojak.root.cz/n/mysql/clanky/
• „s defaultním nastavením“ -> „s výchozím nastavení PHP“
• ad „FAQ Webzdarma“ – nevidím tam nic moc užitečného, spíš věci specifické pro webzdarma a balast
• odkaz http://www.dgx.cz/trine/category/php je imho zbytečné, články se nachází i na phpfashion
• „Syntaktickým chybám lze předcházet používáním vhodného PHP editoru“ - doplnit odkaz do vlákna s editory
(přestalo mě to bavit, někdy budu pokračovat)
Tori
Profil
• V příspěvku odkázaném z "nadpis skupiny" je chybně odkaz na JavaScriptovou metodu substr, má být SUBSTR z MySQL.
• Odkaz "Někdy lze BOM poznat dle prázdného místa." vede do tohoto vlákna. Asi lepší odkázat sem nebo snad na ilustrační obrázek. Vypnutí v Notepadu2 (screen), PSPadu (screen na jiném webu), zmínka o Notepad++.
Alphard
Profil
[#15] Tori
První bod opraven, děkuji.
Druhý snad podrobněji rozepíši někdy... kolem Vánoc.

[#14] Honzo, určitě to neignoruji, i když to tak asi vypadá.
Kcko
Profil
Alphard:
Odkaz na Nette mailer taktéž nefunkční.
Tori
Profil
Ad výpis do tabulky - řazení po řádcích - na řádku 12 by místo if ($i != COLS - 1) mělo být zřejmě if ($i % COLS != 0)
Alphard
Profil
Děkuji, opravil jsem.
peta
Profil
Nejčastější potíže s PHP (FAQ) » Výpis výsledků z databáze (nebo z jiného zdroje) do tabulky o více sloupcích
1. (razeni do sloupcu)
echo ($j*$pocetRadku + $i + 1).". ".$zaznamy[$j*$pocetRadku + $i]['den'];
Takhle se to ale preci nedela...

define ("COLS", 3);
 
$rows = ceil(count ($zaznamy) / COLS); //$pocetRadku

echo "<table>\n";
for ($i = 0, $k=0; $i < $rows; $i++)
{
  echo "<tr>";
  for ($j = 0; $j < COLS; $j++, $k++)
  {
    echo "<td>";
    if (isset($zaznamy[$k]))
      echo ($k + 1).". ".$zaznamy[$k]['den'];
    else
      echo "&nbsp;";
    echo "</td>";
  }
  echo "</tr>\n";
}
echo "</table>\n";
Protoze jsi pouzil COLS pro oznaceni sloupcu, musis dodrzet jazyk i pro oznaceni radku, jinak je nepruhledne.
$j*$pocetRadku + $i A kdo by tohle porad opisoval a prepocitaval? vzdyt je to casove neusporne.

2.
Podobne predchozi priklad (razeni do radku)
$i % COLS
Kdo by to opisoval a delil 3x? tak to ulozim do $j = $i % COLS

3.
Jo, a razeni je velmi nepresne oznaceni. Nenapada mne ted lepsi slova. (vypisovani do radku, zarovnani)

4. (razeni do radku)
A jeste bys tam mohl podobnym zpusobem udelat kod pro vypsani tabulky se sloupci a radky.
        $query  = "SELECT * FROM `".$name."`";
        $result = sql($query);
        if ($result)
            {
            $tbody  = '';
            $thead  = '';
            while (($row = mysql_fetch_assoc($result))!==false)
                {
                $tr = '';
                foreach ($row as $key=>$value)
                    {
                    $tr .= sprintf("\n<td>%s</td>",$value);
                    }
                $tbody .= sprintf("\n<tr>%s</tr>",$tr);
                if ($thead=='')
                    {
                    $tr = '';
                    foreach ($row as $key=>$value)
                        {
                        $tr .= sprintf("\n<th>%s</th>",$key);
                        }
                    $thead .= sprintf("\n<tr>%s</tr>",$tr);
                    }
                }
            if ($tbody!=='')
                {
                echo sprintf("\n<table border=\"1\">\n<thead>%s</thead>\n<tbody>%s</tbody></table>",$thead,$tbody);
                }
            else    {
                echo "<p>Nula zaznamu</p>";
                }

            }

Edit: Tori, doplneno oznaceni, co je k cemu.
Tori
Profil
peta:
Takhle se to ale preci nedela...
K prvnímu: Reagujete na část "Řazení po sloupcích" anebo "Řazení po řádcích"? Totiž podle kódu to vypadá, že mluvíte o druhém případu (tj.po sloupcích), nicméně výsledkem je tabulka seřazená po řádcích.

Dalo by se to taky už při čtení z DB rovnou formátovat do použitelnějšího pole $zaznamy[($i++ % COLS)][] = mysql_fetch_něco(...) (to k druhému kusu kódu), jenže zřejmě autor chtěl udržet odděleně datovou a zobrazovací vrstvu a tahání dat jen naznačit. Což je určitě dobře.
peta
Profil
Tori 2, pak bych tam ale doplnil free_mysql_result, aby se uvolnila pamet. Tady chodi silenci, co vypisuji 100 radku a takhle by si pamet zaplacali resulty a polem.

6. Nejčastější potíže s PHP (FAQ) » Jak přenést proměnnou z PHP do javascriptu
var vekUzivatele = <?php echo $vekUzivatele; ?>; // kdyby se předával string, musí se použít uvozovky a správné escapování
Tohle bych radeji hnedka smazal. Doprucuji vypisovat cely js kod jako jedno echo. Proc? zkus si k tomu pridat priklady pro
a) string
b) string s apostrofy a uvozovkami (htmlspecialchars)
c) asociativni pole se stringy a cisly s apostrofy a uvozovkami, lomitky \ a jinymi zakernymi vecmi
<?php echo 'var vekUzivatele = '.$vekUzivatele.';'; ?>
<?php echo fprints('var vekUzivatele = %s;',$vekUzivatele); ?>
<?php echo fprints('var vekUzivatele = %1$s;',$vekUzivatele); ?>
 // %1$s = prvni v poradi, pokud by bylo vic promennych pro fprints
Alphard
Profil
1. Neprosazuji konkrétní podobu. Pokud jsou zde i jiné názory, že je něco jiného přehlednější, klidně upravím, ale já si tímto nejsem jistý (třeba jestli $k=0 v prvním for a $k++ v druhém for nebude matoucí víc než výpočet pořadí).

2. Ano, ale zase proměnná navíc no, podle mě je to jedno.

3. Nevzpomínám si, že by zde byl požadavek na tohle a na běžný vypis tabulky to asi není moc užitečné, ale je to zajímavý námět na dumpovací funkci. Viděl bych to na styl dump_result($result);.

Sám třeba nejsem nadšený z použití konstant, které dost komplikuji vypsání dvou tabulek na stránku o různých nastaveních, ale byl jsem líný to měnit.

Tori [#21]:
Jo, taky by to nemuselo být v těle cyklu, ale rovnou while($zaznamy[($i++ % COLS)][] = mysql_fetch_něco(...));, ale patří podobné konstukce do této části? Joker v učebnici pro začátečníky právě od podobných sestav odrazuje.
Ono by tam šlo dát taky array_chunk(), opravdu nevím, co je lepší.

peta [#22]:
Ten bod je určený lidem, kteří se diví, že jim nefunguje konstukce $i = confirm(). Má co nejjednodušším způsobem osvětlit základní principy. Navíc tvůj kód je dost v nesouladu s klasickými templatovacímy systémy.
Navíc použití htmlspecialchars() se mi zdá chybné, v kontextu js bych ošetřoval funkcí json_encode().
peta
Profil
Alphard:
1. Muzes $k vyhodit mimo radek for(). Promenna navic nevadi. navic se to nepocita slozitym nasobenim, ale jen k++. Podle meho je to snadnejsi na pochopeni i praci, kdyz tam budes mit dalsi promennou, ktera je jen pro pocitani radku. Navic si tak muzes zvolit, kterym cislem zacnes. Kdybys chtel udelat treba listovani a cislovat (radky) od 11 po 20.
2. viz 1
3. Kod na celou tabulku chce kazdy druhy zacatecnik. Potrebuji zavolat sql, ziskat vysledky a zobrazit. Tve priklady resi jeden sloupec, coz je dost malo.
(4.) Jo, konstatnty jsou spatne reseni. Kdyz to budes chtit obalit funkci s parametry, tak je budes muset stejne prepsat na promenne. Ale prislo mi to jako mensi zlo nez 3x po sobe pocitat slozite deleni.
(5.)
"Navíc použití htmlspecialchars() se mi zdá chybné, v kontextu js bych ošetřoval funkcí json_encode(). "
Mozna, ale mel bys do toho prikladu zahrnout zakazane znaky pro js. (edit)
$a = 'ahoj"svete';
<?php echo 'var prom = "'.$a.'";'; ?>
Co se stane?
var prom = "ahoj"svete";
Tori
Profil
Alphard:
patří podobné konstukce do této části?
Naopak, vždyť píšu, že je to (IMHO) dobře, když je získání dat oddělené od jejich zobrazení. I když vlastně u prvního příkladu je to dohromady, hm. Mně u toho druhého příkladu (po sloupcích) trochu nesedí ten výraz použitý jako index pole. Co kdyby se trochu zjednodušilo čtení dat, aby ty příklady byly jednoduché a co nejpodobnější a víc vynikly rozdíly v počítání indexu aktuálního prvku pole? Např.:
$zaznamy = array('Pondělí', 'Úterý', 'Středa', 'Čtvrtek', 'Pátek' , 'Sobota', 'Neděle');
$pocetSloupcu = 3;

// Výpis po řádcích, 1-2-3-4- ...
// - vypisujeme záznamy tak, jak jdou za sebou a za každým třetím (= počet sloupců) zalomíme řádek

// potřebujeme znát celkový počet záznamů
$pocetZaznamu = count($zaznamy);

echo "<table>\n";
for ($i = 0; $i < $pocetZaznamu; $i++)
{
    if ($i % $pocetSloupcu == 0) 
        echo "<tr>";
    echo "<td>".($i + 1).". ".$zaznamy[$i]."</td>";
    if ($i % $pocetSloupcu == $pocetSloupcu - 1) 
        echo "</tr>\n";
}
// pokud nejsme na konci posledního řádku, doplníme zbývající prázdné buňky
if ($i % $pocetSloupcu != 0)
{
    while ($i++ % $pocetSloupcu != 0)
    {
        echo "<td>&nbsp;</td>";
    }
    echo "</tr>\n";
}
echo "</table>\n";


// Výpis po sloupcích, 1-4-7- ...
// - pořadí každého záznamu se musí dopočítávat

// potřebujeme znát počet řádků tabulky
$pocetRadku = ceil(count($zaznamy) / $pocetSloupcu);

echo "<table>\n";
for ($i = 0; $i < $pocetRadku; $i++)
{
    echo "<tr>";
    // určíme, který záznam se má zobrazit v první buňce tohoto řádku
    $poradi = $i;
    for ($j = 0; $j < $pocetSloupcu; $j++)
    {
        echo "<td>";
        if (isset($zaznamy[$poradi]))
            echo ($poradi + 1).". ".$zaznamy[$poradi];
        else
            echo "&nbsp;";
        echo "</td>";
        // posun na sousední buňku (ve stejném řádku)
        $poradi += $pocetRadku;
    }
    echo "</tr>\n";
}
echo "</table>\n";

Alternativní způsob doplnění prázdných buněk do *prvního* příkladu:
// pokud nejsme na konci posledního řádku, doplníme zbývající prázdné buňky
$chybi = $pocetSloupcu - $i % $pocetSloupcu;
if ($chybi != 0)
{
    echo str_repeat("<td>&nbsp;</td>", $chybi);
    echo "</tr>\n";
}
echo "</table>\n";

peta:
Promenna navic nevadi. navic se to nepocita slozitym nasobenim, ale jen k++.
Stále mi není jasné o kterém příkladu mluvíte, nezlobte se na mě. Lineární počítání zobrazených buněk (k++) je použitelné jen pro výpis po řádcích (1-2-3...), složité násobení jste zas zmiňoval u výpisu po sloupcích (1-4-7...).
peta
Profil
Tori:
To jsem do prispevku pak doplnil. Kazda ta vec se vztahuji k jine casti. Konkretne bod 1. je presna kopie prikladu "Řazení po sloupcích", coz je na prvni pohled jasne, kdyz si das oba kody vedle sebe. Jedine, co jsem tam zmenil je prave 3 x $j*$pocetRadku + $i + 1 za 3x $k.
Cimzs se cely priklad krasne zjednodusil. Rozhodne se lepe chape promenna nazvana $k nez zjistovat, ze vzorec $j*$pocetRadku + $i + 1 je tam vlastne 3x totez a navic pracne vypocitane nasobenim (ktere je casove zdlouhave proti pricteni 1).
Ale to uz stejne neni dulezite, Alphard psal, ze se mu vic libi jeho verze, ze by se zbavil spis konstant.

str_repeat - tam nejde o doplneni mezer na konec, ale tam, kde neni isset($zaznamky[$k]). To muze byt i uprostred.
$a = array(
0 => 6,
7 => 56,
22 => 222
);
Mysql tam podle nastaveni nemusi vratit sloupec jako null nebo prazdny, ale zadny nevrati.
_es
Profil
• Vyvolat jiný požadavek na server, např. v js vytvořit objekt obrázku. Nevýhodou je, že nezískáme odezvu serveru, data lze tedy přenášet jen jedním směrem.
Nie je to celkom pravda: Vložení PHP do JS.
Aj keď možnosti spätnej informácie v JS sú veľmi obmedzené. Stiahnutý obrázok sa však dá aj normálne zobraziť v prehliadači.
Alphard
Profil
peta [#26]:
Ok, můžu přidat proměnnou $k, zbavit se i konstant a dát i do funkce. Já netrvám na své verzi, jen se mi moc nechce zasahovat do funkčního kódu :-)
Můžeš ohodnotit kód Tori [#25] prosím? Rád bych slyšel kritiku, než to změním.

Tori [#25]:
Líbí se mi jakýkoliv okomentovaný přehledný kód, klidně to tam dám Ctrl+C » V, jestli souhlasíš.

_es [#27]:
Je to základní FAQ, já nejsem fanda do JS, nikdy jsem to sám nepoužil, ale jestli to považuješ za nezbytné, doplním.
Tori
Profil
Alphard:
Samozřejmě. petovy výhrady k str_repeat jsem neřešila, keďže i v současné verzi příkladu se počítá se spojitou řadou prvků a vypisováním bez prázdných polí uprostřed tabulky.
peta
Profil
Alphard: Na ten kod nemam nazor, nechtelo se mi jej studovat, kolik situaci vyresi. Tvuj kod mi prisel jednodussi na pochopeni principu, az na tu komplikaci, kterou jsem poresil s $k.
V obou pripadech pouzivas odlisny zpusob. V prvnim pripade pracujes primo se zaznamem z databaze
$zaznam = mysql_fetch_assoc($result);
, v druhem si to vcechno presunes do pole.
while ($line = mysql_fetch_assoc ($result))
  $zaznamy[] = $line;
Takze na prvni pohled v obou prikladech tam najdes vic rozdilu nez jen zpusob vypisu, coz muze pusobit matoucne. Tori pak uz resi jen pole. Zkopirovat tam jeji priklad bez doplneni mysql by znamenalo odchylit se od nadpisu tematu.
"keďže i v současné verzi příkladu se počítá se spojitou řadou prvků" To ma vlastne pravdu, protoze jsem si neuvedomil, ze v tom druhem pripade to presouvas do pole.


    echo "<td>";
    if (isset($zaznamy[$k]))
      echo ($k + 1).". ".$zaznamy[$k]['den'];
    else
      echo "&nbsp;";
    echo "</td>";
Ve svem programu bych to resil ale treba takto:
    $hodnota = (isset($zaznamy[$k])) ? ($k + 1).". ".$zaznamy[$k]['den'] : "&nbsp;";
    echo "<td>".$hodnota."</td>";
« 1 2 3 4 5 6 »

Vaše odpověď

Mohlo by se hodit

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

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

0