Bognár Tibi bácsi: Saját képek Gyurcsány Ferencről a Zuschlag-perben

Papi Gergely főhadnagy rágalmazás miatt feljelentette Hermán Pétert

Havrilla István: FRISS: A bíróságon megfegyelmezett ÁVÓS története

Szinte ingyen. Hány gyerek ebédelhetne belőle egy évig? (Rebisz adatközlés - október 23)

Hermán Péter: Az ÁVH nak ki kell adni a videófelvételeket július 4-ről

Gőbl Gyuri levele az ÁVH-nak okt. 23-ról

Hermán Péter: Kupleráj az ÁVH-nál - 8 hónap nem elég március 15 kivizsgálásához

php bejegyzései

Profi, mégis szar

Az áldást sodika küldte 2009. május 11., hétfő - 21:31-kor
Címkék: php programozas szamitogep
23 komment

Programozásról lesz szó.

Ha ez téged nem érdekel, ugord át a bejegyzést. :)


Egyik haverom éppen mostanában fáradozik egy bizonyos vállalkozási célra megvásárolt PHP alapú rendszer beüzemelésével, azonban szomorúan volt kénytelen konstatálni, hogy a drága pénzen beszerzett cucc bár a várakozásait túlszárnyalva valósítja meg az általa igényelt funkciókat, akad benne néhány zavaró hiba.

Anélkül, hogy a Magyarországon úttörőnek számító megoldásról idő előtt kényes részleteket árulnék el, annyit elmondhatok, hogy az adott AJAX alapú cucc a látogatókat versenyezteti bizonyos szempontok szerint, majd pedig a gyorsaságuk alapján rendezi őket sorba.

A rendszer a képernyő egy külön területén jelzi ki, hogy melyik felhasználó vezet, valamint egy másik területen, hogy korábban miként alakult a sorrend. Ez a két képernyőterület (a lista és az azt vezető felhasználó kiírása) az esetek többségében tökéletes szinkronban van, azonban ha egyszerre többen is kattintanak, akkor néha elcsúsznak egymáshoz képest az adatok, és az egész cucc egy olyan hibás állapotba ragad be, mely kijelentkezés után is megmarad.

Haverom engem kért meg, hogy járjak utána, mi lehet a gond, mert ő nem ért hozzá.

Oké, mondom, nézzünk rá. Van egy gomb, meghív egy JavaScript függvényt. Rendben, hol van az a függvény? Négy különböző .js fájlt is behív a fejléc. Nézzük csak meg, melyikben definiálják a kérdéses függvényt. Ez is megvan, öröm, boldogság. Függvényünk létrehoz egy AJAX  (XMLHttpRequest) objektumot, amit ráereszt egy bizonyos PHP-ra. Na, itt kezdtem el jegyzetelni, hogy ne zavarodjak bele a hierarchiába. :) Szóval van az Ajax objektum által meghívott PHP rengeteg egymásba ágyazott feltételfüggő (if {}) résszel. Ha egyszerre hatszáz dolog összeáll, akkor ez lefuttat egymás után egy csomó frissítő meg hozzáfűző MySQL lekérdezést.

Na, itt kezdtem el vakarni a fejem.

Vajon mi a ványadt fenéért írja be a cucc egyszerre ugyanazt több táblába is? Mi értelme van külön tárolni a listát vezető felhasználó adatait és magát a listát? Van-e valami konkrét funkció, ami indokolja ezt a redundanciát? Végül arra jutottam, hogy nincs itt semmi mélyebb megfontolás, egyszerűen egy koncepciótlan láma a fejlesztő.

A koncepció hiánya már abban is világosan megmutatkozott, hogy látva az egymás alatt sorban meghívott lekérdezéseket még nekem is az volt a legelső kérdésem, hogy mindez szép és jó, de vajon mi történik, ha egyszerre többen kattintanak a folyamatot elindító gombra a weblapon, vagyis ezáltal egy időben többen is lefuttatják az azt kiszolgáló PHP kódot? Ebben az esetben nyilván az történik, hogy az egyes meghívásokban szereplő SQL utasítások jó eséllyel összekeverednek. Az első fele az első felhasználó adataival hajtódik végre, a második fele a második felhasználóéval, végeredményként pedig  megkapjuk a hibát: nem lesz szinkronban a lista és az azt vezető felhasználót tároló adatrekord.

Innentől a jelenség kijavítása természetesen egyszerű ujjgyakorlat. A szóban forgó lekérdezésekkel érintett táblákat átalakítottam MyISAM formátumból tranzakció-biztos InnoDb formátumba, a különálló SQL utasításokat pedig egységbe foglaltam, vagyis BEGIN WORK és COMMIT utasítások közé helyeztem őket.

Láss csodát: volt hiba, nincs hiba.

Hogy miért írok erről külön bejegyzést?

Azért, mert ezzel most érdekes felfedezésre jutottam. A szóban forgó rendszer ugyanis a maga több ezer soros kódjával bár kétség kívül egy szorgos munkával összerakott projekt, amely egy darab felhasználóval tesztelve a professzionális kivitelezés látszatát kelti, de ennek ellenére olyan, a fentiekhez hasonló szarvashibáktól hemzseg, melyeket magam azért nem követnék el soha az életben, mert már a kezdetekben alapvető evidenciaként tanultam meg, hogy ügyelni kell ezekre a részletekre, ha nagyobb tömeget is ki akarunk szolgálni.

Akárki is készítette ezt a rendszert, legfeljebb kódolni tanult, de programozni soha.

Hasonló ez ahhoz a szituációhoz, mint amikor egy bizonyos, a webfejlesztés alapelveivel a jelek szerint szintén csak a saját tévhite szerint tisztában lévő kopasz blogger több felhasználói visszajelzés alapján eredetileg olyan blogrendszert fejlesztett a közössége számára, mely a bejelentkezett felhasználók jelszavait mindenféle titkosítás nélkül rakta ki sütibe (cookie). Már az is kiröhögni való megoldás, ha valaki teljességgel mellőzi a jelszavak hash-elését, de hogy ezt oda-vissza küldözgesse a felhasználó között, és még sütibe is írja, már tényleg a technikai kabaré netovábbja.

Mégis, a most általam kijavított PHP alapú rendszer fejlesztője akár több hónap kitartó munkájával összehozott valamit, melyhez nekem nem biztos, hogy lenne megfelelő türelmem, és ügyes üzleti érzékkel sikeresen áruba is bocsátotta.

Ami igazán meglepő számomra, hogy én, aki mindig is következetesen tartózkodtam attól, hogy úgymond informatikusnak nevezzem magam (csupán azt írtam le, hogy több megszerzett végzettségem elnevezésében benne van ez a szó, valamint hogy a folyamatban lévő egyetemi szakjaim többségének nevében úgyszintén szerepel) rendszeresen olyan megoldásokkal és megnyilvánulásokkal találkozom magukat magabiztosan informatikusnak és szoftverfejlesztőnek tituláló, de a valóságban szakmailag a nyomomba se érő emberek részéről, melyeket én soha nem követnék el, illetve amelyek láttán csak a fejemet fogom kínomban.

A lelkes amatőrök magabiztossága ennyit számítana az érvényesülés szempontjából? Mert ha igen, akár én magam is felhagyhatnék az eddigi tudatosan sugárzott szerénységgel, és istencsászárként pozícionálhatnám magam. xD

Mér' is ne, baszáj? Ennyi erővel. ;P

By SoDI


 
 
0 (0)
Jelentkezz be a szavazáshoz!

MySQL DateTime W3C dátum-idő formátumba

Az áldást sodika küldte 2008. július 21., hétfő - 0:00-kor
Kategóriák: Tutorial
Címkék: mysql php tutorial w3c
110 komment

Tudom, hogy ez pofonegyszerű feladatnak számít, azonban, miután a Google Sitemaps protokoll így követeli meg, és éppen egy ilyen webhelytérképet dobtam össze ma este, azt hiszem, érdemes egy rövid leírást adni ahhoz, hogy miként lehet a MySQL DateTime formátumát a W3C által meghatározott dátum-idő formátumúvá alakítani PHP 4-5 alatt.

Hátha valaki éppen erre az infóra keres rá, és jól jön neki. :)

Meg amúgy is tök rég bövítettem már a Tutorial rovatot, ugye.

Nézzük hát...

function w3cDatum($datetime) {
$datumresz = substr($datetime, 0, 10);
$idoresz = substr($datetime, 11, 8);
return $datumresz."T".$idoresz."+01:00";
};

Ennyi volna.

Gondolom túl sokat nem kell magyarázni rajta, ezért csak néhány szóban:

Van mondjuk a következő, MySQL DateTime formátumú dátumunk: 2008-06-24 21:27:15. Ezt kéne nekünk 2008-06-24T21:27:15+01:00 formátumba varázsolnunk. Nosza, egy datumresz változóba lecsípjük az első 10 karaktert, egy idoresz nevű változóba pedig az utolsó 8 karaktert.

PHP substr magyarázat

Ezeket egymás mellé írjuk, közéjük rakunk egy T betüt, legvégül pedig hozzábiggyesztjük, hogy milyen időzónában is vagyunk mi Greenwich-hez képest (+1 óra).

A cucc meghívása végül értelemszerűen így történik:

w3cDatum("2008-06-24 21:27:15");

Oszt ennyi.

By SoDI

Kapcsolódó:


 
 
0 (0)
Jelentkezz be a szavazáshoz!

RSS csatorna a blogunkon

Az áldást sodika küldte 2008. február 20., szerda - 21:30-kor
Kategóriák: Tutorial
Címkék: blog php programozas rss tutorial
53 komment

Tegnap valaki megkérdezte tőlem, hogy miként lehet RSS hírcsatornát megjeleníteni egy blogon, úgy, ahogyan nálam az SF blogja, illetve a SoDI egyéb blogjai doboz is működik.

Nos, mi sem egyszerűbb ennél. Használhatunk ehhez ingyenesen elérhető PHP-s RSS értelmezőket, (ilyen például a MagpieRSS, vagy a Last RSS), de dönthetünk úgy is, hogy saját magunk írjuk meg a megjelenítő kódot.

Szerencsére, ha ezt az utat választjuk, akkor sem kell bonyolult reguláris kifejezésekkel (egyfajta szövegszűrő maszkokkal, vagyis olyan kódokkal, melyekkel megadható, hogy egy bizonyos szövegből milyen speciális részeket akarunk kinyerni) szarakodnunk, ugyanis már a PHP 4 is tartalmazza azokat az XML értelmező függvényeket, amiket így szimplán meg kell hívnunk a munkához.  Ezeket a beépített függvényeket onnan ismerjük meg, hogy mindegyik úgy kezdődik, hogy xml_ (ikszemelaláhúzás :))

És hogy miért pont XML elemző kell nekünk? Hát azért, mert az RSS fájlok egyben XML fájlok is (jéééééé :DDD)

  • Egy XML fájl nagyon leegyszerüsítve olyan, mint egy HTML fájl, csak magunk határozhatjuk meg a cimkéket. Például:
    <?xml version="1.0">
    <MENHELY>
       <KUTYA>
          <SZIN="
    barna" />
          <NEV>
    Morzsi</NEV>
       </KUTYA>
       <KUTYA>
          <SZIN="
    fekete" />
          <NEV>
    Buksi</NEV>
       </KUTYA>
    </MENHELY>
    Így saját magunk is létrehozhatunk egyedi formátumokat. Az RSS is egy ilyen XML formátum, csak éppen annyival több egy házi készítésű formátumnál, hogy nemzetközileg elfogadott W3C szabvány.

Na akkor kezdjük is. Egyben megírjuk SF blogjának a hírdobozát. :) 

Annyit érdemes tudni, hogy PHP-ban a változókat $ jellel kezdjük.

$xml_elemzo = xml_parser_create();

Akármilyen meglepő, a fenti sorban annyi történik, hogy létrehoztunk egy XML elemzőt, melynek fantáziadúsan az xml_elemzo nevet adtuk.

Ez egy beépített PHP objektum. Úgy kell elképzelni, mint egy intelligens „virtuális lényt”, aki nem tud semmit, csak XML-t olvasni, de azt nagyon. Be van „idomítva” néhány ehhez kapcsolódó képességre (ezeket a dolgokat hívjuk metódusnak), és nekünk csak az ezekhez tartozó „parancsszavakat” kell ismernünk ahhoz, hogy megmondhassuk, „pontosan hova üljön a kutya”. :)

Na de menjünk is tovább...

xml_set_element_handler($xml_elemzo, "elemEleje", "elemVege");

Most megmondtuk a PHP-nek, hogy milyen függvényekkel akarjuk kezelni az XML elemzőnk által feldolgozni kívánt XML fájl kezdő- illetve záró címkéit (tag-jeit). Azt mondtuk neki, hogy az adott XML tag-ek kezdő címkéit az elemEleje, a végüket pedig a elemVege nevű függvényünk kezelje.

  • A saját magunk által megírandó PHP függvényekről most annyit érdemes tudnunk, hogy ezek (nagyon leegyszerűsítve) saját névvel azonosított kódrészek, melyek paraméterként fogadhatnak néhány, adatokat tartalmazó változót, ezen paraméterek segítségével csinálhatnak valamit, majd dolguk végeztével esetleg az eredményt is visszaadják.

Az imént említett függvényeket majd később megírjuk.

xml_set_character_data_handler($xml_elemzo, "karakterAdat");

Most megadtuk, hogy az XML elemzőnk a feldolgozni kívánt XML fájlunk szöveges adatainak elemzését melyik függvénnyel végezze el. A karakterAdat nevű függvényt választottuk ki ehhez. Ezt majd szintén később írjuk meg.

$fajl = fopen("http://reakcio.blogspot.com/feeds/posts/default?alt=rss","r")
   ...

Ehun ni most megnyitottuk SF blogjának az RSS feed-jét, olvasásra (a végén ezt jelöli az r, mint read). A megnyitott fájlt fajl néven nyitjuk meg. :)

...
or die
("Hiba az RSS olvasása közben.");

Ha viszont valamiért nem tudtuk megnyitni, akkor sírjunk be. ;)

while ($adat = fread($fajl, 4096))
   ...

Amíg a fájl végére nem érünk (vagyis amíg kerül onnan adat az adat nevű változóba), olvassuk be a megnyitott RSS fájl újabb és újabb 4 Kb-os darabjait.

Az itteni ciklusmagon belül történik maga az XML elemzés.

xml_parse($xml_elemzo, $adat, feof($fajl))
   ...

Itt azt mondjuk, hogy elemezze ki a korábban létrehozott elemzőnk (xml_elemzo) segítségével az imént beolvasott adatot, ha pedig a fájl végére értünk (feof - eof - End Of File), akkor belőle a végéig még hátralévő darabot.

or die(sprintf("XML hiba: %s ebben a sorban: %d"
   ...

Ha viszont hibát találtunk, akkor haljunk meg :-)), vagyis írjuk ki, hogy milyen hiba ez, és hogy hányadik sorban akadtunk rá. Ebben segít nekünk a speciális kiírásokat végző sprintf nevű kiíró függvény. Ez első paraméterként egy idézőjelek között lévő szöveget vár, melyet tetszőleges helyen %s illetve %d szövegekkel tarkíthatunk. A %s szöveges információt, míg a %d tetszőleges számot jelöl. Ezeknek a jelöléseknek a helyére a sprintf függvénynek a legelső után következő paramétereit helyettesíti be a PHP.

  • Például a $mondat = sprintf ("A nevem %s.","Sodika");
    PHP utasítás végrehajtása után a mondat változóba ez a szöveg kerül:
    A nevem Sodika.

Nézzük csak, mi kerül az RSS-olvasó programunkban a % jelek helyére...

...
xml_error_string
(xml_get_error_code($xml_elemzo)),

Lekérjük a keletkezett hiba kódját (error code), majd pedig az annak megfelelő szöveges hibaüzenetet (error string). Mivel ez a sprintf függvény második (az első utániak között a legelső) paramétere, így a visszakapott hibaüzenet az eredeti szövegben az elsőként szereplő %s jelölés helyére kerül.

xml_get_current_line_number($xml_elemzo)));

Mivel a mostani kódrész végrehajtására akkor kerül sor, ha hibát találtunk, ez a hiba nyilván azon a helyen van, ahol aktuálisan állunk. Ezt a helyet lekérjük egy számként. Mivel az sprintf függvény utolsó paramétere, így az eredmény az utolsó helyettesítő jelölés, vagyis a %d helyére kerül be.

fclose($fajl);

Miután végeztünk az RSS csatorna feldolgozásával, zárjuk be a fájlt.

xml_parser_free($xml_elemzo);

Legvégül megszüntetjük az eddig használt XML elemzőnket, ugyanis a továbbiakban már nincs szükségünk rá.

Ez mind nagyon szép, mind nagyon jó, mindennel nagyon meg vagyunk elégedve, akárcsak Ferencjóska, úgyhogy már csak azokat a függvényeket kell megírnunk, amiket az imént hozzárendeltünk az XML elemzőnkhöz. Ugye három ilyen függvény van elemEleje, elemVege, és karakterAdat névvel.

Haladjunk sorban.

function elemEleje($elemzo, $nev, $attributumok) {

... 

}

Az elemEleje függvény három paramétert vár. (Ezeket az xml_set_element_handler kezelő küldi neki, mivel ott határoztuk meg ezt a függvényt).

A három paraméter:

  1. Hivatkozás egy XML elemzőre (itt elemzo néven)
  2. Az aktuális XML elem (tag) nevét (itt nev néven)
  3. És egy asszociatív tömböt, ahol az attribútumok vannak. (Itt attributumok néven. Ebben a kulcsok az egyes XML attribútumok nevei lesznek, míg az értékek az attribútomok értékeivel egyeznek meg.)
  • A tömb olyan adatszerkezet, melyben adott típusú adatok sorozatát tárolhatjuk. Ezekre az adatokra a tömbön belüli indexükkel (sorszámukkal) hivatkozhatunk. Az asszociatív tömb pedig olyan tömb, ahol az egyes adatokat azonosító egyedi indexek nem számok, hanem szövegek.

Vegyük például az alábbi XML tag-et:

<kutya szin="piros" />

Az asszociatív tömb kulcsmezője itt a szin lesz, az aktuális elem értéke pedig az, hogy "piros".

Ezt az attributumok paramétert különben élesben nem fogjuk használni, ugyanis kizárólag a xml_set_element_handler megkötései miatt voltunk kénytelenek berakni a függvényünk paraméterlistájába.

Menjünk tovább... :)

global $elemenBelul, $tag, $cim, $leiras, $hivatkozas;

Meghatározunk néhány globális változót. Ezek attól globálisak, hogy a PHP fájlunk minden részében tetszés szerint használhatjuk őket; függvényeken belül és kívül egyaránt.

Hogy pontosan megérthessük, melyik változóra miért van szükség, elemezzük egy kicsit, hogyan néz ki az RSS kódben egy átlagos elem (hír) leírása.

 <item>
   <title>A hír címe</title>
  
<link>A hír URL-je (Internetes webcíme)</link>
   <punDate>
A hír URL készítésének időpontja</PubDate>  
   <description>A leírása (szövege)</description> 
 </item>

Egy konkrét Index hírnél például ez így néz ki:

<item>
   <title><![CDATA[Lőfegyvereket találtak Tolnában]]></title>
   <link>http://index.hu/politika/bulvar/bulvarhirek/343294</link>
   <pubDate>Tue, 19 Feb 2008 21:54:00 +0100</pubDate>
   <description><![CDATA[Autóban és lakásban is találtak lőszert és fegyvert a rendőrök.]]></description>
</item>

Itt a <![CDATA[szöveg]]> jelölés egy szöveges tartalmat azonosít. Enélkül nem lesz szabványos (másnéven valid) a kód, vagyis a legtöbb RSS olvasó nem tudná helyesen értelmezni.

Nos, visszatérve a globális változóinkra...

  • az elemenBelul logikai (true/false, igaz/hamis) változó azt jelzi, hogy egy item elemen belül járunk-e. A logikai változót úgy tudjuk elképzelni, mint egy érmét, amit leteszünk az asztalra. Lehet felül a fej (igaz érték), vagy az írás (hamis érték).
  • a tag elem azt jelzi, hogy pontosan melyik XML (RSS) tag-nél járunk
  • A cím az adott elem címét jelöli (TITLE tag)
  • A leiras az adott elem tartalmát jelöli (DESCRIPTION tag)
  • A hivatkozas pedig az elem Internetcímét jelöli (LINK tag)

Na folytassuk az elemEleje függvényünk megírását...

 if ($elemenBelul) {
      $tag = $nev;
 } elseif ($nev == "ITEM") {
      $elemenBelul = true;
 }

Ha egy elemen belül (vagyis ITEM tag-en belül) járunk, akkor a tag változó legyen egyenlő az aktuális XML tag nevével (vagyis azzal, ahol éppen állunk, más szóval, amit éppen olvasunk). Ha viszont nem ilyen ITEM tag-en belül járunk, de az aktuális nyitó tag éppen egy ITEM, akkor az elemenBelul globális változónk igazra állításával jegyezzük fel ezt a tényt.

Egyszerűbben: ha feldolgozás közben éppen most lépünk az RSS feed egy hírének leírásába (ITEM tag-jába), akkor ezt jelezzük az elemenBelul változó igazra állításával, egyébként pedig, ha már egy ilyen híren belül járunk, akkor a tag nevű változó jelölje azt, hogy a hír leírásának melyik részét olvassuk éppen (a linkjét, az időpontját, vagy esetleg valami mást?).

Na, ezzel az elemEleje függvényt ki is veséztük.

Következzen a elemVege függvény, ami a záró XML elemek (tag-ek) feldolgozását végzi.

function elemVege($elemzo, $nev) {
   ...
}

Mint láthatjuk, ez a függvény két paramétert vár. Egyrészt kéri az XML elemzőnket, másrészt pedig annak a XML elemnek (tag-nek) a nevét, melyből éppen kilépünk.

if ($nev == "ITEM") {
   ...
}

Az előző sor jelentése: Ha éppen egy ITEM elemből, vagy egy önálló hír leírásából léptünk ki... ...

...
printf
("<b><a href='%s' target='_blank'>%s</a></b>",
   trim($hivatkozas),htmlspecialchars(trim($cim)));

A printf függvény ugyaúgy működik, mint a korábban már ismertetett sprintf függvény, annyi különbséggel, hogy míg az előbbi a képernyőre, addig az utóbbi egy szöveges változóba tölti az eredményét. Vagyis, mint ahogy már láttuk a sprintf függvény ismertetésénél, az idézőjelek között lévő két %s karakter behelyettesítésre kerül az első paraméter után következő két paraméterrel (itt: szöveges információval).

Az első %s helyére az éppen olvasott (feldolgozott) hír URL-je (linkje, hivatkozása) kerül, míg a második %s helyére annak címe.

A trim PHP függvényről azt érdemes tudni, hogy kiszedi a szöveg elejéről és végéről a felesleges szóközöket. Mint láthatjuk, a href HTML tag-ba beírandó hivatkozással (linkkel), és az aktuálisan feldolgozandó cikk (éppen olvasott RSS hír) címével is elvégezzük ezt a műveletet.

A htmlspecialchars függvény pedig egyes speciális karaktereket alakít át olyan módon, hogy ne zavarják meg a HTML kódot. Így a & jelet arra alakítja át, hogy, &amp;, a " jelet pedig arra, hogy &quot;, satöbbi. Ezek csak a lap forráskódjában (HTML kódjában) változnak meg, a felhasználó számára már eredeti alakjukban látszanak.

Ha ez a két karakterkezelő függvény egymásba van ágyazva (htmlspecialchars(trim(szöveg))), akkor egyszerre mindkét művelet, vagyis az üres helyek, és a speciális HTML karakterek kiszűrése is megtörténik. 

  ...
   $cim = "";
   $leiras = "";
   $hivatkozas = "";
   $elemenBelul = false;
}

Mivel az elemVege függvényünk, amiben vagyunk (pontosabban az ahhoz tartozó, if-fel kezdődő, feltételfüggő kódrészünk) azt az esetet kezeli, ha éppen kiléptünk egy ITEM tag (RSS hír) vizsgálatából, annak feldolgozása (vagyis kiírása) után érdemes lenullázni a rá vonatkozó adatokat, és így azt is jelezni, hogy már nem elemen belül (adott hír RSS-leírásán belül) járunk.

Egyszerűbben: Ha már elolvastunk egy hírt, és ki is írtuk, akkor tök mindegy, milyen adatok vonatkoztak rá, ezeket nyugodtan törölhetjük.

No már csak a karakterAdat függvényünk van hátra.

function karakterAdat($elemzo, $adat) {
   global $elemenBelul, $tag, $cim, $leiras, $hivatkozas;
   ...
}

Ez a függvény, mint már írtam, az XML feldolgozás közben a karakteres adatok kezelését végzi. Ehhez előszöris meg kell kapnia paraméterként az XML elemzőnket, valamint azt a szöveges adatot, amit az elemzőnk éppen olvas.

Egyben jeleznünk kell, hogy használni kívánjuk azokat a globális változókat, melyekben az XML (RSS) feldogozása közben a köztes adatokat jegyeztük fel (global ... rész).

Most pedig nézzük a függvény belső részét... 

if ($elemenBelul) {
   switch ($tag) {
      case "TITLE":
         $cim .= $adat;
      break;
      case "DESCRIPTION":
         $leiras .= $adat;
      break;
      case "LINK":
         $hivatkozas .= $adat;
      break;
   }
}

Mint látjuk, az egész kódrész csak akkor hajtódik végre, ha éppen egy elemen belül (egy adott RSS hírleíráson belül) vagyunk. ( if (feltétel) { utasítások} )

A switch ($tag) résszel fejezzük ki azt, hogy attól függően, éppen melyik XML tag-et olvassuk, más és más kódot szeretnénk végrehajtani (esetszétválasztás).

A .= operátor pedig egy szöveges változó végéhez fűz hozzá egy másik szöveget.

Például
$kutya .= "Buksi
";
$kutya .= "ka
";
echo $kutya;

Utasítássor azt írja ki, hogy Buksika.

De nézzük csak meg, konkrétan milyen eseteket vizsgálunk itt:

  • Ha a TITLE tag-ben járunk, akkor a cim változó végére fűzzük hozzá az éppen kiolvasott adatot.
  • Ha a DESCRIPTION tag-ben járunk, akkor a leiras változó végére jegyezzük fel ugyanezt.
  • Ha pedig a LINK tag-ben járunk, akkor a hivatkozás változó tartalmához kell hozzáfűzni ezt az adatot.

Azt, amit itt feljegyeztünk címként, leírásként, és hivatkozásként, értelemszerűen majd az elemVege függvényben fogjuk felhasználni, amint az RSS feldolgozás közben egy adott ITEM tag végére, vagyis adott RSS hírleírás végére értünk.

Ezzel készen is volnánk.

<html>
<head>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>PHP alapú RSS értelmező</title>
</head>
<body>
<?php
$elemenBelul = false;
$tag = "";
$cim = "";
$leiras = "";
$hivatkozas = "";
function elemEleje($elemzo, $nev, $attributumok) { 
   global $elemenBelul, $tag, $cim, $leiras, $hivatkozas;
    if ($elemenBelul) {
       $tag = $nev;
    } elseif ($nev == "ITEM") {
       $elemenBelul = true;
   }
}
function elemVege($elemzo, $nev) {
   global $elemenBelul, $tag, $cim, $leiras, $hivatkozas;
   if ($nev == "ITEM") {
      printf("<b><a href='%s' target='_blank'>%s</a></b>",
      trim($hivatkozas),htmlspecialchars(trim($cim))); 
      $cim = "";
      $leiras = "";
      $hivatkozas = "";
      $elemenBelul = false;
   }
}
function karakterAdat($elemzo, $adat) {
   global $elemenBelul, $tag, $cim, $leiras, $hivatkozas;
   if ($elemenBelul) {
      switch ($tag) {
         case "TITLE":
            $cim .= $adat;
         break;
         case "DESCRIPTION":
            $leiras .= $adat;
         break;
         case "LINK":
            $hivatkozas .= $adat;
         break;
      }
   }
}

$xml_elemzo = xml_parser_create();
xml_set_element_handler($xml_elemzo, "elemEleje", "elemVege");
xml_set_character_data_handler($xml_elemzo, "karakterAdat");
$fajl = fopen("http://reakcio.blogspot.com/feeds/posts/default?alt=rss","r")
   or die("Hiba az RSS olvasása közben.");
while ($adat = fread($fajl, 4096))
     xml_parse($xml_elemzo, $adat, feof($fajl))
        or die(sprintf("XML hiba: %s ebben a sorban: %d"
             xml_error_string(xml_get_error_code($xml_elemzo)),
             xml_get_current_line_number($xml_elemzo)));
fclose($fajl);
xml_parser_free($xml_elemzo);
?>

</body>
</html>

A fenti kódot bárhol tudjuk használni, ahol van PHP 4-5 támogatás, és engedélyezve van a külső fájlok megnyitása (több helyen, például az extra.hu oldalain ez sajnos le van tiltva).

  • A fenti kód futás közben megtekinthető ide kattintva.
  • A forráskód letölthető innen (zip).

Ha pedig arra vagyunk kíváncsiak, hogy ezt a végeredményt hogyan tudjuk olyan módon berakni a blogunkba, mint ahogy én is megjelenítem az egyes RSS dobozokat ezen a blogon, akkor kattintsunk ide, mert nem is olyan régen ehhez is készítettem egy hasonlóan részletes tutorialt. 

By SoDI


Kapcsolódó anyagok:


 
 
0 (0)
Jelentkezz be a szavazáshoz!

MySQL DateTime RSS formátumba alakítása

Az áldást sodika küldte 2007. augusztus 8., szerda - 14:19-kor
Kategóriák: Tutorial
Címkék: mysql php programozas rss
28 komment

Hogyan alakítsuk át PHP-ban az MySQL datatime adatokat RSS 2.0-ához szükséges RFC 822 formátumúvá?

Azt hiszem, hasznos lehet, ha szerepel erre itt egy használható megoldás, mert sehol sincs normálisan leírva, pedig gyakori feladat, hogy valaki RSS kimenetet szeretne kódolni. (Én most konkrétan az Országos Tüntetés Nyilvántartás fejlesztői blogjánál ütköztem bele ebbe a problémába).

Ugye a MySQL datatime formátumban tárolva így néz ki egy dátum:

2007-08-07 22:03:44

Az RSS 2.0-ához viszont RFC 822 formátum kell, ami így néz ki:

Tue, 07 Aug 2007 22:03:44 +0200

Nos, ennek a nagyobbik részét könnyűszerrel előállíthatjuk a MySQL formátum megfelelő szövegrészeinek pakolgatásával, azonban ott van az elején az a hülye hárombetűs jelzés, ami azt mutatja, hogy ez éppen a hét melyik napjára esik. Ilyet viszont az eredeti adatban nem találunk.

Nos, tudnunk kell, hogy a PHP az 1970 január 1. éjfél óta eltelt másodpercekben kezeli a dátumadatokat (ez a fenti példánál egészen pontosan 1186517024). Ezt hívjuk időbélyegnek, és az éppen aktuális időpontra vonatkozóan a time() paraméter nélküli PHP függvénnyel kérdezhetjük le.

Ezt az időbélyeget aztán könnyűszerrel alakíthatjuk RSS-hez szükséges formátumúvá (vagyis a hét napját is tartalmazó alakúvá) a date() beépített PHP függvény segítségével.

date (r, time() );

Ahol az r betű jelenti azt, hogy a választ RCF 822 (RSS) formátumban kérjük.

Igen ám, csakhogy mi most nem a pontos időnek, hanem egy adatbázisból kiolvasott dátumnak az időbélyegére vagyunk kíváncsiak. Szerencsére erre is van a kezünkben beépített PHP függvény mktime() néven, amelyik 6 különböző paramétert vár, ebben a sorrendben:

  1. óra
  2. perc
  3. másodperc
  4. hónap
  5. hónap napja
  6. év

Ha megfigyeljük, ezek közül már mindegyik adatot ki tudjuk hámozni a MySQL datatime formátumából. Erre szolgál a szövegrészletek kinyerését végző substr() nevű függvény. Ez első paraméterként az eredeti szöveget várja, második paraméterként azt, hogy melyik indexű karaktertől szeretnénk elvágni a szöveget, a harmadik, opcionális paraméterként pedig azt, hogy hány karakter hosszú szövegrészt kérünk.

Így például ennek, hogy

substr ('Szálasi Ferenc jó ember volt.', 8,7);

az a kimenete, hogy Ferenc.

Készen is vagyunk, ezek alapján meg is írhatjuk a függvényünket.

Megkapjuk a MySQL datatime értéket, előállítjuk belőle az időbélyeget, végül pedig ebből az RSS-nek megfelelő formátumot.

function rssDatum ($datetime)
{
     $ev = substr($datetime,0,4);
     $honap = substr($datetime,5,2);
     $nap = substr($datetime,8,2);
     $ora = substr($datetime,11,2);
     $perc = substr($datetime,14,2);
     $masodperc = substr($datetime,17,2);
     $idoBelyeg = mktime( $ora, $perc, $masodperc, $honap, $nap, $ev);
     $rssIdo = date(r, $idoBelyeg);
     return $rssIdo;
};

Ha ezt meghívjuk kiírásra:

echo rssDatum('2007-08-07 22:03:44');

Megkapjuk válaszként az RSS-kompatibilis kimenetet:

Tue, 07 Aug 2007 22:03:44 +0200

Ennyi.

By SoDI 


 
 
0 (0)
Jelentkezz be a szavazáshoz!

Államrend Megdöntése Projekt - II.

Az áldást sodika küldte 2006. október 14., szombat - 17:23-kor
Kategóriák: Államrend Projekt
Címkék: alkotmanyos allamrend elkurtuk forradalom gyurcsany megdontese mszp mysql php politika rend
3 komment

Na kérem szépnem.

Miután a Nemzetbiztonsági Sóhivatal volt olyan kedves, és egy ócska kísérletet tett arra, hogy megfélemlítsen mindenkit, aki nem kér egy elmebeteg gazember országlásából, azt hiszem, ha volt akár egy szemernyi ok is, ami miatt mértékletességet kellene tanusítani az elnyomó rezsimmel szemben, az mára végleg szertefoszlott.

A fiatal gyerekek életét derékba törő vérbírósági koncepciós ítéletek, az igazságügy minisztérium autonómiáját leromboló rendvédelmi Petrétei-ÁVH, és az ártatlan magyarok kollektív bűnösségét kimondó NBH-fenyegetés mind-mind csak arra jó, hogy azok szeme is felnyíljon a demokrácia sárba tiprása láttán, akik eddig aludtak volna. Akiket pedig még a pszichikai bűnsegédlet vádjával se lehet rács mögé dugni, azt majd nyomorba dönti Lampeth némber, minden fejlesztési pénzt hű lumpenállatok maroknyi Fidesz-mentes városa felé irányítva.

Az ország immunrendszere, a józan nemzeti ellenállás bár egyre erősebben kezd működni, a vörös métely az önkormányzati választások után is csupán mélyebbre húzódik, hogy onnan eméssze tovább a nemzettest szöveteit. Túl erős lenne a Fidesz? Sebaj, a rosszindulatú daganat áttétet képez a nemesebb szövetek felé, ha kell, törvénymódosítással torzítja el a területfejlesztési tanácsokat, hogy azok véletlenül se türközzék a valós népakaratot. Mert ami egészséges, az a rákos szöveteknek csak fájdalom. A szocik egyre szemérmetlenebbek, mert úgy érzik, hogy akárhányszor is buknak le, akármilyen gaztettet is visznek véghez, az mindig következmények nélkül marad. Majd a választások előtt fél évvel megint készítenek néhány látványos tv-spotot, és a sok paraszt menten elfelejti, hogy átkúrták a fejét. Az öszödi beszéd ebből a szempontból is egyértelműen fogalmaz. Én nem tudom nyugodt szívvel azt mondani nektek, hogy ez nem lesz így. Éppen ezért, most kell megragadni a kínálkozó alkalmat, hogy egyszer és mindenkorra elsöpörhessük a hatalomból és a közéletből a fasiszta kommunizmus minden bűzlő maradékát!

Szó, ami szó, az elmúlt eseményei csak megerősítettek benne, hogy jó úton járok, amikor a magam eszközeivel teszek azért, hogy a magyarság végre kitörjön a vörös csapdából.

Tehát a projekt...

Ugye az első részben ott hagytuk abba, hogy lefektettük az alapelveket, miszerint szükség van egy közösségi térre, ahol a népakarat szavazások útján a legapróbb kérdésekben is érvényesül, és ahol összefogva, egyben lehet kezelni a nemzethatalom gyökeres átstruktúrálásához szükséges erőforrásait, miközben a rendszer felépítése a kormánnyal szembeni elvi konspirációra is alkalmas marad. Tisztáztuk továbbá, hogy az ország napi GDP-jének igen jelentős hányada múlhat néhány főbb fővárosi bekötőút átjárhatóságán.  Mára azt ígértem nektek, hogy elkezdjük a konkrét technikai tervezést is, hogy lehetőleg hétfő, de legkésőbb a hétfő-kedd magasságában, működőképes legyen a rendszer, de előbb tisztázzuk azt, hogy konkrétan mit is értek a kormányzattal szembeni konspirációs erőn.

  • Általában ha az ember komolyan megmozdul, és saját személyes egzisztenciáját is veszélyeztető tartalmat publikál, azt általában rejtve, külföldi szerverek, és strómanok háta mögé bújva teszi. Ezzel szemben én a ballib Index által működtetett ingyenes blogmotort használom a Projekt leírásához, miközben a szervezkedés informatikai hátterét szintén olyan környezetben tervezem kialakítani, ami egyértelműen a nevemhez köthető. Mindez kiválóan alkalmas arra, hogy a nyomozó hatóságok szemében óvatlan idiótának, vagy szórakozó hülyegyereknek tűnjek. Ha ezekkel az eszközökkel sikerül elérni, hogy ne vegyenek kellően komolyan, az nagyszerű fegyvertény lehet a kezünkben, és annál nagyobb lehet az ő meglepetésük, amikor a rendszerből a legváratlanabb pillanatban, elsöprő erejű vihar tör ki.
  • Aztán ott van még az a lehetőség is, hogy éppen az a célom, hogy lekössem az illetékesek figyelmét egy álnyilvános csalival, miközben a háttérben, sokkal rejtettebben, zavartalanul folyhat a valódi mozgolódás a bolsi trónbitorlók alkotmányos rendnek csúfolt gaz zűrzavarának a felszámolására.
  • Lehet továbbá, hogy csak egy unatkozó bölcsész, vagy szociológus hallgató vagyok, aki ezzel a projekttel gyűjt anyagot valamelyik szemináriumi dolgozatához.
  • Lehetek még az NBH egy tisztje is, akinek az a célja, hogy tőrbe csalja, és ellehetetlenítse a valóban tettrekész magyarokat. Esetleg pszichikai bűnsegédletbe hajszolja őket. :-)
  • Lehet továbbá, hogy én magam vagyok Budaházy György.
  • Lehetek továbbá egy hazaszerető, őszinte tettvágytól fűtött jobboldali fiatal is, aki ezzel a bátor kiállással akarja megüzenni a világnak, hogy akinek valóban fontos a szabadság a saját hazájában, az úgy jár el helyesen, ha félrerakja saját személyes érdekeit, elnyomja magában a hatalommal szembeni minden félelmét, és arcát, nevét büszkén vállalva kiáll ezen eszmék mentén, mint ahogy Tomcat is teszi.
  • De az is lehet, hogy csak hülye liberális köcsög vagyok, és azt akarom bebizonyítani a 'turbómagyaroknak', hogy nincs itt az országban semmi féle rendőri túlkapás, elvégre én itt durva dolgokat írok le, mégse történik velem semmi.

Hogy a fentiekből melyik fedi legpontosabban a valóságot, az olvasóra bízom. Azért írtam le az összes szóba jöhető verziót, mert pontosan tudom, hogy ha nagyobb nyilvánosság előtt publikálom a projektet, amúgy is fel fog merülni itt-ott az egyik vagy másik, különböző fórumokon "jól értesült" hozzászólók tucatjai fogják felvilágosítani egymást pro és kontra, tehát a legjobb, ha elébe megyek a történéseknek, és én magam gyűjtöm össze ezeket az ötleteket. No meg ezért, mert ez a bizonytalansági tényező jelenthető a valódi konspirációs erőt a hatalommal szemben.

Mára ennyit a konspirációból. Holnap azt fogom kifejteni, mit értek pontosan az alatt, hogy összefogva kell kezelni a nemzet birtokában lévő erőforrásokat, és hogy lesz ebből elképesztően hamar az alkotmányos rend megdöntése.

De előbb - még ha csak vázlatosan is - kezdjünk bele végre a technikai tervezésbe! Először is vegyük számba, hogy milyen adatok nyilvántartására van szükség. A rendszerben rögzíteni kell egyrészt az ellenállás résztvevőinek felszereltségét, és elszántságát. Felszereltség alatt azt értem, milyen járművel, vagy egyéb eszközzel képes útlezárásra, elszántság alatt pedig azt, hogy a törvényes keretekkel milyen arányú átfedéssel gondolja az illető a hozzájárulását. Szükség van továbbá fixen megjelölt helyszínekre, ahova a forradalmi irányító rendszer elosztja a részvevőket. Itt a Budaházy György által javasolt logisztikai utat követjük, miszerint (és most egy idemásolt idézet):

Budapest blokádjához szükséges útlezárások (a „!!!”-lel megjelöltek a
kiemelten fontosak)

1. 11-es főút és a 2/A találkozása, Budapest határa !!!
2. Országút Pilisszentkereszt előtt, Esztergom felé
3. 10-es főút Piliscsaba és Pilisszentiván között !!!
4. Országút Budakeszi és Budapest határában
5. 1-es főút M0 csomópont !!!
6. M1, M0 csomópont !!!
7. M7, M0 csomópont !!!
8. 7-es főút M0 csomópont, Diósdnál !!!
9. 6-os főút M0 csomópont !!!
10. M0 csomópont Szigetszentmiklósnál
11. 510-es főút Dunaharasztinál !!!
12. 5-ös főút M0 csomópont !!!
13. M5, M0 csomópont !!!
14. M0 Gyáli leágazás csomópont
15. 4-es főút Üllő előtti kerülő leágazás csomópont !!!
16. 400-as főút Üllő
17. 31-es főút Budapest határában !!!
18. Országút Pécel után, Budapest határában
19. Országutak Budapest felé Nagytarcsánál
20. 3-as főút Kistarcsa után, Budapest határában !!!
21. M3, 2/B autóút csomópont !!!
22. 2/B Fóti úti csomópont
23. 2/A, 2/B csomópont !!!
24. 2-es főút 2/A elágazás Káposztásmegyernél !!!

Forrás: kuruc.info

A forradalmárok elosztása e helyszínek között a vállalásaikat is figyelembe véve, de alapvetően véletlenszerűen történik. (Bár arra indokolt mértékben lehetőséget kell adni, hogy valaki jelezze, ha egyik társával közösen akar államrendet dönteni.

Mindemellett tehát szükség van egy szavazórendszerre is, amin keresztül a népakarat érvényesülhet. Ezen kívül már csak egy hírlevél-rendszer kell, amin keresztül a rendszer kiértesíti a hatalomátvétel időpontját mindenkinek. (Azt, hogy ez mennyivel történjen a tényleges akció előtt szintén szavazás fogja eldönteni.).

Holnap a részletekbe menően fogom megtervezni a nyilvántartáshoz szükséges adatbázis-szerkezetet.

Addig is legyetek jók. :-)


 
 
0 (0)
Jelentkezz be a szavazáshoz!