


Die Anatomie der intelligenten Suche in der Joomla-Kunst. Erstellen eines Plugins I.
Dec 04, 2024 pm 10:29 PMIm vorherigen Artikel haben wir uns mit den Funktionen der intelligenten Suchkomponente von Joomla vertraut gemacht und über die Parameter und Konfiguration der geplanten Indizierung mit CRON gesprochen. Beginnen wir mit der Erstellung des Codes für unser eigenes Plugin.
Liste der Ressourcen
Bevor ich mit dem technischen Teil beginne, werde ich einige Artikel erw?hnen, die sich direkt mit dem Hauptthema befassen. Sowie Artikel, die sich im Allgemeinen mit der Erstellung und/oder Aktualisierung eines Plugins für die moderne Architektur von Joomla 4 / Joomla 5 befassen. Als n?chstes gehe ich davon aus, dass der Leser sie gelesen hat und im Allgemeinen eine Vorstellung davon hat, wie man ein funktionierendes Plugin erstellt für Joomla:
- Erstellen eines Smart Search-Plugins – offizielle Joomla-Dokumentation. Es gilt für Joomla 3, aber die meisten Bestimmungen blieben für Joomla 4 / Joomla 5 gültig
- Entwicklung eines Smart Search Plugins, ein Artikel aus dem Joomla Community Magazine aus dem Jahr 2012.
- Das Buch Joomla Extensions Development von Nicholas Dionysopoulos, das die Entwicklung von Joomla behandelt! Erweiterungen unter Joomla-Versionen 4 und 5.
- Der Datenbankbereich im neuen Dokumentationsportal manual.joomla.org – für Joomla 4 und Joomla 5. ## Der technische Teil. Entwicklung des Joomla 5 Smart Search Plugins Die intelligente Suchkomponente arbeitet mit Datenanbieter-Plugins, deren Hauptaufgabe dieselbe bleibt: Daten auszuw?hlen und sie der Komponente zur Indizierung zu übergeben. Mit der Zeit fielen aber auch Neuindizierungsaufgaben in den Aufgabenbereich des Plugins. In diesem Artikel gehen wir davon aus, dass wir die Inhaltsindizierung manuell über das Admin-Panel ausführen. Die Arbeit der CLI ist optisch anders, aber ihr Wesen bleibt das gleiche.
Für erfahrene Entwickler m?chte ich sagen, dass das Such-Plugin die Klasse JoomlaComponentFinderAdministratorIndexerAdapter erweitert. Die Klassendatei befindet sich in administrator/components/com_finder/src/Indexer/Adapter.php. Dann werden sie es selbst herausfinden. Als Beispiel k?nnen Sie auch die zentralen Plugins für die intelligente Suche von Joomla – für Artikel, Kategorien, Kontakte, Tags usw. – im Ordner plugins/finder studieren. Ich habe an einem intelligenten Such-Plugin für die Komponenten JoomShopping (Joomla E-Commerce-Komponente) und SW JProjects (Ihre eigene Joomla-Erweiterungsverzeichniskomponente mit Update-Server) gearbeitet, sodass ihnen die Klassennamen und einige Nuancen zugeordnet werden. Das meiste davon zeige ich am Beispiel von JoomShopping. Die L?sung des Problems der Mehrsprachigkeit erfolgt am Beispiel von SW JProjects.
Die Dateistruktur des Smart-Search-Plugins
Die Dateistruktur des Smart Search Plugins für Joomshopping unterscheidet sich nicht von der typischen:
Dateistruktur des Joomla 5 Smart Search Plugins
Dateiservices/provider.php
Mit der Datei provider.php k?nnen Sie ein Plugin in einem Joomla DI-Container registrieren und über MVCFactory von au?en auf Plugin-Methoden zugreifen.
<?php /** * @package Joomla.Plugin * @subpackage Finder.Wtjoomshoppingfinder * * @copyright (C) 2023 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ \defined('_JEXEC') or die; use Joomla\CMS\Extension\PluginInterface; use Joomla\CMS\Factory; use Joomla\CMS\Plugin\PluginHelper; use Joomla\Database\DatabaseInterface; use Joomla\DI\Container; use Joomla\DI\ServiceProviderInterface; use Joomla\Event\DispatcherInterface; use Joomla\Plugin\Finder\Wtjoomshoppingfinder\Extension\Wtjoomshoppingfinder; return new class () implements ServiceProviderInterface { /** * Registers the service provider with a DI container. * * @param Container $container The DI container. * * @return void * * @since 4.3.0 */ public function register(Container $container) { $container->set( PluginInterface::class, function (Container $container) { $plugin = new Wtjoomshoppingfinder( $container->get(DispatcherInterface::class), (array) PluginHelper::getPlugin('finder', 'wtjoomshoppingfinder') ); $plugin->setApplication(Factory::getApplication()); // Our plugin uses DatabaseTrait, so the setDatabase() method appeared // If it is not present, then we use only setApplication(). $plugin->setDatabase($container->get(DatabaseInterface::class)); return $plugin; } ); } };
Plugin-Klassendatei
Dies ist die Datei, die den Hauptarbeitscode Ihres Plugins enth?lt. Es sollte sich im Ordner src/Extension befinden. In meinem Fall befindet sich die Plugin-Klasse JoomlaPluginFinderWtjoomshoppingfinderExtensionWtjoomshoppingfinder in der Datei plugins/finder/wtjoomshoppingfinder/src/Extension/Wtjoomshoppingfinder.php. Der Namensraum des Plugins ist JoomlaPluginFinderWtjoomshoppingfinderExtension.
Für den Betrieb ist ein minimaler Satz an Klasseneigenschaften und -methoden erforderlich (auf sie wird zugegriffen, auch von der übergeordneten Adapterklasse).
Die mindestens erforderlichen Eigenschaften der Klasse
- $extension – ist der Name Ihrer Komponente, der den Typ Ihres Inhalts definiert. Beispiel: com_content. In meinem Fall ist das com_jshopping.
- $context – ist ein eindeutiger Bezeichner für das Plugin. Er legt den Indexierungskontext fest, in dem auf das Plugin zugegriffen wird. Tats?chlich ist dies der Name der Plugin-Klasse (Element). In unserem Fall Wtjoomshoppingfinder.
-
$layout – ist der Name des Ausgabelayouts für das Suchergebniselement. Dieses Layout wird bei der Anzeige von Suchergebnissen verwendet. Wenn der Parameter $layout beispielsweise auf ?article“ gesetzt ist, sucht der Standardansichtsmodus nach einer Layoutdatei mit dem Namen default_article.php, wenn Sie ein Suchergebnis dieses Typs anzeigen müssen. Wenn eine solche Datei nicht gefunden wird, wird stattdessen eine Layoutdatei mit dem Namen default_result.php verwendet. Die Ausgabelayouts mit HTML-Layout befinden sich in components/com_finder/tmpl/search. Allerdings sollten wir unsere Layouts als überschreibungen platzieren – im HTML-Vorlagenordner – templates/YOUR_TEMPLATE/html/com_finder/search. In meinem Fall habe ich das Layoutprodukt benannt und die Datei hei?t default_product.php.
- $table – ist der Name der Tabelle in der Datenbank, auf die wir zugreifen, um Daten abzurufen, zum Beispiel #__content. In meinem Fall hei?t die Haupttabelle mit JoomShopping-Produkten #__jshopping_products.
- $state_field – ist der Name des Feldes in der Datenbanktabelle, das dafür verantwortlich ist, ob das indizierte Element ver?ffentlicht wird oder nicht. Standardm??ig hei?t dieses Feld ?Status“. Im Fall von JoomShopping hei?t dieses Feld jedoch product_publish.
<?php /** * @package Joomla.Plugin * @subpackage Finder.Wtjoomshoppingfinder * * @copyright (C) 2023 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ \defined('_JEXEC') or die; use Joomla\CMS\Extension\PluginInterface; use Joomla\CMS\Factory; use Joomla\CMS\Plugin\PluginHelper; use Joomla\Database\DatabaseInterface; use Joomla\DI\Container; use Joomla\DI\ServiceProviderInterface; use Joomla\Event\DispatcherInterface; use Joomla\Plugin\Finder\Wtjoomshoppingfinder\Extension\Wtjoomshoppingfinder; return new class () implements ServiceProviderInterface { /** * Registers the service provider with a DI container. * * @param Container $container The DI container. * * @return void * * @since 4.3.0 */ public function register(Container $container) { $container->set( PluginInterface::class, function (Container $container) { $plugin = new Wtjoomshoppingfinder( $container->get(DispatcherInterface::class), (array) PluginHelper::getPlugin('finder', 'wtjoomshoppingfinder') ); $plugin->setApplication(Factory::getApplication()); // Our plugin uses DatabaseTrait, so the setDatabase() method appeared // If it is not present, then we use only setApplication(). $plugin->setDatabase($container->get(DatabaseInterface::class)); return $plugin; } ); } };
Die mindestens erforderlichen Methoden der Klasse
- setup(): bool – ist eine Methode zum Vorkonfigurieren des Plugins, zum Verbinden von Bibliotheken usw. Die Methode wird w?hrend der Neuindizierung (die reindex()-Methode) beim onBeforeIndex-Ereignis aufgerufen. Die Methode muss true zurückgeben, sonst wird die Indizierung unterbrochen.
- index(): void – ist die Methode, mit der die Indizierung selbst gestartet wird. Es sammelt ein Objekt der gewünschten Struktur aus SQL-Abfragerohdaten, das dann zur Indizierung an die Klasse JoomlaComponentFinderAdministratorIndexerIndexer übergeben wird. Die Methode wird für jedes indizierte Element ausgeführt. Das Methodenargument ist $item – das Ergebnis einer Abfrage an die Datenbank, formatiert in der JoomlaComponentFinderAdministratorIndexerResult-Klasse.
- getListQuery(): JoomlaDatabaseDatabaseQuery – ist eine Methode zum Abrufen einer Liste indizierter Elemente…
... und hier fangen wir an, in die Details einzutauchen, da die getListQuery()-Methode nicht wirklich obligatorisch ist, obwohl sowohl in der Dokumentation als auch in den meisten Artikeln darüber gesprochen wird.
Jedes Bild zum Thema ?komplexes Schema“ reicht hier aus.
Tauchen Sie ein in die Details. Die Datenstruktur des indizierten Elements.
Es ist erstaunlich, wie oft eine Information oder Idee manchmal im Kreis an uns vorbeizieht, bevor wir sie bemerken und realisieren! Viele Dinge, die l?nger als ein Jahr vor unseren Augen liegen, werden uns immer noch nicht bewusst und unsere Aufmerksamkeit richtet sich erst nach jahrelanger Erfahrung auf sie.
Im Zusammenhang mit Joomla kommt aus irgendeinem Grund nicht sofort die Vision auf, dass seine Komponenten eine Art gemeinsame Architektur annehmen, die für Joomla charakteristisch ist (obwohl dies eine offensichtliche Tatsache ist). Einschlie?lich auf der Ebene der Datenbanktabellenstruktur. Schauen wir uns einige Felder der Joomla-Inhaltstabelle an. Ich mache einen Vorbehalt, dass bestimmte Spaltennamen für uns nicht so wichtig sind (Sie k?nnen immer SELECT name AS title abfragen), wie gro? ist die Datenstruktur für ein indiziertes Element:
- id – automatische Inkrementierung
- asset_id – die ID des Eintrags in der Tabelle #__assets, in der die Zugriffsrechte von Gruppen und Benutzern für jedes Element der Site gespeichert sind: Artikel, Produkte, Menüs, Module, Plugins und alles andere. Joomla verwendet das Access Control List (ACL)-Muster.
- Titel – der Elementtitel
- Sprache – das Element Sprache
- Introtext – einleitender Text oder eine kurze sichtbare Beschreibung des Elements
- Volltext – der vollst?ndige Text des Artikels, die vollst?ndige Beschreibung des Produkts usw.
- state – das logische Flag, das für den Ver?ffentlichungsstatus verantwortlich ist: ob das Element ver?ffentlicht ist oder nicht.
- catid – die ID der Artikelkategorie. Joomla verfügt nicht nur über ?Site-Seiten“ wie in anderen CMS. Es gibt Inhaltseinheiten (Artikel, Kontakte, Produkte usw.), die zu bestimmten Kategorien geh?ren müssen.
- erstellt – das Datum, an dem das Element erstellt wurde.
- Zugriff – Zugriffsrechte-Gruppen-ID (nicht autorisierte Site-Benutzer (G?ste), alle, registriert usw.)
- metakey – Metaschlüsselw?rter für das Element. Ja, seit 2009 werden sie von Google nicht mehr verwendet. Aber in Joomla bleiben sie historisch bestehen, da dieses Feld im Modul ??hnliche Artikel“ verwendet wird, um mithilfe bestimmter Schlüsselw?rter nach tats?chlich ?hnlichen Artikeln zu suchen.
- metadesc – die Metabeschreibung des Elements
- Publish_up und Publish_Down – das Datum des Beginns der Ver?ffentlichung und der De-Ver?ffentlichung des Elements. Dies ist eher eine Option, findet sich aber in vielen Komponenten.
Wenn wir die Tabellen #__content (Joomla-Artikel), #__contact_details (Kontaktkomponente), #__tags (Joomla-Tags), #__categories (Joomla-Kategoriekomponente) vergleichen, dann finden wir fast alle aufgeführten Datentypen überall.
Wenn die Komponente, für die intelligente Such-Plugins erstellt werden, der ?Joomla-Methode“ folgt und deren Architektur erbt, k?nnen Sie mit einem Minimum an Methoden in der Plugin-Klasse auskommen. Wenn die Entwickler beschlie?en, nicht nach einfachen Wegen zu suchen und ihren eigenen Weg zu gehen, müssen Sie den harten Weg gehen und fast alle Methoden der Adapter-Klasse neu definieren.
getListQuery()-Methode
Diese Methode wird in 3 F?llen aufgerufen:
- Die Methode getContentCount() der Adapter-Klasse dient dazu, die Anzahl der indizierten Elemente abzurufen (wie viele Artikel insgesamt, wie viele Produkte insgesamt usw.).
Joomla Smart Search Indexierungsprozess Sie k?nnen die Anzahl der indizierten Elemente im Debug-Modus sehen.
- Die getItem($id)-Methode der Adapter-Klasse dient dazu, ein bestimmtes indiziertes Element anhand seiner ID abzurufen. Die Methode getItem() wiederum wird in der Methode reindex($id) aufgerufen – w?hrend der Neuindizierung.
- Die Methode getItems($offset, $limit, $query = null) der Adapter-Klasse ist eine Methode zum Abrufen einer Liste indizierter Elemente. Offset und Limit werden basierend auf den Komponenteneinstellungen festgelegt – wie viele indizierte Elemente im ?Bündel“ enthalten sein sollen.
Joomla 5 Smart Search Settings Indexer Batch-Gr??e
Sehen wir uns ein Beispiel für die Implementierung in Joomla-Kern-Plugins an:
<?php /** * @package Joomla.Plugin * @subpackage Finder.Wtjoomshoppingfinder * * @copyright (C) 2023 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ \defined('_JEXEC') or die; use Joomla\CMS\Extension\PluginInterface; use Joomla\CMS\Factory; use Joomla\CMS\Plugin\PluginHelper; use Joomla\Database\DatabaseInterface; use Joomla\DI\Container; use Joomla\DI\ServiceProviderInterface; use Joomla\Event\DispatcherInterface; use Joomla\Plugin\Finder\Wtjoomshoppingfinder\Extension\Wtjoomshoppingfinder; return new class () implements ServiceProviderInterface { /** * Registers the service provider with a DI container. * * @param Container $container The DI container. * * @return void * * @since 4.3.0 */ public function register(Container $container) { $container->set( PluginInterface::class, function (Container $container) { $plugin = new Wtjoomshoppingfinder( $container->get(DispatcherInterface::class), (array) PluginHelper::getPlugin('finder', 'wtjoomshoppingfinder') ); $plugin->setApplication(Factory::getApplication()); // Our plugin uses DatabaseTrait, so the setDatabase() method appeared // If it is not present, then we use only setApplication(). $plugin->setDatabase($container->get(DatabaseInterface::class)); return $plugin; } ); } };
Die Methode getListQuery() gibt ein DatabaseQuery-Objekt zurück, ein Objekt des Abfragekonstruktors, in dem der Name der Tabelle und die Felder zur Auswahl bereits angegeben sind. Die Arbeit damit wird in den Methoden fortgesetzt, die es aufrufen.
Wenn getListQuery() von getContentCount() im DatabaseQuery $query-Objekt aufgerufen wird, werden die eingestellten Werte für select durch COUNT(*) ersetzt.
Wenn getListQuery() von getItem($id) aufgerufen wird, gilt die Bedingung $query->where('a.id = ' . (int) $id) und es wird nur ein bestimmtes Element ausgew?hlt. Und schon hier sehen wir, dass die übergeordnete Adapterklasse den Tabellennamen in der Abfrage als.* enth?lt. Das bedeutet, dass wir diese Pr?fixe auch in unserer Implementierung der getListQuery()-Methode verwenden sollten.
Im Falle des Aufrufs von getListQuery() aus getItems() werden $offset und $limit zu der von uns erstellten Abfrage hinzugefügt, um durch die Liste der zu indizierenden Elemente zu navigieren.
Zusammenfassung: getListQuery() – muss ein ?Arbeitsstück“ für drei verschiedene SQL-Abfragen enthalten. Und es ist hier nichts besonders Schwieriges, Joomla zu implementieren. Bei Bedarf k?nnen Sie jedoch drei Methoden selbst implementieren, ohne getListQuery() zu erstellen.
Nicht Joomla-Methode: Im Fall von JoomShopping bin ich auf die Tatsache gesto?en, dass ein Produkt mehrere Kategorien haben kann und in der Vergangenheit die Kategorie-ID-Komponente (Catid) für das Produkt in einer separaten Tabelle gespeichert wurde. Gleichzeitig war es viele Jahre lang nicht m?glich, die Hauptkategorie für das Produkt festzulegen. Nach Erhalt der Produktkategorie wurde eine Abfrage an die Tabelle mit Kategorien gesendet, wo nur das erste Abfrageergebnis übernommen wurde, sortiert nach der Standardkategorie-ID – also aufsteigend. Wenn wir beim Bearbeiten eines Produkts die Kategorie ge?ndert haben, war die Hauptproduktkategorie diejenige mit der niedrigeren ID-Nummer. Die URL des Produkts basierte darauf und das Produkt konnte von einer Kategorie zur anderen springen.
Aber vor fast 2 Jahren wurde dieses JoomShopping-Verhalten behoben. Da die Komponente eine lange Geschichte und ein gro?es Publikum hat und die Abw?rtskompatibilit?t nicht einfach aufgehoben werden kann, wurde der Fix optional gemacht. Die M?glichkeit, die Hauptkategorie für das Produkt anzugeben, muss in den Komponenteneinstellungen aktiviert sein. Anschlie?end wird die main_category_id mit den Produkten in die Tabelle eingetragen.
Aber diese Funktionalit?t ist standardm??ig deaktiviert. Und im intelligenten Such-Plugin müssen wir die Parameter der JoomShopping-Komponente abrufen und prüfen, ob die Option zum Angeben der Hauptproduktkategorie aktiviert ist (und es wurde m?glicherweise kürzlich aktiviert und die Hauptkategorie für einige Produkte ist nicht angegeben – ebenfalls eine Nuance …) und generiert eine SQL-Abfrage, um das/die Produkt(e) basierend auf den Komponentenparametern zu erhalten: entweder eine einfache Abfrage, bei der wir das Feld main_category_id hinzufügen , oder ein JOIN-Anfrage, um die Kategorie-ID auf die alte falsche Weise zu erhalten.
Bei dieser Anfrage kommt sofort die Nuance der Mehrsprachigkeit zum Vorschein. Gem?? der Joomla-Methode wird für jede Sprache der Website ein separates Element erstellt und es werden Verknüpfungen zwischen ihnen eingerichtet. Also für die russische Sprache - ein Artikel. Der gleiche Artikel auf Englisch wird separat erstellt. Dann verbinden wir sie über Sprachzuordnungen miteinander und beim Wechsel der Sprache im Joomla-Frontend werden wir von einem Artikel zum anderen weitergeleitet.
So wird es in JoomShopping nicht gemacht: Daten für alle Sprachen werden in derselben Tabelle mit Produkten gespeichert (Ok). Das Hinzufügen von Daten für andere Sprachen erfolgt durch Hinzufügen von Spalten mit dem Suffix dieser Sprachen (hmm...). Das hei?t, wir haben nicht nur ein Titel- oder Namensfeld in der Datenbank. Aber es gibt Felder name_ru-RU, name_en-GB usw.
Strukturfragment der Joomla JoomShopping-Produkttabelle
Gleichzeitig müssen wir eine universelle SQL-Abfrage entwerfen, damit sie sowohl über das Admin-Panel als auch über die CLI indiziert werden kann. Gleichzeitig ist auch die Auswahl der Indizierungssprache beim Starten der CLI mit CRON eine Aufgabe. Ich gebe zu, dass ich zum Zeitpunkt des Schreibens dieses Artikels eine umfassende L?sung dieses Problems vorerst verschoben habe. Die Sprache wird mit unserer eigenen getLangTag()-Methode ausgew?hlt, wobei wir entweder die Hauptsprache aus den JoomShopping-Parametern oder die Standardsprache der Website übernehmen. Das hei?t, diese L?sung gilt bisher nur für eine einsprachige Website. Die Suche in verschiedenen Sprachen funktioniert noch nicht.
3 Monate sp?ter habe ich dieses Problem jedoch gel?st, allerdings bereits im Smart Search Plugin für die SW JProjects-Komponente. Ich werde Ihnen die L?sung weiter erl?utern.
Schauen wir uns in der Zwischenzeit an, was bei JoomShopping passiert ist
<?php /** * @package Joomla.Plugin * @subpackage Finder.Wtjoomshoppingfinder * * @copyright (C) 2023 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ \defined('_JEXEC') or die; use Joomla\CMS\Extension\PluginInterface; use Joomla\CMS\Factory; use Joomla\CMS\Plugin\PluginHelper; use Joomla\Database\DatabaseInterface; use Joomla\DI\Container; use Joomla\DI\ServiceProviderInterface; use Joomla\Event\DispatcherInterface; use Joomla\Plugin\Finder\Wtjoomshoppingfinder\Extension\Wtjoomshoppingfinder; return new class () implements ServiceProviderInterface { /** * Registers the service provider with a DI container. * * @param Container $container The DI container. * * @return void * * @since 4.3.0 */ public function register(Container $container) { $container->set( PluginInterface::class, function (Container $container) { $plugin = new Wtjoomshoppingfinder( $container->get(DispatcherInterface::class), (array) PluginHelper::getPlugin('finder', 'wtjoomshoppingfinder') ); $plugin->setApplication(Factory::getApplication()); // Our plugin uses DatabaseTrait, so the setDatabase() method appeared // If it is not present, then we use only setApplication(). $plugin->setDatabase($container->get(DatabaseInterface::class)); return $plugin; } ); } };
Kontrollpunkt
Wir haben eine Methode zum Abfragen der Datenbank von Joomla erstellt und viel über die Funktionsweise des Smart-Search-Plugins gelernt.
Im n?chsten Artikel erstellen wir eine Methode zur Indizierung von Inhalten und schlie?en die Erstellung des Plugins ab. Wir werden uns auch damit vertraut machen, wie indizierte Elemente in der Datenbank gespeichert werden, verstehen, warum dies wichtig ist, und das Problem der Indizierung von Inhalten für mehrsprachige Komponenten mit einer nicht standardm??igen Implementierung der Mehrsprachigkeit l?sen.
Ressourcen der Joomla-Community
- https://joomla.org/
- Dieser Artikel im Joomla Community Magazine
- Joomla-Community-Chat in Mattermost (weiterlesen)
Das obige ist der detaillierte Inhalt vonDie Anatomie der intelligenten Suche in der Joomla-Kunst. Erstellen eines Plugins I.. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Hei?e KI -Werkzeuge

Undress AI Tool
Ausziehbilder kostenlos

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Clothoff.io
KI-Kleiderentferner

Video Face Swap
Tauschen Sie Gesichter in jedem Video mühelos mit unserem v?llig kostenlosen KI-Gesichtstausch-Tool aus!

Hei?er Artikel

Hei?e Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Hei?e Themen

ToversionAPHP-basiertApieffektiv, useUrl-basiertversionsforclarityAndaseFrouting, separateversionedCodetoAvoidConflicts, DeprecateoldversionswithClearcommunication, und considercustomheadsonlywaNno.

TosecurelyHandleAuthenticationAuthorizationInphp, folge theSteps: 1.Alwayshashpasswordswithpassword_hash () und password_verify (), usePreeParedStatementStopreventsQlinjapitca und StoreuserDatain $ _SessionArtelogin.2.ImplementscaChescescesc

ProzeduralandObject-orientedProgramming (OOP) inPhpdifferS sisideftribitionInstructure, Wiederverwendbarkeit und datahandling.1.ProceduralProgrammingusSfunctions-organisierte Folgesequentiell, optableForsmallscripts.

Phpdoesnothaveabuilt-inWeakmapbutoffersWeakreferenceForsimilarFunction.1.WeakreferenceAllowsholdingReferences WithoutPreventingGAGECollection

Um Datei -Uploads in PHP sicher zu verarbeiten, besteht der Kern darin, Dateitypen zu überprüfen, Dateien umzubenennen und die Berechtigungen zu beschr?nken. 1. Verwenden Sie Finfo_File (), um den realen MIME -Typ zu überprüfen, und nur bestimmte Typen wie Bild/JPEG sind zul?ssig. 2. Verwenden Sie Uniqid (), um zuf?llige Dateinamen zu generieren und sie im Root-Verzeichnis ohne Web zu speichern. 3.. Begrenzen Sie die Dateigr??e durch Php.ini- und HTML -Formulare und setzen Sie die Verzeichnisberechtigungen auf 0755; 4. Verwenden Sie Clamav, um Malware zu scannen, um die Sicherheit zu verbessern. Diese Schritte verhindern effektiv Sicherheitslücken und stellen sicher, dass der Upload -Prozess des Datei -Uploads sicher und zuverl?ssig ist.

Ja, PHP kann mit NoSQL -Datenbanken wie MongoDB und Redis durch bestimmte Erweiterungen oder Bibliotheken interagieren. Verwenden Sie zun?chst den MongoDBPHP -Treiber (installiert über PECL oder Composer), um Client -Instanzen zu erstellen und Datenbanken und Sammlungen zu betreiben, wobei Sie Insertion, Abfrage, Aggregation und andere Vorg?nge unterstützen. Zweitens verwenden Sie die Predis Library oder PHPREDIS-Erweiterung, um eine Verbindung zu Redis herzustellen, Schlüsselwerteinstellungen und -akquisitionen durchzuführen und PHPREDIS für Hochleistungsszenarien zu empfehlen, w?hrend Predis für die schnelle Bereitstellung bequem ist. Beide sind für Produktionsumgebungen geeignet und gut dokumentiert.

In PHP ist der Hauptunterschied zwischen == und == die Strenge der Typprüfung. == Die Konvertierung des Typs wird vor dem Vergleich durchgeführt, beispielsweise 5 == "5" gibt true zurück und === fordert an, dass der Wert und der Typ gleich sind, bevor True zurückgegeben wird, z. B. 5 === "5" gibt false zurück. In den Nutzungsszenarien ist === sicherer und sollte zuerst verwendet werden, und == wird nur verwendet, wenn die Typumwandlung erforderlich ist.

Die Methoden zur Verwendung grundlegender mathematischer Operationen in PHP sind wie folgt: 1. Additionszeichen unterstützen Ganzfaktoren und Floating-Punkt-Zahlen und k?nnen auch für Variablen verwendet werden. String -Nummern werden automatisch konvertiert, aber nicht für Abh?ngigkeiten empfohlen. 2. Subtraktionszeichen verwenden - Zeichen, Variablen sind gleich, und die Typumwandlung ist ebenfalls anwendbar. 3. Multiplikationszeichen verwenden * Zeichen, die für Zahlen und ?hnliche Zeichenfolgen geeignet sind; 4. Division verwendet / Zeichen, die vermeiden müssen, durch Null zu dividieren, und beachten Sie, dass das Ergebnis m?glicherweise schwimmende Punktzahlen sein kann. 5. Die Modulzeichen k?nnen verwendet werden, um ungerade und sogar Zahlen zu beurteilen, und wenn negative Zahlen verarbeitet werden, stimmen die Restzeichen mit der Dividende überein. Der Schlüssel zur korrekten Verwendung dieser Operatoren liegt darin, sicherzustellen, dass die Datentypen klar sind und die Grenzsituation gut behandelt wird.
