Antwort #7 am: 06. Februar 2015, 18:47:22
Hallo Hanspeter.
zu 1.:
Jau, ich weiß, daß strpos() einen nicht boolschen Wert ausgeben kann welcher zu 'false' gewertet wird (z.B. 0, NULL). Da wir aber auf das Vorkommen eines Strings prüfen welcher nie einen solchen Wert haben kann
- nämlich weil er nie an erster Stelle ( = 0) gefunden werden und nie den Typ NULL ausgeben kann -
reicht ein
{if strpos($smarty.server.PHP_SELF, 'product_info') || (strpos($smarty.server.PHP_SELF, 'index') && $smarty.get.cPath)}
Nicht an erster Stelle kann der String gefunden werden weil auf den Produktseiten die Ausgabe dann so wäre:
/product_info.php
oder auf Kategorieseiten und der Startseite so
/index.php
also der Slash an erster Stelle stünde.
Natürlich ist die Prüfung auf !== false korrekter und sicherer.
strpos() ist jedenfalls schneller als strstr() weil nicht so speicher-intensiv, da strstr() den ganzen Rest-String ab der Position des gesuchten Strings zurückgibt während strpos() lediglich die Position des Auffindens zurückgibt.
zu 2.:
Ja, ich bin sicher, daß "{if $smarty.get.products_id} immer nur dann wahr ist, wenn auch {if strstr($smarty.server.PHP_SELF, 'product_info')} wahr ist".
Das liegt am Aufbau der "echten" URLs (also die server-internen URLS ohne SEO-URLs), die auf einer Produktseite so aussehen:
DOMAIN.TLD/product_info.php?products_id=XX
Das heißt, "product_info" kommt nur auf Produktseiten vor
*EDIT* und der GET-Parameter "products_id" ebenso.
*EDIT 2* Der GET-Parameter "products_id" kommt auch noch auf anderen Seiten vor, wir prüfen aber ja nur im Produkt-Info-Template, ist also nicht relevant.
*EDIT 3*
Mmh, vielleicht hast du doch Recht, die Prüfung kommt ja in die index.html...
Den Performancegewinn kann ich nicht mit Testcases belegen (obwohl es evtl. schon welche im I-net gibt), aber GET-Parameter sind im globalen GET-Array gespeichert während für eine Prüfung mittels strstr() oder strpos() definitiv Rechenarbeit vonnöten ist die imho nur langsamer sein kann. Mit dem Durchsuchen von Arrays ist PHP sehr schnell.
Zum Abschluß noch dies:
Um keine bösen Gedanken aufkommen zu lassen (was ich nicht behaupten möchte, daß es so sei):
Ich wollte dich nicht korrigieren sondern einen community-gedanken-tragenden Verbesserungsvorschlag machen.
Gruß,
noRiddle