{"id":244,"date":"2023-03-22T11:41:37","date_gmt":"2023-03-22T11:41:37","guid":{"rendered":"https:\/\/tarkvara.thkit.ee\/veeb\/?page_id=244"},"modified":"2023-03-24T21:12:39","modified_gmt":"2023-03-24T21:12:39","slug":"seotud-tabelite-andmed-veebilehel","status":"publish","type":"page","link":"https:\/\/tarkvara.thkit.ee\/veeb\/seotud-tabelite-andmed-veebilehel\/","title":{"rendered":"Seotud tabelite andmed veebilehel"},"content":{"rendered":"\n<p>Siin n\u00e4ites p\u00fc\u00fcame samuti hoida kujunduse ja koodi v\u00f5imalikult lahus. Koodiosa paigutame faili nimega&nbsp;<\/p>\n\n\n\n<p>abifunktsioonid.php&nbsp;<\/p>\n\n\n\n<p>Eraldi seletust vajab ehk andmete v\u00e4ljastus funktsioonist. Varasemas n\u00e4ites tagastati funktsioonist vaid teate sisu &#8211; selleks piisas return-k\u00e4sust. Siin tuleb aga iga kauba kohta neli v\u00e4\u00e4rtust: id, nimetus, grupinimi ja hind. Lisaks p\u00fc\u00fcame funktsioonist korraga k\u00e4tte saada k\u00f5ikide kaupade andmed, et neid siis veebilehel mugavasti sobival kujul kuvada saaks.&nbsp;&nbsp;<\/p>\n\n\n\n<p>Mitme samat\u00fc\u00fcbilise v\u00e4\u00e4rtuse hoidmiseks aitab massiiv &#8211; nii ka siin. Enne andmete l\u00e4bik\u00e4imise ts\u00fcklit tehakse uus massiiv nimega $hoidla.<\/p>\n\n\n\n<p>&nbsp;$hoidla=array();&nbsp;<\/p>\n\n\n\n<p>Kauba andmete \u00fche kesta sisse kokku panekuks sobib stdClass-t\u00fc\u00fcpi objekt. Selle saab new-k\u00e4suga luua ning hiljem sinna \u00fckshaaval omadusi k\u00fclge panna. Olemasolevatest muutujatest v\u00f5tame andmed ning paneme need kaubaisendi v\u00e4ljadeks. Tekstilisi andmeid t\u00f6\u00f6tleme k\u00e4suga htmlspecialchars, et teksti sees olevad eris\u00fcmbolid ei p\u00e4\u00e4seks veebilehe sisu segama.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: php; title: ; notranslate\" title=\"\">\n $kaup=new stdClass(); \n $kaup-&gt;id=$id; \n $kaup-&gt;nimetus=htmlspecialchars($nimetus); \n $kaup-&gt;grupinimi=htmlspecialchars($grupinimi); \n $kaup-&gt;hind=$hind; \n\n<\/pre><\/div>\n\n\n<p>Iga kauba puhul kui selle andmed k\u00e4es, lisatakse kaubaobjekt massiivi l\u00f5ppu.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: php; title: ; notranslate\" title=\"\">\narray_push($hoidla, $kaup); \n<\/pre><\/div>\n\n\n<p>Funktsioonist v\u00e4ljudes tagastatakse hoidla koos kaupade andmetega.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: php; title: ; notranslate\" title=\"\">\n return $hoidla; \n<\/pre><\/div>\n\n\n<p>Funktsiooni t\u00f6\u00f6 kontrollimiseks on algul hea ta k\u00e4ivitada. Selleks abifunktsioonide faili l\u00f5pus vastav l\u00f5ik. M\u00e4rgend &lt;pre&gt; m\u00e4\u00e4rab, et veebilehel v\u00e4ljastades oleksid k\u00f5ik t\u00e4hed (ka t\u00fchikud) kindla laiusega (preformatted text). K\u00e4sklus print_r (rekursiivne print) tr\u00fckib etteantud objekti v\u00f5i massiivi andmed s\u00fcgavuti v\u00e4lja, ehk siis n\u00e4itab k\u00f5ik, mis sealt seest saada on.&nbsp;<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: php; title: ; notranslate\" title=\"\">\n&lt;pre&gt; \n&lt;?php \n print_r(kysiKaupadeAndmed()); \n?&gt; \n&lt;\/pre&gt; \n\n<\/pre><\/div>\n\n\n<p>N\u00fc\u00fcd siis abifunktsioonid.php tervikuna.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: php; title: ; notranslate\" title=\"\">\n&lt;?php \n $yhendus=new mysqli(&quot;localhost&quot;, &quot;jaagup&quot;, &quot;xxxxxx&quot;, &quot;jaagup&quot;); \n function kysiKaupadeAndmed(){ \n global $yhendus; \n $kask=$yhendus-&gt;prepare(&quot;SELECT kaubad.id, nimetus, grupinimi, hind  FROM kaubad, kaubagrupid \n WHERE kaubad.kaubagrupi_id=kaubagrupid.id&quot;); \n \/\/echo $yhendus-&gt;error; \n $kask-&gt;bind_result($id, $nimetus, $grupinimi, $hind); \n $kask-&gt;execute(); \n $hoidla=array(); \n while($kask-&gt;fetch()){ \n $kaup=new stdClass(); \n $kaup-&gt;id=$id; \n $kaup-&gt;nimetus=htmlspecialchars($nimetus); \n $kaup-&gt;grupinimi=htmlspecialchars($grupinimi); \n $kaup-&gt;hind=$hind; \n array_push($hoidla, $kaup); \n } \n return $hoidla; \n } \n?&gt; \n&lt;pre&gt; \n&lt;?php \n print_r(kysiKaupadeAndmed());\n?&gt; \n&lt;\/pre&gt; \n\n<\/pre><\/div>\n\n\n<p>Faili v\u00e4ljund parasjagu baasis olevate andmete p\u00f5hjal. K\u00e4su print_r tulemus n\u00e4itab, et v\u00e4ljatr\u00fckitud objekt oli massiiv, millel indeksid 0, 1 ja 2. Ning mille igaks elemendiks on objekt klassist stdClass v\u00e4ljadega id, nimetus, grupinimi ja hind parasjagu sissepandud v\u00e4\u00e4rtustega.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: php; title: ; notranslate\" title=\"\">\nArray \n( \n &#x5B;0] =&gt; stdClass Object \n ( \n &#x5B;id] =&gt; 1 \n &#x5B;nimetus] =&gt; ahjutellis \n &#x5B;grupinimi] =&gt; tellised \n &#x5B;hind] =&gt; 8.20 \n ) \n &#x5B;1] =&gt; stdClass Object \n ( \n &#x5B;id] =&gt; 2 \n &#x5B;nimetus] =&gt; fassaaditellis \n &#x5B;grupinimi] =&gt; tellised \n &#x5B;hind] =&gt; 7.50 \n ) \n &#x5B;2] =&gt; stdClass Object \n ( \n &#x5B;id] =&gt; 3 \n &#x5B;nimetus] =&gt; bituumenrull \n &#x5B;grupinimi] =&gt; katusematerjal \n &#x5B;hind] =&gt; 520.00 \n ) \n) \n\n<\/pre><\/div>\n\n\n<p>Kui funktsiooni t\u00f6\u00f6 kontrollitud ja \u00f5igeks loetud, siis on hea pre-ga t\u00e4histatud osa abifunktsioonide failist v\u00e4lja v\u00f5tta, et see muude failide poolt v\u00e4lja kutsudes segama ei hakkaks.&nbsp;&nbsp;<\/p>\n\n\n\n<p>J\u00e4rgnevalt kasutame failis kaubaotsing.php loodud abifunktsiooni teenuseid ning n\u00e4itame tabelis olevad kaubad ekraanile. K\u00f5igepealt tuleb kasutamiseks lugeda require-k\u00e4suga abifunktsioonid k\u00e4ivituvasse faili (kaubaotsing.php) sisse. Ning et kaubad oleksid meil lehe v\u00e4ljatr\u00fcki juures pidevalt k\u00e4ep\u00e4rast, selleks k\u00fcsime funktsiooni poolt v\u00e4ljastatud andmekogumi muutujasse nimega $kaubad.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: php; title: ; notranslate\" title=\"\">\n&lt;?php \n require(&quot;abifunktsioonid.php&quot;); \n $kaubad=kysiKaupadeAndmed(); \n?&gt; \n\n<\/pre><\/div>\n\n\n<p>Hiljem andmeid v\u00e4lja tr\u00fckkides saab siis kaupade massiivi elemendid \u00fckshaaval ette v\u00f5tta ning iga kauba andmed sobivasse lahtrisse paigutada. Kuna eelnevas funktsioonis on juba kauba nimetusele ja grupinimele pandud \u00fcmber htmlspecialchars&#8217;i tehtud muudatused, siis v\u00f5ib need v\u00e4\u00e4rtused siin rahus otse v\u00e4lja tr\u00fckkida.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: php; title: ; notranslate\" title=\"\">\n &lt;?php foreach($kaubad as $kaup): ?&gt; \n &lt;tr&gt; \n &lt;td&gt;&lt;?=$kaup-&gt;nimetus ?&gt;&lt;\/td&gt; \n &lt;td&gt;&lt;?=$kaup-&gt;grupinimi ?&gt;&lt;\/td&gt;\n &lt;td&gt;&lt;?=$kaup-&gt;hind ?&gt;&lt;\/td&gt; \n &lt;\/tr&gt; \n &lt;?php endforeach; ?&gt; \n\n<\/pre><\/div>\n\n\n<p>Ning kaubaotsingu fail tervikuna<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: php; title: ; notranslate\" title=\"\">\n&lt;?php \n require(&quot;abifunktsioonid.php&quot;); \n $kaubad=kysiKaupadeAndmed(); \n?&gt; \n&lt;!DOCTYPE html PUBLIC &quot;-\/\/W3C\/\/DTD XHTML 1.0 Transitional\/\/EN&quot; &quot;http:\/\/www.w3.org\/TR\/xhtml1\/DTD\/xhtml1-transitional.dtd&quot;&gt; \n&lt;html xmlns=&quot;http:\/\/www.w3.org\/1999\/xhtml&quot;&gt; \n &lt;head&gt; \n &lt;title&gt;Kaupade leht&lt;\/title&gt; \n &lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text\/html;charset=utf-8&quot; \/&gt;  &lt;\/head&gt; \n &lt;body&gt; \n &lt;table&gt; \n &lt;tr&gt; \n &lt;th&gt;Nimetus&lt;\/th&gt; \n &lt;th&gt;Kaubagrupp&lt;\/th&gt; \n &lt;th&gt;Hind&lt;\/th&gt; \n &lt;\/tr&gt; \n &lt;?php foreach($kaubad as $kaup): ?&gt; \n &lt;tr&gt; \n &lt;td&gt;&lt;?=$kaup-&gt;nimetus ?&gt;&lt;\/td&gt; \n &lt;td&gt;&lt;?=$kaup-&gt;grupinimi ?&gt;&lt;\/td&gt; \n &lt;td&gt;&lt;?=$kaup-&gt;hind ?&gt;&lt;\/td&gt; \n &lt;\/tr&gt; \n &lt;?php endforeach; ?&gt; \n &lt;\/table&gt; \n &lt;\/body&gt; \n&lt;\/html&gt; \n\n<\/pre><\/div>\n\n\n<p>Ja tema t\u00f6\u00f6 tulemus arvutiekraanil.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"322\" height=\"537\" src=\"https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/03\/KAUBA.PHP_.png\" alt=\"\" class=\"wp-image-258\" srcset=\"https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/03\/KAUBA.PHP_.png 322w, https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/03\/KAUBA.PHP_-180x300.png 180w\" sizes=\"auto, (max-width: 322px) 100vw, 322px\" \/><\/figure>\n\n\n\n<p>Abifunktsioone on t\u00e4iendamise korral vaja sageli testida. Pidevalt pre-osa sisse ja v\u00e4lja t\u00f5sta on t\u00fclikas. Selle asemel v\u00f5ib tingimuslausega kontrollida, et kas abifunktsioonid.php k\u00e4ivitatakse iseseisvalt v\u00f5i m\u00f5ne teise faili kaudu. Esimesel juhul n\u00e4idatakse testandmed ekraanile, muidu mitte. Tegeliku veebilehitseja aadressirealt k\u00e4ivitatava faili nime leiab muutujast $_SERVER[&#8220;PHP_SELF&#8221;] -koos kogu pika URLiga. J\u00e4rgnevas k\u00e4sus t\u00fckeldatakse see URL explode abil kaldkriipsu kohtadelt massiivielementideks ning array_pop k\u00e4su abil v\u00f5etakse viimane element ehk failinimi ise. Tingimusega kontrollitakse, et kui aadressirealt k\u00e4ivitatava faili nimi on abifunktsioonid.php, siis pannakse pre-m\u00e4rgendi sees olev testosa k\u00e4ima, muidu mitte.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: php; title: ; notranslate\" title=\"\">\n if( array_pop(explode(&quot;\/&quot;, $_SERVER&#x5B;&quot;PHP_SELF&quot;]))==&quot;abifunktsioonid.php&quot;): ?&gt; \n&lt;pre&gt; \n&lt;?php \n print_r(kysiKaupadeAndmed()); \n?&gt; \n&lt;\/pre&gt; \n&lt;?php endif ?&gt; \n\n<\/pre><\/div>\n\n\n<p>N\u00f5nda siis abifunktsioonid.php uuel kujul, kus faili l\u00f5pus testosa k\u00e4ivitatakse ainult faili otse veebilehitsejas vaadates. Teise faili kaudu funktsioon sisse lugedes aga muud lehte segavat l\u00f5iku ei teki.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: php; title: ; notranslate\" title=\"\">\n&lt;?php \n $yhendus=new mysqli(&quot;localhost&quot;, &quot;jaagup&quot;, &quot;xxxxxx&quot;, &quot;jaagup&quot;); \n function kysiKaupadeAndmed(){ \n global $yhendus; \n $kask=$yhendus-&gt;prepare(&quot;SELECT kaubad.id, nimetus, grupinimi, hind  FROM kaubad, kaubagrupid \n WHERE kaubad.kaubagrupi_id=kaubagrupid.id&quot;); \n \/\/echo $yhendus-&gt;error; \n $kask-&gt;bind_result($id, $nimetus, $grupinimi, $hind); \n $kask-&gt;execute(); \n $hoidla=array(); \n while($kask-&gt;fetch()){ \n $kaup=new stdClass(); \n $kaup-&gt;id=$id; \n $kaup-&gt;nimetus=htmlspecialchars($nimetus); \n $kaup-&gt;grupinimi=htmlspecialchars($grupinimi); \n $kaup-&gt;hind=$hind; \n array_push($hoidla, $kaup); \n } \n return $hoidla; \n } \n \/\/--------------- \n if( array_pop(explode(&quot;\/&quot;, $_SERVER&#x5B;&quot;PHP_SELF&quot;]))==&quot;abifunktsioonid.php&quot;): ?&gt; \n&lt;pre&gt; \n&lt;?php \n print_r(kysiKaupadeAndmed()); \n?&gt; \n&lt;\/pre&gt; \n&lt;?php endif ?&gt; \n\n<\/pre><\/div>","protected":false},"excerpt":{"rendered":"<p>Siin n\u00e4ites p\u00fc\u00fcame samuti hoida kujunduse ja koodi v\u00f5imalikult lahus. Koodiosa paigutame faili nimega&nbsp; abifunktsioonid.php&nbsp; Eraldi seletust vajab ehk andmete v\u00e4ljastus funktsioonist. Varasemas n\u00e4ites tagastati funktsioonist vaid teate sisu &#8211; selleks piisas return-k\u00e4sust. Siin tuleb aga iga kauba kohta neli v\u00e4\u00e4rtust: id, nimetus, grupinimi ja hind. Lisaks p\u00fc\u00fcame funktsioonist korraga k\u00e4tte saada k\u00f5ikide kaupade andmed, &hellip; <a href=\"https:\/\/tarkvara.thkit.ee\/veeb\/seotud-tabelite-andmed-veebilehel\/\" class=\"more-link\">Loe edasi <span class=\"screen-reader-text\">Seotud tabelite andmed veebilehel<\/span> <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-244","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/tarkvara.thkit.ee\/veeb\/wp-json\/wp\/v2\/pages\/244","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/tarkvara.thkit.ee\/veeb\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/tarkvara.thkit.ee\/veeb\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/tarkvara.thkit.ee\/veeb\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/tarkvara.thkit.ee\/veeb\/wp-json\/wp\/v2\/comments?post=244"}],"version-history":[{"count":14,"href":"https:\/\/tarkvara.thkit.ee\/veeb\/wp-json\/wp\/v2\/pages\/244\/revisions"}],"predecessor-version":[{"id":261,"href":"https:\/\/tarkvara.thkit.ee\/veeb\/wp-json\/wp\/v2\/pages\/244\/revisions\/261"}],"wp:attachment":[{"href":"https:\/\/tarkvara.thkit.ee\/veeb\/wp-json\/wp\/v2\/media?parent=244"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}