itthon / Közösségi média / 1c példa a http kérésfejlécekkel való munkavégzésre

1c példa a http kérésfejlécekkel való munkavégzésre

Az 1C-ről a 8.3.9.2170 platformverziójú webhelyre történő információküldési eljárás kidolgozásakor problémába ütköztem: a webhely fejlesztője lehetővé tette számomra, hogy a szükséges információkat csak HTTP-kéréssel rögzítsem a PUT módszerrel.

Kétszeri gondolkodás nélkül felvázoltam egy egyszerű kódot:

Kapcsolat = Új HTTPKapcsolat("www.mysite.ru"); Fejlécek = Új egyezés; Headers["Content-Type"] = "alkalmazás/x-www-form-urlencoded"; Request = New HTTPRequest("/api/order_items/93076?order_item=30", fejlécek); Connection.Write(Request);

A lebonyolítás eredménye alapján a raktárba érkezett áruk mennyiségét be kellett volna írni a weboldalon a vevő megrendelésének megfelelő sorába.

Azonban, mint valószínűleg már értette, nem történt semmi. Miután meggyőződtem arról, hogy nincsenek hibák a webhelyen (hasonló kérés küldésével egy Chrome-bővítményen keresztül), elindítottam a helyi számítógép webszervert, és elkezdett kísérletezni.

Egy furcsa dolog azonnal kiderült: A fenti kód nem PUT, hanem HEAD kérést generál!

Az Apache naplóiban a következőket láttam:

127.0.0.1 - - "HEAD /api/order_items/93076?order_item=30 HTTP/1.1"

Kicsit meglepődtem (végül is a kézikönyvben fekete-fehéren szerepel a PUT), de nem voltam megzavarodva - a módszert közvetlenül hívhatja:

Connection.CallHTTPMethod("PUT",Kérés);

A naplók ugyanezt mutatják:

127.0.0.1 - - "HEAD /api/order_items/93076?order_item=30 HTTP/1.1"

– Lehet, hogy valamit rosszul csinálok? - tettem fel magamnak egy kérdést. De az interneten vagy a kézikönyvekben nem voltak utalások. Nos, a tudományos piszkálás módszerét még senki nem mondta le. Kezdésként a következőt próbáltam ki:

Connection.CallHTTPMethod("fyvfyv",Request);

A kapott naplókban:

127.0.0.1 - - "?????? /api/order_items/93076?order_item=30 HTTP/1.1"

Érdekes módon ez azt jelenti, hogy az 1C kifejezetten a PUT módszert helyettesíti (miért nem tetszett az 1C-nek?).

Néhány további próbálkozás után erre jutottam:

Connection.CallHTTPMethod("PUT",Kérés);

A kapott naplókban:

127.0.0.1 - - "ÍRJA MEG /api/order_items/93076?order_item=30 HTTP/1.1"

És ez a lehetőség már működött az oldalon, és mindenki elégedett volt.

Helyesebb megoldást javasolt a problémára: meg kell adni egy kérés törzset, bármilyen testet, még üresen is. Például ez az opció működni fog:

Kapcsolat = Új HTTPKapcsolat("www.mysite.ru"); Fejlécek = Új egyezés; Headers["Content-Type"] = "alkalmazás/x-www-form-urlencoded"; Request = New HTTPRequest("/api/order_items/93076?order_item=30", fejlécek); Request.SetBodyFromString("",TextEncoding.UTF8, UseByteOrderMark.NotUse); Connection.Write(Request);

És valószínűleg teljesen helyes, ha magukat a paraméterértékeket adjuk át a kérés törzsében.

A következtetés a következő: az 1C platform hibásnak tekinti a törzs nélküli PUT kérést, és a metódust a HEAD-re cseréli.

Érdekes, hogy az 1C nem követi nyomon a POST kérést törzs nélkül, és nem alakítja át GET-té, szórakozásból megnéztem.

Ahogy a jól ismert Vovochka mondaná a híres viccből: „Hol a logika?”

Remélem, kiadványom valakinek több órát megspórol az életéből a válasz keresésében. =)))

A platform második 8-as verziójától kezdve a felhasználóknak és a fejlesztőknek lehetőségük van a http kérés közvetlen használatára az 1C-ben. A program kétféle lekérdezést támogat:

  • POST kérések;
  • GET kéréseket.

Így egy meglehetősen kényelmes eszközt hoztak létre az adatcserére, valamint a webszolgáltatásokkal és a http-n keresztül működő szolgáltatásokkal való interakcióra.

GET kérés

Természetesen a lekérdezések használatának legegyszerűbb példái sokkal jobban illusztrálják képességeiket, mint sok leírás. Tehát próbáljuk meg:

  1. Szerezzük meg oldalunk főoldalának törzsét;
  2. Dolgozunk a kérés átirányításán;
  3. Vegyük a képet az oldalról.

A webhely törzsének lekérése

Kezdjük valami egyszerűvel. ábrán..

Ennek a kódrészletnek a végrehajtásának eredménye egy meglehetősen nagy szöveg, amelynek utolsó szakasza a 2. ábrán látható.

2. ábra

A kód első sorában létrehozunk egy kapcsolódási objektumot a http erőforráshoz. Egy objektum a következő tulajdonságokat tartalmazhatja:

  • Szerver – a szerver címét tartalmazó kapcsolati karakterlánc;
  • Port – a szerver portját jelző számot tartalmaz; alapértelmezés szerint a kapcsolat típusától függően 80-at adhat meg nem biztonságos kapcsolatok vagy 443 SSL-védett esetén.
  • Felhasználónév – jelzi, ha jogosultság szükséges a szerveren;
  • Jelszó – felhasználói jelszó a megadott erőforráson;
  • Proxy – tartalmazhat egy InternetProxy típusú objektumot, amely jelzi, ha proxyt használnak a szerverrel való kommunikációhoz;
  • Biztonságos kapcsolat – az alapértelmezett érték FALSE, az IGAZ-ra váltás a https protokoll használatát jelzi.

Ezenkívül a HTTPConnection objektum saját metódusokkal rendelkezik, amelyek meghívása lehetővé teszi a kezelő végrehajtási algoritmusának részletesebb leírását:

  • CallHTTPmethod – két kötelező paramétert tartalmaz, a HTTPmethod-ot és a HTTPrequest-et, támogatja a választörzs írásának lehetőségét a harmadik paraméterben megadott fájlba;
  • Írás – PUT kéréssel adatokat küld a szervernek;
  • Módosítás – módosít egy objektumot a PATCH kérések feldolgozásával;
  • SendForProcessing – a POST kérés alkalmazását jelző metódus, mint minden korábbi módszernél, tartalmaznia kell a kérés szövegét, és továbbíthatja a válaszfájl címét is adatrögzítéshez;
  • Fogadás - erről az alábbiakban részletesebben lesz szó;
  • A GetHeadings egy másik módszer, amelyet a cikkben fogunk használni;
  • A törlés valójában egy törlési kérés, amely eltávolítja a kérésben átadott erőforrást a szerverről.

A második sorban kérést hozunk létre a kiválasztott oldalra, kérésünk szövege egy perjelet tartalmaz, ami azt jelenti, hogy szeretnénk megkapni kezdőlap. Ha a perjelet bármilyen kifejezés követné, például „oldal2” vagy „hírek”, akkor egy másik oldalt kapunk.

A harmadik sor végrehajtja a kérésünket a szerver felé.

A negyedikben megmutatjuk az eredményt.

A http kérés átirányításának kezelése

Képzeljünk el egy olyan helyzetet, amikor programozottan kell egy keresési eredményt bármelyiken keresztül megkapnunk keresőmotor a „Kérések 1 másodpercen belül” gombbal. A GOOGLE eléréséhez szükséges kódrészlet a 3. ábrán látható

3. ábra

Itt a számunkra már ismert struktúrákon kívül fejlécek és állapotkód találhatók. Foglalkozzunk velük.

Állapotkód – a „Megjegyzéskérésben” megadott standard érték, a következő értékeket veheti fel:

  1. Ha minden rendben van, az érték 100 és 299 közötti tartományban tér vissza;
  2. Átirányítás esetén a 300-tól 399-ig terjedő kódot adjuk vissza, esetünkben a sikeres állandó átirányítást egy erőforrásra a 301-es kód határozza meg;
  3. Ha hibák vannak a kérésben, a paraméter értéke 400 és 499 között van;
  4. Az 500-599 tartományba eső érték a szerverrel kapcsolatos problémákat jelez.

Minden oldalnak van címe, melynek szövegében több paraméter is megkülönböztethető (4. ábra):

  1. Csatlakozási diagram (minden, ami két perjel „//” előtt áll);
  2. Címsor kapcsolatok;
  3. Felhasználónév és jelszó;
  4. Port és gazdagép a csatlakozáshoz.

Ezt a felosztást a SplitAddressLine függvény hajtja végre. Miután így megkaptuk az új címet, elmenthetjük az oldalt a számítógépünkre és megnyithatjuk az alapértelmezett böngészőben (GetPage eljárás).

5. ábra

Itt nincsenek új funkciók vagy módszerek a kérések kezelésére, valójában mi készítünk Szöveges dokumentum a webhely törzséből, és indítsa el az oldalt a böngészőben.

A fájlt a D meghajtó gyökerébe helyezzük, és tesztnek nevezzük.

A képet az oldalról vesszük

Felmerül a természetes kérdés: ha nem a teljes oldalra van szükségünk, hanem csak az egyes elemeit kell beszereznünk, akkor ezt meg lehet-e tenni és hogyan? Igen tudsz. Az ezt lehetővé tevő programkódot a 6. ábra mutatja be

6. ábra

Amint az ábrán látható, a kérés törzsében ott van a webhelystruktúra elem kódja, amelyet meg kell kapnunk. Ez a rész nem szerepelt korábbi leírásunkban, és ennél a pontnál részletesebben kell foglalkoznunk.

Böngészőt használtunk Opera eléréséhez. Van egy fontos eszköze számunkra: ha jobb gombbal kattint egy elemre, akkor hívhatja helyi menü, az egyik elem az „Elemkód megtekintése”.

Neki köszönhető, hogy megkapjuk azt a címet, amelyet a kérésben használni fogunk 7. ábra.

POST kérés

Az egyszerű Get kérésektől eltérően a POST http kérések van egy szövegtörzs, amelyet akár egyszerű szöveg formájában, akár xml, soap, json kiterjesztésű fájlok formájában lehet tárolni. A hálózaton meglehetősen sok eszköz található kérésszövegek létrehozására, amelyek lehetővé teszik bizonyos kérések hibakeresését és végrehajtását.

Az 1C-ben egy adott szövegű kérés indításához a HTTP-kérelem objektum rendelkezik a SetBodyFromString eljárással.

Az 1C Enterprise 8.3 platformon lehetővé vált HTTP szolgáltatások létrehozása

A beépített nyelv segítségével most választ generálhat egy kérésre. Ugyanakkor kényelmesen hozzáférhet a törzshöz, a fejlécekhez és a forrássorhoz kérés, és lehetőség van kód, törzs és fejlécek generálására is válasz saját belátása szerint.

A SOAP platformon elérhető webszolgáltatásokhoz képest a HTTP szolgáltatások számos előnnyel rendelkeznek:

  • Az ilyen szolgáltatások kliensének egyszerű programozása;
  • Potenciálisan kevesebb adatátvitel;
  • Potenciálisan alacsonyabb számítási terhelés;
  • A HTTP-szolgáltatások „erőforrás-orientáltak”, míg a SOAP-szolgáltatások „művelet-orientáltak”.

Az adatbázis bemutatja a http szolgáltatások megvalósítását

http-szolgáltatás Számlák listája

A http szolgáltatás URL-sablonokat használ, és tulajdonságfeldolgozást valósít meg ParametersURL tárgy HTTPServiceRequest
BAN BEN ebben a példában bemutatja, hogyan hozhat létre távtartó alapot a munkabázis és a vállalati webhely között
A kapcsolat létrejön a demó adatbázishoz " Kereskedelmi menedzsment 11“, amelyben először a „Counterparties” könyvtárhoz kell beállítani egy további tulajdonságot a névvel Webes jelszó , ahol tároljuk a hozzáférési jelszót.
A következő URL-paraméterek kerülnek elküldésre a http-kérésnek: TIN bejelentkezési névként és jelszóként.
Egy kérés feldolgozásakor a ComConnector-on keresztül csatlakozik az UT-hoz (a fékek garantáltak), és onnan történik a mintavétel
Nem teszek úgy, mintha ez a megoldás gyors vagy biztonságos lenne, ez csak egy példa

Így. Egy új ág jelent meg a metaadatfában - a HTTP szolgáltatások
Mi alkotunk új szolgáltatás, adja meg a nevét és a gyökér URL-jét (lista)
A gyökér URL-t a http szolgáltatásunk hívására használjuk
Ezután adjon hozzá egy URL-sablont a http szolgáltatáshoz, és adja meg a „/(Bejelentkezés)/(Jelszó)” sablont.
Ez a sablon lehetővé teszi, hogy megkapja a paraméterek megfelelő szerkezetét és értékeit az URL-paraméterekben egy http-kérés feldolgozása során.
Most az URL-sablonunkhoz hozzáadunk egy „get” nevű metódust, válassza ki a GET-et http-módszerként
Nyissa meg a kezelőt, és írja be a kódot
A metóduskezelő olyan függvény, amelynek egy típusú értéket kell visszaadnia HTTPServiceResponse

http-szolgáltatás Megrendelés állapota

A példa a POST metódussal átvitt változók feldolgozását és a válasz generálását valósítja meg HTML oldal formájában.
Az adatok ezúttal abból az adatbázisból kerülnek mintavételre, ahol a h-k találhatók, így lényegesen gyorsabban működik, mint a korábbi http szolgáltatás.
A megvalósítás során működő rendszer célszerű objektumokat létrehozni az adatbázisban (szolgáltatással) és konfigurálni az adatok migrációját a forrásadatbázisból (pl. háttérfolyamat). Egy http kérés feldolgozásakor a mintavétel közvetlenül abból az adatbázisból történik, ahol az található.

Kiadvány

Rengeteg információ található a webszerver telepítéséről és konfigurálásáról.
Innen a httpd-2.2.25-win32-x86-openssl-0.9.8y.exe buildet használtam
A „Next-Next-Finish” módszerrel telepítve :)
A http szolgáltatások közzététele ugyanott található, ahol a webszolgáltatások közzététele volt és van, és nem is különbözik különösebben.
A webszerver „Konfigurátor” módban történő telepítése után lépjen az „Adminisztráció” – „Közzététel webszerveren” menübe.
A „HTTP-szolgáltatások” lapon állítsa be a kiadvány nevét, a webszervert, a kiadványkönyvtárat, és jelölje meg szolgáltatásainkat (esetemben a név „web”, Apache 2.2 webszerver)
Közzétételkor a megfelelő blokkok automatikusan a httpd.conf konfigurációs fájlba íródnak, és a szerver újraindul (első közzétételkor)
Hívja a http szolgáltatást
Példa: http://mysite/web/hs/list, Ahol
az én oldalam– szerver címe (ha a webszerver helyben van telepítve, használhatja a 127.0.0.1-et)
web– közzétételkor megadott név (alias)
hs– egy kötelező elérési út szegmens, amely közli a szerverrel, hogy a http szolgáltatásokkal működni fog
lista– a webszolgáltatás gyökér URL-je

Tesztelés

Számlák listája

http://127.0.0.1/web/hs/list/7705260681/pswMP (Ne felejtsen el beállítani egy további tulajdonságot az UT-ban a jelszóhoz)

Feltételezhető, hogy a dokumentumnyilvántartáshoz való hozzáféréshez a felhasználó egy közvetlen hivatkozást használ, amely INN-t és jelszót tartalmaz

Rendelés állapota

http://127.0.0.1/web/hs/check

A kérés és a válasz ugyanazon az URL-en található. Az oldalra való belépéskor a GET metódus aktiválódik, amely egy html űrlapot ad vissza

Az „Ellenőrzés” gombra kattintva a rendelésszám POST módszerrel ugyanarra az URL-re kerül elküldésre, a válasz ugyanazzal az igénylőlappal érkezik vissza, kiegészítve a kért rendelés adataival.

A csatolt fájlban található az 1C 8.3 adatbázisának letöltése. A konfiguráció 2 http szolgáltatást tartalmaz (a kiadványból), egy com-kapcsolat létrehozását az UT 11 demó adatbázissal és a „Rendelés” dokumentumot.

Mit kell elindítani és tesztelni

  • web szerver
  • bármilyen webböngésző
  • aktuális kiadás1C: Enterprise 8.3

Nos, íme egy példa egy XML-fájl feldolgozására szerveroldali partnerekkel:

VBS kód
igényel_egyszer dirname(__FILE__) . "/../inc/initf.php" ;
osztály Onec_Import_Customers (
privát statikus $példány ;
függvény __construct() (

Self::$példány = $this ;

Nyilvános függvény process() (
$rawHttp = file_get_contents("php://input");
$xml_raw = str_replace("xml=", "", $rawHttp) ;

If ($_SESSION["bejelentkezve"] || igaz)(
file_put_contents("log/onec_import_customers_" .time(). ".log", "REQUEST " . print_r($_REQUEST, 1) . " SERVER " . print_r($_SERVER,1). " FILES " . print_r($_FILES, 1) .$xml_raw) ;
file_put_contents("log/onec_import_customers_last.log", "REQUEST" . print_r($_REQUEST, 1) . " SZERVER " . print_r($_SZERVER,1). " FÁJLOK " . print_r($_FILES,1) . $xml_raw) ;

//$xml = perjelek($_POST["xml"]);
$xml = perjelek ($xml_raw);
if(!$xml) (
$xml = $xml_raw ;
//die ("nincs XML adat (post key "xml")") ;
}
if ($this->setCustomers($xml)) (
die("OK");
) más (
die("FAIL");
}
) más (
meghal();
}
}

Privát függvény setCustomers($xml)(
$db = db::getInstance() ;

$sxml = simplexml_load_string($xml) ;

$customers = $sxml->("Договор") ? $sxml->("РІРѕРіРѕРІРѕСЂ") : self::err("Érvénytelen fájlformátum. Ügyfelek.") ;

$final = tömb () ;
$k = 0 ;

$allCustomers = tömb () ;

Foreach ($customers mint $cust) (
$jelszó = base::generatePassword(6,1) ;

$arr ["jelszó"] = $jelszó ;

$arr ["email"] = (tömb)$cust->("Почта") ;//? (tömb)$cust->("Почта") : self::err("Érvénytelen fájlformátum. Ügyfélszám:" . $k . ". Érvénytelen email") ;
$arr ["email"] = $arr ["e-mail"] ? $arr ["email"] : "";//: self::err("Érvénytelen fájlformátum. ügyfélszám:" . $k . ". Érvénytelen email" ;

$arr ["app_name"] = (tömb)$cust->("РќР°Ременование") ;//? (tömb)$cust->("РќР°Ременование") : self::err("Érvénytelen fájlformátum. Ügyfélszám:" . $k . ". Érvénytelen név") ;
$arr ["app_name"] = $arr ["app_name"] ? $arr ["app_name"] : "";//self::err("Érvénytelen fájlformátum. ügyfélszám:" . $k . ". Érvénytelen név") ;

$arr ["clientid"] = (tömb)$cust->("Номер") ? (tömb)$cust->("Номер") : self::err("Érvénytelen fájlformátum. Ügyfelek száma:" . $k . ". Érvénytelen ügyfélazonosító" ;
$arr ["clientid"] = $arr ["kliensazonosító"] ? $arr ["clientid"] : self::err("Érvénytelen fájlformátum. Ügyfelek száma:" . $k . ". Érvénytelen ügyfélazonosító" ;

$arr ["dátum"] = (tömb)$cust->("ата") ? (tömb)$cust->("ата") : self::err("Érvénytelen fájlformátum. Ügyfélszám:" . $k." ". Érvénytelen dátum" ;
$arr ["dátum"] = $arr ["dátum"] ? $arr ["dátum"] : self::err("Érvénytelen fájlformátum. Vevők száma:" . $k . ". Érvénytelen dátum" ;

$arr ["dátum"] = explode(".",$arr ["dátum"]);
krsort($arr ["dátum"]);
$arr ["dátum"] = implode("-",$arr ["dátum"]) . "00:00:00" ;

$arr ["phone_home"] = (tömb)$cust->("ТелефоРS") ;//? (tömb)$cust->("ТелефоРС") : self::err("Érvénytelen fájlformátum. Ügyfélszám:" . $k . ". Érvénytelen telefon") ;
$arr ["phone_home"] = $arr ["phone_home"] ? $arr ["phone_home"] : "";//self::err("Érvénytelen fájlformátum. Ügyfélszám:" . $k . ". Érvénytelen telefon" ;

$arr ["kerület"] = (tömb)$cust->("РайоРС") ;//? (tömb)$cust->("айон") : self::err("Érvénytelen fájlformátum. Ügyfélszám:" . $k . ". Érvénytelen körzet" ;
$arr ["kerület"] = $arr ["kerület"] ? $arr ["kerület"] : "";//self::err("Érvénytelen fájlformátum. Ügyfelek száma:" . $k . ". Érvénytelen körzet" ;

$arr ["utca"] = (tömb)$cust->("Улица") ;//? (tömb)$cust->("Улица") : self::err("Érvénytelen fájlformátum. Ügyfélszám:" . $k . ". Érvénytelen utca") ;
$arr ["utca"] = $arr ["utca"] ? $arr ["street"] : "";//self::err("Érvénytelen fájlformátum. Ügyfélszám:" . $k . ". Érvénytelen utca" ;

$arr ["épület"] = (tömb)$cust->("Дом") ;//? (tömb)$cust->("Дом") : self::err("Érvénytelen fájlformátum. Vevők száma:" . $k . ". Érvénytelen épület") ;
$arr ["épület"] = $arr ["épület"] ? $arr ["épület"] : "" ;//self::err("Érvénytelen fájlformátum. Vevők száma:" . $k . ". Érvénytelen épület" ;

$arr ["apartament"] = (tömb)$cust->("Квартира") ;//? (tömb)$cust->("Квартира") : self::err("Érvénytelen fájlformátum. Vevők száma:" . $k . ". Érvénytelen apartman") ;
$arr ["apartment"] = $arr ["apartment"] ? $arr ["apartament"] : "";// self::err("Érvénytelen fájlformátum. Vevők száma:" . $k . ". Érvénytelen apartman" ;

$allCustomers [$arr ["clientid"]]= array("password"=>$jelszó, "e-mail"=>$arr ["e-mail"]) ;

$végső = $arr ;
+$k ;
}

Vissza $this->buildCustomers($final) ;
/*
if($this->buildCustomers($final)) (
foreach ($allCustomers mint $clientid=>$data) (
self::sendPasswordToMail($data["e-mail"], $clientid, $data["jelszó"]) ;
}
}*/

Privát statikus függvény sendPasswordToMail($email, $client_id, $password) (
$db = db::getInstance() ;
$config = config_model::getInstance() ;
$Lng = Kérelem::$currentLang["id"] ;
$email_text = $db->getRow("s1_text", "*", "`alias`="regisztrációs_ok" ÉS `lng_id`="($lng)"");
$body = str_replace("%password%", $password, $email_text["tartalom"]) ;
$body = str_replace("%kliens_id%", $kliens_id, $test) ;
base::mailSend($body, $email_text["title"] . " - " . $config->defaultTitle("site.ru") , $email, $app["app_name"], $config->site_admin_mail( " [e-mail védett]"), $config->from_name("webhely")) ;

Privát függvény buildCustomers ($data) (

$db = db::getInstance() ;

$qry = "I_insert INTO s1_customer ("aktív", "jelszó", "alkalmazásnév", "e-mail", "dátum", "ügyfélazonosító", "telefon_otthon", "utca", "kerület", "épület", "lakás" `) ÉRTÉKEK " ;
foreach ($adat mint $sorok)(
$queryArr = "(
"0"
,MD5("($sorok["jelszó">")
"($db->escape($rows["app_name"]))"
"($db->escape($rows["e-mail"]))"
"($db->escape($rows["dátum"]))"
"($db->escape($rows["kliensazonosító"]))"
"($db->escape($rows["phone_home"]))"
"($db->escape($rows["utca"]))"
"($db->escape($rows["kerület"]))"
"($db->escape($rows["épület"]))"
"($db->menekülés($rows["apartment"]))"
)" ;
}
$qry .= implode(",", $queryArr) ;
$qry .= " DUPLIKÁLT KULCS FRISSÍTÉSÉN
`alkalmazás_neve` = ÉRTÉKEK(alkalmazás_neve)
,"dátum" = ÉRTÉKEK(dátum)
,`e-mail` = ÉRTÉKEK(e-mail)
,`otthoni_telefon` = ÉRTÉKEK(otthoni telefon)
,`utca` = ÉRTÉKEK(utca)
,`körzet` = ÉRTÉKEK(körzet)
,`épület` = ÉRTÉKEK(épület)
,"lakás" = ÉRTÉKEK(lakás)
" ;
return $db->query($qry) ;
}

Nyilvános statikus függvény getInstance())(
ha (!self::$példány)
{
új én() ;
}
return self::$példány ;

Privát statikus függvény err($msg) (
throw new ImportException($msg) ;
}

Az ImportException osztály kiterjeszti a kivételt (

Függvény __construct ($msg) (
die ("Hiba: " . $msg) ;