Mysql Moving Average Abfrage


PHP bietet drei verschiedene APIs für die Verbindung zu MySQL. Dies sind die mysql (entfernt von PHP 7), mysqli. Und PDO-Erweiterungen. Die MySQL-Funktionen verwendet werden, um sehr beliebt, aber ihre Verwendung wird nicht mehr gefördert. Das Dokumentationsteam diskutiert die Situation der Datenbanksicherheit und die Aufklärung der Benutzer, sich von der häufig verwendeten extmysql-Erweiterung zu entfernen, ist ein Teil davon (siehe php. internals: extmysql deprecating). Und das spätere PHP-Entwicklerteam hat die Entscheidung getroffen, EDEPRECATED-Fehler zu generieren, wenn Benutzer eine Verbindung zu MySQL herstellen, sei es über mysqlconnect (). Mysqlpconnect () oder die implizite Verbindungsfunktionalität in extmysql. Extmysql wurde offiziell ab PHP 5.5 veraltet und wurde ab PHP 7 entfernt. Wenn Sie eine beliebige MySQL-Handbuch-Seite aufrufen, sehen Sie ein rotes Kästchen, das erklärt, dass es nicht mehr verwendet werden sollte. Umzug von extmysql ist nicht nur über die Sicherheit, sondern auch über den Zugriff auf alle Funktionen der MySQL-Datenbank. Extmysql wurde für MySQL 3.23 gebaut und bekam nur sehr wenige Ergänzungen seit damals, während meistens halten Kompatibilität mit dieser alten Version, die den Code ein bisschen schwieriger zu pflegen macht. Fehlende Funktionen, die von extmysql nicht unterstützt werden, sind: (aus PHP-Handbuch). Grund für die Verwendung von mysql-Funktion: Nicht unter aktiver Entwicklung Entfernt ab PHP 7 Mangel an einer OO-Schnittstelle Unterstützt nicht blockierende, asynchrone Abfragen Unterstützt nicht vorbereitete Anweisungen oder parametrisierte Abfragen Unterstützt nicht gespeicherte Prozeduren Unterstützt nicht mehrere Anweisungen Unterstützt keine Transaktionen Unterstützt nicht alle Die Funktionalität in MySQL 5.1 Mangelnde Unterstützung für vorbereitete Anweisungen ist besonders wichtig, da sie eine klarere, weniger fehleranfällige Methode zum Entweichen und Zitieren von externen Daten bereitstellen, als sie manuell mit einem separaten Funktionsaufruf zu entkommen. Unterdrückung von Warnungen bei Abweichungen Während Code in MySQLi PDO konvertiert wird. EDEPRECATED-Fehler können durch das Setzen von errorreporting in php. ini unterdrückt werden, um EDEPRECATED auszuschließen: Beachten Sie, dass dies auch andere Warnungen verwerfen wird. Die jedoch für andere Dinge als MySQL sein kann. (Aus PHP Handbuch) Und ein besserer Weg ist PDO. Und ich schreibe jetzt ein einfaches PDO Tutorial. Eine einfache und kurze PDO Tutorial Q. Erste Frage in meinem Kopf war: Was ist PDO A. PDO PHP Data Objects ist eine Datenbank-Zugriffsschicht bietet eine einheitliche Methode des Zugriffs auf mehrere Datenbanken. Verbindung mit MySQL Mit MySQL-Funktion oder können wir sagen, es ist die alte Weise (veraltet in PHP 5.5 und höher) Mit PDO. Alles, was Sie tun müssen, ist ein neues PDO-Objekt erstellen. Der Konstruktor akzeptiert Parameter für die Angabe der Datenbankquelle PDO s Konstruktor nimmt meist vier Parameter, die DSN (Datenquellenname) und optional Benutzername sind. Passwort vergessen. Hier denke ich, dass Sie mit allen außer DSN vertraut sind das ist neu in PDO. Ein DSN ist im Grunde eine Reihe von Optionen, die PDO sagen, welche Treiber zu verwenden, und die Verbindung Details. Weitere Informationen finden Sie unter PDO MySQL DSN. Hinweis: Sie können auch charsetUTF-8 verwenden. Aber manchmal ist es ein Fehler, so ist es besser, utf8 verwenden. Wenn es einen Verbindungsfehler gibt, wirft er ein PDOException-Objekt, das zwischengespeichert werden kann, um Exception weiter zu behandeln. Sie können auch mehrere Treiberoptionen als Array an den vierten Parameter übergeben. Ich empfehle die Übergabe der Parameter, die PDO in Ausnahme-Modus. Da einige PDO-Treiber native vorbereitete Anweisungen nicht unterstützen, führt PDO die Emulation der Vorbereitung durch. Außerdem können Sie diese Emulation manuell aktivieren. Um die nativen serverseitigen vorbereiteten Anweisungen zu verwenden, sollten Sie diese explizit falsch setzen. Die andere ist zu deaktivieren Vorbereitung Emulation, die in der MySQL-Treiber aktiviert ist standardmäßig, aber Vorbereitung Emulation sollte deaktiviert werden, um PDO sicher verwenden. Ich werde später erklären, warum Vorbereitung Emulation ausgeschaltet werden sollte. Um Grund zu finden überprüfen Sie bitte diesen Beitrag. Es ist nur verwendbar, wenn Sie eine alte Version von MySQL verwenden, die ich nicht empfehle. Unten ist ein Beispiel, wie Sie es tun können: Können wir Attribute nach PDO-Konstruktion setzen Ja. Können wir auch einige Attribute nach der PDO-Konstruktion mit der setAttribute-Methode festlegen: Fehlerbehandlung Fehlerbehandlung ist viel einfacher in PDO als mysql. Eine gängige Praxis bei der Verwendung von mysql ist: ODER sterben () ist kein guter Weg, um den Fehler zu behandeln, da wir die Sache nicht verarbeiten können. Es wird einfach beenden Sie das Skript abrupt und dann Echo der Fehler auf dem Bildschirm, die Sie normalerweise nicht wollen, um Ihre Endbenutzer zeigen, und lassen Sie blutigen Hacker entdecken Sie Ihr Schema. Alternativ können die Rückgabewerte von mysql-Funktionen häufig in Verbindung mit mysqlerror () verwendet werden, um Fehler zu behandeln. PDO bietet eine bessere Lösung: Ausnahmen. Alles, was wir mit PDO tun sollten in einem try - catch - Block verpackt werden. Wir können PDO in einen von drei Fehlermodi erzwingen, indem Sie das Attribut error mode setzen. Im Folgenden sind drei Fehlerbehandlungsmodi aufgeführt. PDO :: ERRMODESILENT. Seine gerade Einstellung Fehlercodes und Handlungen so ziemlich das gleiche wie mysql wo Sie jedes Ergebnis überprüfen müssen und dann auf db-gterrorInfo (), um die Fehlerdetails zu erhalten. PDO :: ERRMODEWARNING ERHÖHEN. (Laufzeitwarnung (nicht schwerwiegende Fehler) Die Ausführung des Skripts wird nicht angehalten.) PDO :: ERRMODEEXCEPTION. Ausnahmen werfen. Es stellt einen Fehler dar, der durch PDO aufgeworfen wird. Sie sollten keine PDOException aus Ihrem eigenen Code werfen. Weitere Informationen zu Ausnahmen in PHP finden Sie unter Ausnahmen. Es funktioniert sehr ähnlich oder sterben (mysqlerror ()). Wenn es nicht gefangen wird. Aber anders oder sterben (). Kann die PDOException abgefangen und graziös behandelt werden, wenn Sie dies tun. Und Sie können es in try - catch wickeln. Wie unten: Sie müssen nicht mit try - catch sofort zu behandeln. Sie können es jederzeit fangen, aber ich empfehle Ihnen dringend, versuchen zu versuchen. Auch kann es sinnvoller sein, es an außerhalb der Funktion, die die PDO-Zeilen aufruft zu fangen: Auch können Sie mit oder sterben () oder wir können sagen, wie mysql. Aber es wird wirklich abwechslungsreich. Sie können die gefährlichen Fehlermeldungen in der Produktion ausblenden, indem Sie die Anzeigefehler deaktivieren und nur Ihr Fehlerprotokoll lesen. Nun, nach dem Lesen alle Dinge oben, sind Sie wahrscheinlich denken: was zum Teufel ist, dass wenn ich einfach nur starten wollen, lehnen einfache SELECT. EINFÜGEN. AKTUALISIEREN. Oder DELETE-Anweisungen Dont worry, hier gehen wir: Auswählen von Daten So, was Sie tun in mysql ist: Jetzt in PDO. Können Sie dies wie: Hinweis. Wenn Sie die Methode wie unten (query ()) verwenden, gibt diese Methode ein PDOStatement-Objekt zurück. Also, wenn Sie das Ergebnis holen möchten, verwenden Sie es wie oben. In PDO-Daten, wird es über die - gtfetch () erhalten. Eine Methode Ihrer Anweisung behandeln. Vor dem Aufruf Fetch, wäre der beste Ansatz zu sagen PDO wie youd wie die Daten abgerufen werden. Im folgenden Abschnitt erkläre ich das. Fetch-Modi Beachten Sie die Verwendung von PDO :: FETCHASSOC in den Abrufen () und fetchAll () Code oben. Dies weist an, dass PDO die Zeilen als assoziatives Array mit den Feldnamen als Schlüssel zurückgibt. Es gibt viele andere Fetch-Modi zu, die ich erklären werde, eins nach dem anderen. Zuerst erkläre ich, wie man Fetch-Modus wählen: Im oben genannten habe ich mit fetch (). Sie können auch: PDOStatement :: fetchAll () - Gibt ein Array zurück, das alle Ergebnismengenzeilen enthält PDOStatement :: fetchColumn () - Gibt eine einzelne Spalte aus der nächsten Zeile einer Ergebnismenge zurück PDOStatement :: fetchObject () - Ruft das ab Nächste Zeile und gibt sie als Objekt zurück. PDOStatement :: setFetchMode () - Setzt den Standard-Fetch-Modus für diese Anweisung Nun komme ich zum Abruf-Modus: PDO :: FETCHASSOC. Gibt ein Array zurück, das nach Spaltennamen in der Ergebnismenge zurückgegeben wird. PDO :: FETCHBOTH (default): gibt ein Array zurück, das durch den Spaltennamen und die 0-indexierte Spaltennummer in der Ergebnismenge zurückgegeben wird. Es gibt noch mehr Auswahlmöglichkeiten In PDOStatement Fetch-Dokumentation. . Ermitteln der Zeilenzahl: Anstelle der Verwendung von mysqlnumrows, um die Anzahl der zurückgegebenen Zeilen zu erhalten, können Sie ein PDOStatement abrufen und rowCount () ausführen. Wie: Erhalten der letzten eingefügten ID Einfügen und aktualisieren oder Delete-Anweisungen Was wir tun, ist in der mysql-Funktion: Und in pdo kann das gleiche getan werden durch: In der obigen Abfrage PDO :: exec führen Sie eine SQL-Anweisung aus und gibt die Zahl zurück Der betroffenen Zeilen. Einfügen und Löschen wird später behandelt. Die obige Methode ist nur sinnvoll, wenn Sie keine Variable in der Abfrage verwenden. Aber wenn Sie eine Variable in einer Abfrage verwenden müssen, nicht immer versuchen, wie die oben und dort für eine vorbereitete Anweisung oder parametrisierte Anweisung ist. Vorbereitete Anweisungen Q. Was ist eine vorbereitete Anweisung und warum brauche ich sie A. Eine vorbereitete Anweisung ist eine vorkompilierte SQL-Anweisung, die mehrere Male ausgeführt werden kann, indem nur die Daten an den Server gesendet werden. Der typische Arbeitsablauf der Verwendung einer vorbereiteten Anweisung ist wie folgt (zitiert aus Wikipedia drei 3 Punkte): Vorbereiten. Die Anweisungsvorlage wird von der Anwendung erstellt und an das Datenbankmanagementsystem (DBMS) gesendet. (INSERT IN PRODUCT (Name, Preis) VALUES (.) Das DBMS analysiert, kompiliert und führt die Abfrageoptimierung auf der Anweisungsvorlage durch und speichert das Ergebnis Ohne es auszuführen. Ausführen . Zu einem späteren Zeitpunkt liefert die Applikation Werte für die Parameter und der DBMS führt die Anweisung (evtl. ein Ergebnis zurückgeben) aus. Die Anwendung kann die Anweisung so oft ausführen, wie sie mit unterschiedlichen Werten will. In diesem Beispiel könnte es Brot für den ersten Parameter und 1,00 für den zweiten Parameter liefern. Sie können eine vorbereitete Anweisung verwenden, indem Sie Platzhalter in Ihr SQL einschließen. Es gibt im Grunde drei, ohne Platzhalter (nicht versuchen, dies mit variablen seiner oben), eine mit ungenannten Platzhalter und eine mit benannten Platzhalter. F. Also jetzt, was sind Platzhalter genannt und wie benutze ich sie A. Benannte Platzhalter. Verwenden Sie beschreibende Namen, denen ein Doppelpunkt vorangestellt wird, anstelle von Fragezeichen. Es ist Ihnen nicht erlaubt, Anhänge hochzuladen. Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten. BB-Code ist an. Smileys sind an. [IMG] Code ist an. HTML-Code ist aus Werden. Zum Beispiel: Q. So, jetzt, was sind unbenannte Platzhalter und wie benutze ich sie A. Lets haben ein Beispiel: In der oben können Sie die sehen. Anstelle eines Namens wie in einem Namen Platzhalter. Im ersten Beispiel weisen wir den verschiedenen Platzhaltern Variablen zu (stmt-gtbindValue (1, name, PDO :: PARAMSTR)). Dann weisen wir diesen Platzhaltern Werte zu und führen die Anweisung aus. Im zweiten Beispiel geht das erste Array-Element zum ersten über. Und die zweite zur zweiten. HINWEIS . In ungenannten Platzhaltern müssen wir uns um die richtige Reihenfolge der Elemente im Array kümmern, die wir an die PDOStatement :: execute () - Methode übergeben. WÄHLEN. EINFÜGEN. AKTUALISIEREN. DELETE vorbereiteten Abfragen Amine, Nein, ist es nicht. Während NullPoite wirklich eine große Arbeit des Schreibens es tat, ist dieses sicherlich nicht eine gute Lektüre, weil es Weise zu lang ist. I39m ziemlich sicher, dass 8 von 10 Besuchern einfach überspringen wird. Und Sie haben auch Erklärung, warum diese Antwort isn39t oben abgestimmt. Ein tldr Teil am Anfang wäre eine gute Idee, denke ich. Ndash trejder Zuerst, beginnen wir mit dem Standard-Kommentar geben wir jedem: Bitte verwenden Sie nicht MySQL-Funktionen in neuen Code. Sie werden nicht mehr beibehalten und sind offiziell veraltet. Siehe das rote Kästchen. Erfahren Sie mehr über vorbereitete Anweisungen statt, und verwenden Sie PDO oder MySQLi - dieser Artikel wird Ihnen helfen, zu entscheiden, welche. Wenn Sie PDO wählen, ist hier ein gutes Tutorial. Lets hindurchgehen, Satz für Satz und erklären: Sie werden nicht länger beibehalten und sind offiziell veraltet. Das bedeutet, dass die PHP-Community allmählich Unterstützung für diese sehr alten Funktionen fallen lässt. Sie sind wahrscheinlich nicht in einer zukünftigen (jüngsten) Version von PHP existieren fortgesetzt Gebrauch dieser Funktionen kann Ihren Code in der (nicht so) weit Zukunft brechen. Neuere extmysql wurde in PHP 7 entfernt. Stattdessen sollten Sie von vorbereiteten Anweisungen lernen - mysql-Erweiterung unterstützt keine vorbereiteten Anweisungen. Was unter anderem eine sehr wirksame Gegenmaßnahme gegen SQL Injection ist. Es reparierte eine sehr schwere Verwundbarkeit in MySQL-abhängigen Anwendungen, die Angreifern Zugriff auf Ihr Skript und eine mögliche Abfrage auf Ihrer Datenbank. Wenn Sie eine beliebige MySQL-Handbuch-Seite aufrufen, sehen Sie ein rotes Kästchen, das erklärt, dass es nicht mehr verwendet werden sollte. Verwenden Sie entweder PDO oder MySQLi Es gibt bessere, robuster und gut aufgebaute Alternativen, PDO - PHP Database Object. Die einen vollständigen OOP-Ansatz für die Datenbank-Interaktion und MySQLi bietet. Was eine MySQL-spezifische Verbesserung ist. Benutzerfreundlichkeit Die analytischen und synthetischen Gründe wurden bereits erwähnt. Für Anfänger theres ein bedeutenderer Anreiz, die Verwendung der datierten MySQL-Funktionen zu stoppen. Moderne Datenbank-APIs sind einfacher zu bedienen. Seine meistens die gebundenen Parameter, die Code vereinfachen können. Und mit ausgezeichneten Tutorials (wie oben gesehen) der Übergang zu PDO ist nicht allzu anstrengend. Das erneute Schreiben einer größeren Codebasis nimmt jedoch Zeit in Anspruch. Raison dtre für diese Zwischen-Alternative: Äquivalente pdo-Funktionen anstelle von mysql Mit lt pdomysql. php gt können Sie von den alten MySQL-Funktionen mit minimalem Aufwand wechseln. Es fügt pdo Funktion Wrapper, die ihre mysql Gegenstücke zu ersetzen. Einfach includeonce (pdomysql. php) in jedem Aufrufskript, das mit der Datenbank interagieren muss. Entfernen Sie das mysql-Funktions-Präfix und ersetzen Sie es mit pdo. () Wird zu pdo () mysql () mysql fetcharray () wird zu pdo fidcharray () mysql fetchArray () mysql fetchArray () Pdo fetchassoc () mysql realescapestring () wird pdo realescapestring () und so weiter. Ihr Code wird gleich funktionieren und immer noch meist gleich aussehen: Et voil. Ihr Code wird mit PDO. Jetzt seine Zeit, um es tatsächlich nutzen. Gebundene Parameter können einfach zu bedienen Sie brauchen nur eine weniger unhandliche API. Pdoquery () fügt sehr einfache Unterstützung für gebundene Parameter hinzu. Konvertieren alter Code ist einfach: Bewegen Sie Ihre Variablen aus der SQL-Zeichenfolge. Fügen Sie sie als durch Komma getrennte Funktionsparameter zu pdoquery () hinzu. Platzieren Sie Fragezeichen. Als Platzhalter, wo die Variablen vorher waren. Beenden Sie einzelne Anführungszeichen, die zuvor die Zeichenfolge valuevariables eingeschlossen haben. Der Vorteil wird deutlicher für längeren Code. Oft String-Variablen arent nur in SQL interpoliert, aber verkettet mit escaping Anrufe zwischen. Mit. Platzhalter angewendet Sie müssen nicht mit der Mühe: Denken Sie daran, dass pdo noch erlaubt entweder oder. Just dont eine Variable zu entkommen und bind es in der gleichen Abfrage. Die Platzhalterfunktion wird von der realen PDO dahinter bereitgestellt. So auch erlaubt: benannte Platzhalterlisten später. Noch wichtiger ist, dass Sie REQUEST-Variablen sicher hinter jeder Abfrage übergeben können. Wenn vorgegebene ltformgt Felder entsprechen die Datenbank-Struktur genau ihre noch kürzer: So viel Einfachheit. Aber lassen Sie uns zurück zu einigen mehr Rewriting-Empfehlungen und technische Gründe, warum Sie wollen, um loszuwerden, MySQL und Flucht. Fix oder entfernen Sie alle oldschool sanitize () - Funktion Nachdem Sie alle MySQL-Aufrufe zu pdoquery mit gebundenen Params konvertiert haben, entfernen Sie alle redundanten pdorealescapestring Anrufe. Insbesondere sollten Sie irgendwelche zu reinigen oder zu reinigen oder FilterThis oder cleandata Funktionen, wie von dated Tutorials in einem Formular oder das andere beworben: Die meisten grellen Fehler hier ist der Mangel an Dokumentation. Noch deutlicher war die Reihenfolge der Filterung in genau der falschen Reihenfolge. Richtige Reihenfolge wäre: veraltet Stripslashes als die innerste Aufforderung, dann trimmen. Danach striptags. Htmlentities für den Ausgabe-Kontext, und nur zuletzt das escapestring als seine Anwendung sollte direkt vor der SQL-Intersparsing. Aber als erster Schritt nur loszuwerden, die realescapestring nennen. Möglicherweise müssen Sie den Rest Ihrer Funktion sanitize () behalten, wenn Ihre Datenbank und Ihr Anwendungsfluss HTML-kontextsensitive Zeichenfolgen erwarten. Fügen Sie einen Kommentar hinzu, dass es nur HTML-Escaping von jetzt an anwendet. Die Stringvalue-Handhabung wird an PDO und ihre parametrisierten Anweisungen delegiert. Wenn es irgendwelche Erwähnung von stripslashes () in Ihrem sanitize Funktion, kann es eine höhere Ebene Aufsicht. Das war allgemein dort, um Schäden (doppeltes Escaping) von den veralteten Magicquotes rückgängig zu machen. Welches jedoch am besten zentral fixiert ist. Nicht string by string. Verwenden Sie einen der Userland Umkehransätze. Entfernen Sie dann die Streifen () in der Desinfektionsfunktion. Historische Anmerkung über magicquotes. Diese Funktion ist zu Recht veraltet. Sein häufig falsch dargestellt als ausgefallenes Sicherheitsmerkmal jedoch. Aber Magicquotes sind so viel ein ausgefallenes Sicherheitsmerkmal wie Tennisbälle als Nährstoffquelle versagt haben. Das war einfach nicht ihr Zweck. Die ursprüngliche Implementierung in PHP2FI führte es explizit mit nur Anführungszeichen automatisch entkommen, so dass es einfacher, Formulardaten direkt an msql-Abfragen übergeben. Bemerkenswert war es versehentlich sicher mit mSQL zu verwenden. Wie die nur ASCII unterstützt. Dann PHP3Zend wieder eingeführt Magicquotes für MySQL und misdocumented es. Aber ursprünglich war es nur ein Komfort-Feature. Nicht die Absicht der Sicherheit. Wie vorbereitet Aussagen unterscheiden Wenn Sie String-Variablen in die SQL-Abfragen zu scrampeln, wird es nicht nur noch komplizierter für Sie zu folgen. Seine auch externe Anstrengung für MySQL, um Code und Daten wieder zu trennen. SQL-Injektionen sind einfach, wenn Daten in Code-Kontext blutet. Ein Datenbank-Server kann nicht später Spot, wo PHP ursprünglich geklebt Variablen in zwischen Abfrage-Klauseln. Mit gebundenen Parametern trennen Sie SQL-Code und SQL-Kontext-Werte in Ihrem PHP-Code. Aber es wird nicht wieder hinter die Kulissen (außer PDO :: EMULATEPREPARES) wieder gemischt. Ihre Datenbank empfängt die ungarischen SQL-Befehle und 1: 1-Variablenwerte. Während diese Antwort betont, dass Sie über die Lesbarkeit Vorteile von Drop MySQL sollte Pflege. Theres gelegentlich auch ein Performance-Vorteil (wiederholte INSERTs mit nur unterschiedlichen Werten) aufgrund dieser sichtbaren und technischen Datacode Trennung. Achten Sie darauf, dass Parameter-Bindung noch nicht eine magische One-Stop-Lösung gegen alle SQL-Injektionen ist. Es handhabt die häufigste Verwendung für datavalues. Aber cant Whitelist Spalte Name Tabelle Identifikatoren, Hilfe bei der dynamischen Klausel Konstruktion oder einfach nur Array-Wertlisten. Hybrid-PDO-Verwendung Diese pdo-Wrapper-Funktionen machen eine kodierungsfreundliche Stop-Lücke-API. (Sein ziemlich viel, was MYSQLI gewesen sein könnte, wenn es nicht für die idiosynkratische Funktion Signaturverschiebung war). Sie stellen auch die reale PDO zu den meisten Zeiten. Umschreiben muss nicht auf die Verwendung der neuen pdo Funktion Namen zu stoppen. Sie könnten nacheinander eine pdoquery () in einen einfachen pdo-prepare () - execute () - Aufruf übergeben. Am besten, um wieder zu vereinfachen. Zum Beispiel das gemeinsame Ergebnis holen: Kann mit nur einer foreach-Iteration ersetzt werden: Oder besser noch eine direkte und vollständige Array-Abfrage: Youll erhalten mehr hilfreiche Warnungen in den meisten Fällen als PDO oder MySQL in der Regel nach fehlgeschlagenen Abfragen. Andere Optionen So dies hoffentlich visualisiert einige praktische Gründe und ein wertvoller Weg, um mysql fallen. Nur Umstellung auf pdo nicht ganz schneiden. Pdoquery () ist auch nur ein Frontend darauf. Sofern Sie auch die Einführung von Parameter-Bindung oder können etwas anderes aus der schöneren API, seine ein sinnloser Schalter. Ich hoffe, dass seine Darstellung einfach genug, um nicht die Entmutigung zu den Newcomern. (Bildung funktioniert in der Regel besser als Verbot.) Während es für die einfachste Sache, die-möglicherweise-Arbeit-Kategorie, seine auch noch sehr experimentellen Code qualifiziert. Ich schrieb es gerade über das Wochenende. Theres eine Fülle von Alternativen jedoch. Nur google für PHP-Datenbank-Abstraktion und durchsuchen Sie ein wenig. Es gab und wartet schon viele exzellente Bibliotheken für solche Aufgaben. Wenn Sie Ihre Datenbank-Interaktion weiter vereinfachen möchten, sind Mapper wie ParisIdiorm einen Versuch wert. Genau wie niemand nutzt die bland DOM in JavaScript nicht mehr, müssen Sie nicht babysitten eine rohe Datenbank-Schnittstelle heutzutage. Beantwortet Dec 24 13 at 23:30 Apropos aus technischen Gründen gibt es nur wenige, extrem spezifisch und selten verwendet. Wahrscheinlich werden Sie nie verwenden sie in Ihrem Leben. Möglicherweise bin ich zu ignorant, aber ich hatte nie die Gelegenheit, sie zu verwenden, wie non-blocking, asynchrone Abfragen gespeicherte Prozeduren, die mehrere Resultsets zurückgeben Verschlüsselung (SSL) Komprimierung Wenn Sie sie benötigen - dies sind zweifellos technische Gründe, sich von mysql zu entfernen Erweiterung zu etwas mehr stylish und modern-looking. Trotzdem gibt es auch einige nicht-technische Probleme, die Ihre Erfahrung ein bisschen härter weiter nutzen können diese Funktionen mit modernen PHP-Versionen erhöhen werden veraltete Hinweise. Sie können einfach ausgeschaltet werden. In einer entfernten Zukunft können sie möglicherweise aus dem Standard-PHP-Build entfernt werden. Nicht eine große Sache zu, wie mydsql ext wird in PECL verschoben werden und jeder Hoster wird glücklich sein, PHP mit ihm zu kompilieren, da sie nicht wollen, Kunden verlieren, deren Websites waren seit Jahrzehnten arbeiten. Starken Widerstand von Stackoverflow Gemeinschaft. Sehr Zeit, die Sie diese ehrlichen Funktionen erwähnen, wird Ihnen gesagt, dass sie unter strengen Tabus sind. Ist eine durchschnittliche PHP-Benutzer, wahrscheinlich ist Ihre Idee der Verwendung dieser Funktionen fehleranfällig und falsch. Nur wegen all dieser zahlreichen Tutorials und Handbücher, die dich falsch belehren. Nicht die Funktionen selbst - ich muss sie betonen - sondern die Art, wie sie verwendet werden. Diese letztere Frage ist ein Problem. Aber meiner Meinung nach ist die vorgeschlagene Lösung auch nicht besser. Es scheint mir zu idealistisch ein Traum, dass alle PHP-Nutzer lernen, wie man SQL-Abfragen richtig auf einmal behandeln. Wahrscheinlich würden sie nur mysql zu mysqli mechanisch ändern, so dass der Ansatz das gleiche. Vor allem, weil mysqli macht vorbereiteten Anweisungen verwenden unglaublich schmerzhaft und lästig. Ganz zu schweigen davon, dass native vorbereitete Anweisungen arent genug, um von SQL-Injektionen zu schützen, und weder mysqli noch PDO bietet eine Lösung. Also, statt zu kämpfen diese ehrliche Erweiterung, Id lieber falsche Praktiken zu kämpfen und Menschen auf die richtige Art und Weise zu erziehen. Auch gibt es einige falsche oder nicht signifikante Gründe, wie Doesnt unterstützen gespeicherte Prozeduren (wir waren mit mysqlquery (CALL myproc) für Altersgruppen) Doesnt Unterstützung Transaktionen (wie oben) unterstützt nicht mehrere Statements (die sie brauchen) Nicht unter aktive Entwicklung (So, was hat es Sie in irgendeiner praktischen Weise) fehlt eine OO-Schnittstelle (um eine zu schaffen ist eine Frage von mehreren Stunden) Unterstützt nicht Prepared Statements oder parametrisierte Abfragen Letzteres ist ein interessanter Punkt. Obwohl mysql ext keine nativen vorbereiteten Anweisungen unterstützt, sind sie für die Sicherheit unerlässlich. Wir können leicht vorbereitete Anweisungen mit manuell gehandhabten Platzhaltern gefälschen (genau wie PDO): voila. Alles ist parametriert und sicher. Aber okay, wenn Sie nicht wie das rote Feld in der Anleitung, ein Problem der Wahl entsteht: mysqli oder PDO Nun, wäre die Antwort wie folgt: Wenn Sie verstehen, die Notwendigkeit der Verwendung einer Datenbank Abstraktion Schicht. Und die Suche nach einer API, um eine zu schaffen, ist mysqli eine sehr gute Wahl, da es tatsächlich unterstützt viele MySQL-spezifische Funktionen. Wenn, wie fast die Mehrheit der PHP-Leute, sind Sie mit rohen API-Anrufe direkt im Anwendungscode (das ist im Grunde falsche Praxis) - PDO ist die einzige Wahl. Da diese Erweiterung nicht nur API, sondern ein Semi-DAL ist, das noch unvollständig ist, aber viele wichtige Merkmale bietet, mit zwei von ihnen macht PDO kritisch von mysqli unterscheiden: Im Gegensatz zu mysqli kann PDO Platzhalter nach Wert binden. Die dynamisch aufgebaute Abfragen machbar macht, ohne mehrere Bildschirme von ziemlich chaotisch Code. Im Gegensatz zu mysqli, PDO kann immer Rückfrage Ergebnis in einem einfachen üblichen Array, während mysqli kann es nur auf mysqlnd Installationen. Also, wenn Sie ein durchschnittlicher PHP-Benutzer und wollen Sie sich eine Menge Kopfschmerzen bei der Verwendung von nativen vorbereiteten Aussagen zu retten, ist PDO - wieder - die einzige Wahl. Jedoch ist PDO nicht ein silbernes Gewehrkugel auch, und hat seine Nöte. Also, ich schrieb Lösungen für alle gängigen Fallstricke und komplexe Fälle in der PDO-Tag wiki Dennoch sprach jeder von Erweiterungen immer fehlt die 2 wichtigen Fakten über Mysqli und PDO: Prepared Aussage ist nicht eine silberne Kugel. Es gibt dynamische Identifikatoren, die mit vorbereiteten Anweisungen nicht gebunden werden können. Es gibt dynamische Abfragen mit unbekannter Anzahl von Parametern, die Abfrage erstellen eine schwierige Aufgabe macht. Weder mysqli noch PDO-Funktionen sollten im Anwendungscode angezeigt werden. Es sollte eine Abstraktionsschicht zwischen ihnen und Anwendungscode, die alle dirty Job der Bindung, Looping, Fehlerbehandlung, etc. im Inneren machen wird, so dass Anwendungs-Code getrocknet und sauber. Besonders für komplexe Fälle wie dynamisches Query-Building. Also, nur Umstellung auf PDO oder MySQL ist nicht genug. Es muss ein ORM oder ein Abfrage-Builder oder eine Datenbank-Abstraktionsklasse verwendet werden, anstatt rohe API-Funktionen in ihrem Code aufzurufen. Und im Gegenteil - wenn Sie eine Abstraktionsschicht zwischen Ihrem Anwendungscode und MySQL-API - es doesnt tatsächlich, welche Engine verwendet wird. Sie können mysql ext verwenden, bis es abgelehnt wird und dann einfach umwandeln Sie Ihre Abstraktion-Klasse zu einem anderen Motor, mit allen Anwendungscode intakt. Hier sind einige Beispiele, die auf meiner safemysql-Klasse basieren, um zu zeigen, wie eine solche Abstraktionsklasse sein sollte: Vergleichen Sie diese eine Zeile mit der Menge an Code, die Sie mit PDO benötigen. Dann vergleichen mit verrückten Menge an Code, den Sie mit rohen Mysqli vorbereiteten Anweisungen benötigen. Beachten Sie, dass Fehlerbehandlung, Profilerstellung, Abfrageprotokollierung bereits eingebaut und ausgeführt wird. Vergleichen Sie es mit den üblichen PDO-Einfügungen, wenn jeder einzelne Feldname sechs - bis zehnmal wiederholt wird - in all diesen zahlreichen benannten Platzhaltern, Bindungen und Abfragedefinitionen. Sie können kaum ein Beispiel für PDO finden, um diesen praktischen Fall zu behandeln. Und es wird zu wortreich und höchstwahrscheinlich unsicher. Also, noch einmal - es ist nicht nur roher Treiber sollte Ihr Anliegen sein, sondern Abstraktion Klasse, nützlich nicht nur für dumme Beispiele aus Anfänger-Handbuch, sondern zu lösen, was wirklich Probleme im Leben. Wie ist nicht unter aktiver Entwicklung nur für das gefertigte 390.0139 Wenn Sie etwas mit dieser Stand-Still-Funktion zu bauen, aktualisieren Sie Ihre MySQL-Version in einem Jahr und wind up mit einem nicht funktionierenden System, I39m sicher, es gibt eine Menge von Menschen plötzlich, dass 390.0139. I39d sagen, dass abgelehnte und nicht unter aktiver Entwicklung eng miteinander verwandt sind. Sie können sagen, dass es quotno würdig reasonquot für sie, aber die Tatsache ist, dass, wenn eine Wahl zwischen den Optionen angeboten, ist keine aktive Entwicklung fast genauso schlimm wie veraltet I39d sagen ndash Nanne Feb 1 13 at 10:21 ShaquinTrifonoff: sicher, Es verwendet keine vorbereiteten Aussagen. Aber auch keine PDO. Was die meisten Menschen über MySQLi empfehlen. So I39m nicht sicher, dass hat einen erheblichen Einfluss hier. Der obige Code (mit ein wenig mehr Parsing) ist, was PDO tut, wenn Sie eine Anweisung standardmäßig vorbereiten. Ndash ircmaxell Diese Antwort ist geschrieben, um zu zeigen, wie trivial es ist, schlecht geschrieben geschrieben PHP-Benutzer-Validierungs-Code, wie (und mit was) diese Angriffe zu arbeiten und wie die alten MySQL-Funktionen durch eine sichere ersetzen Vorbereiteten Anweisung - und im Grunde warum StackOverflow Benutzer (vermutlich mit viel Repräsentanten) an neuen Benutzern bellen, die Fragen stellen, um ihren Code zu verbessern. Zuerst von, fühlen Sie bitte sich frei, diese Test-MySQL-Datenbank zu erstellen (ich habe meine Vorbereitung genannt): Mit, dass getan, können wir zu unserem PHP-Code zu bewegen. Wir gehen davon aus, das folgende Skript ist die Überprüfung für einen Admin auf einer Website (vereinfacht, aber funktioniert, wenn Sie kopieren und es zum Testen): Scheint legitim genug auf den ersten Blick. Der Benutzer muss ein Login und Passwort eingeben, rechts Brilliant, geben Sie nicht in die folgenden: Die Ausgabe ist wie folgt: Super Arbeiten wie erwartet, können nun versuchen, den tatsächlichen Benutzernamen und Passwort: Amazing Hi-fives rund um, der Code korrekt überprüft Ein Admin. Sein vollkommenes Brunnen, nicht wirklich. Lets sagen, der Benutzer ist eine kluge kleine Person. Nehmen wir an, die Person ist mir. Geben Sie in den folgenden: Und die Ausgabe ist: Congrats, Sie erlaubt mir nur Ihre super-geschützten Admins nur Abschnitt mit mir geben einen falschen Benutzernamen und ein falsches Passwort eingeben. Im Ernst, wenn Sie mir nicht glauben, erstellen Sie die Datenbank mit dem Code, den ich zur Verfügung gestellt, und führen Sie diese PHP-Code - die auf den ersten Blick wirklich scheinen, um den Benutzernamen und das Passwort ziemlich gut zu überprüfen. Also, in Antwort, das ist, warum Sie sich geärgert werden. Also, lassen Sie einen Blick auf was schief gelaufen, und warum ich gerade in Ihre Super-admin-only-Fledermaus-Höhle. Ich nahm eine Vermutung und nahm an, dass Sie werent sorgfältig mit Ihren Eingaben und einfach übergeben sie an die Datenbank direkt. Ich baute die Eingabe in einer Weise tht würde ÄNDERN Sie die Abfrage, die Sie tatsächlich ausgeführt wurden. Also, was es sein sollte, und was es am Ende wird Thats die Abfrage, aber wenn wir die Variablen durch die tatsächlichen Eingaben, die wir verwendet ersetzen, erhalten wir die folgenden: Siehe, wie ich mein Passwort, so dass es zuerst gebaut wurde Schließen Sie die einzelnen Zitat rund um das Passwort, dann führen Sie einen völlig neuen Vergleich Dann nur für die Sicherheit, fügte ich eine weitere Zeichenfolge, so dass das einfache Angebot würde geschlossen wie erwartet in den Code, den wir ursprünglich hatte. Allerdings ist dies nicht über Leute schreien Sie jetzt, dies ist etwa zeigen Ihnen, wie Sie Ihren Code sicherer zu machen. Okay, so was ging schief, und wie können wir es beheben Dies ist eine klassische SQL-Injection-Angriff. Eine der einfachsten für diese Angelegenheit. Auf der Skala der Angriffsvektoren, ist dieses ein Kleinkind, das einen Behälter angreift - und gewinnen. Also, wie schützen wir Ihre heiligen Admin-Bereich und machen es schön und sicher Das erste, was zu tun ist, zu stoppen mit den wirklich alten und veralteten MySQL-Funktionen. Ich weiß, Sie folgten einem Tutorial Sie online gefunden und es funktioniert, aber seine alten, seine veraltet und in den Raum von ein paar Minuten, ich habe einfach an ihm vorbei, ohne so viel wie brechen einen Schweiß gebrochen. Jetzt haben Sie die besseren Möglichkeiten der Verwendung von mysqli oder PDO. Ich bin persönlich ein großer Fan von PDO, so werde ich mit PDO in den Rest dieser Antwort. Es gibt Vor-und Nachteile, aber persönlich finde ich, dass die Profis weit überwiegen die Nachteile. Seine tragbaren über mehrere Datenbank-Engines - ob Sie mit MySQL oder Oracle oder einfach nur blutigen alles - nur durch Ändern der Verbindungszeichenfolge, hat es alle Phantasie Features, die wir verwenden möchten und es ist schön und sauber. Ich mag sauber. Nun, können wir einen Blick auf diesen Code wieder, diesmal geschrieben mit einem PDO-Objekt: Die wichtigsten Unterschiede sind, dass es keine weitere MySQL-Funktionen. Seine alle getan über ein PDO-Objekt, zweitens, es ist mit einer vorbereiteten Anweisung. Nun, was ist eine Prepared-Anweisung Sie bitten, seine eine Möglichkeit, die Datenbank vor der Ausführung einer Abfrage zu sagen, was die Abfrage ist, dass wir ausgeführt werden. In diesem Fall sagen wir die Datenbank: Hallo, Ich werde eine select-Anweisung führen id, userid und Pass aus der Tabelle Benutzer, wo die userid ist eine Variable und der Pass ist auch eine Variable .. Dann in der execute-Anweisung , Übergeben wir die Datenbank ein Array mit allen Variablen, die es jetzt erwartet. Die Ergebnisse sind fantastisch. Versuchen Sie, diese Benutzernamen und Passwort-Kombinationen von vor wieder: Benutzer wurde nicht überprüft. Genial. Oh, ich habe gerade ein wenig aufgeregt, es funktionierte: Der Scheck übergeben. We have a verified admin Now, lets try the data that a clever chap would enter to try to get past our little verification system: This time, we get the following: This is why you are being yelled at when posting questions - its because people can see that your code can be bypassed wihout even trying. Please, do use this question and answer to improve your code, to make it more secure and to use functions that are current. Lastly, this isnt to say that this is PERFECT code. There are many more things that you could do to improve it, use hashed passwords for example, ensure that when you store sensetive information in the database, you dont store it in plain text, have multiple levels of verification - but really, if you just change your old injection prone code to this, you will be WELL along the way to writing good code - and the fact that you have gotten this far and are still reading gives me a sense of hope that you will not only implement this type of code when writing your websites and applications, but that you might go out and research those other things I just mentioned - and more. Write the best code you can, not the most basic code that barely functions. answered Sep 18 13 at 12:28 Because (amongst other reasons) its much harder to ensure the input data is sanitized. If you use parametrized queries, as one does with PDO or mysqli you can entirely avoid the risk. As an example, some-one could use enhzflep) drop table users as a user name. The old functions will allow executing of multiple statements per query, so something like that nasty bugger can delete a whole table. If one were to use PDO of mysqli, the user-name would end-up being enhzflep) drop table users The old functions will allow executing of multiple statements per query - no, they won39t. That kind of injection is not possible with extmysql - the only way this kind of injection is possible with PHP and MySQL is when using MySQLi and the mysqlimultiquery() function. The kind injection that is possible with extmysql and unescaped strings is things like 39 OR 39139 391 to extract data from the database that was not meant to be accessible. In certain situations it is possible to inject sub queries, however it is still not possible to modify the database in this way. ndash DaveRandom Dec 30 12 at 20:58 The MySQL extension is the oldest of the three and was the original way that developers used to communicate with MySQL. This extension is now being deprecated in favor of the other two alternatives because of improvements made in newer releases of both PHP and MySQL. MySQLi is the improved extension for working with MySQL databases. It takes advantage of features that are available in newer versions of the MySQL server, exposes both a function-oriented and an object-oriented interface to the developer and a does few other nifty things. PDO offers an API that consolidates most of the functionality that was previously spread across the major database access extensions, i. e. MySQL, PostgreSQL, SQLite, MSSQL, etc. The interface exposes high-level objects for the programmer to work with database connections, queries and result sets, and low-level drivers perform communication and resource handling with the database server. A lot of discussion and work is going into PDO and its considered the appropriate method of working with databases in modern, professional code. answered Sep 2 15 at 7:20 I find the above answers really lengthy, so to summarize: The mysqli extension has a number of benefits, the key enhancements over the mysql extension being: Object-oriented interface Support for Prepared Statements Support for Multiple Statements Support for Transactions Enhanced debugging capabilities Embedded server support As explained in the above answeres, the alternatives of mysql are mysqli and pdo. API supports server-side Prepared Statements. Supported by MYSQLi and PDO API supports client-side Prepared Statements. Supported only by PDO API supports Stored Procedures. Both MySQLi and PDO API supports Multiple Statements and all MySQL 4.1 functionality - Supported by MySQLi and mostly also by PDO Both MySQLi and PDO where introduced in PHP5.0, whereas MySQL was introduced prior to PHP3.0. A point to note is MySQL is included in PHP5.x though deprecated in later versions. Delete Query error: quotCould not delete from specified tablesquot I am attempting to archive and delete records from a timelog table using selected start Startdate and end date EndDate paramaters which are fields contained in a separate StartEndDate table. I have created both an archive query and a delete query. The Archive query works fine but when I execute the delete query I get a message: quotCould not delete from specified tablesquot The archive and delete vba code is as follows: Archive Data stDocName quotArchivehoursquot DoCmd. OpenQuery stDocName, acNormal, acEdit The SQL is as follows: INSERT INTO ArchvedTimeLog SELECT tblTimeLog. FROM tblTimeLog, StartEndDates WHERE (((tblTimeLog. LogDate)gtStartEndDates. StartDate And (tblTimeLog. LogDate)ltStartEndDates. EndDate)) The archive action works fine. Purge Active File stDocName quotDeleteArchivedHoursquot DoCmd. OpenQuery stDocName, acNormal, acEdit DELETE DISTINCTROW tblTimeLog., tblTimeLog. LogDate FROM tblTimeLog, StartEndDates WHERE (((tblTimeLog. LogDate)gtStartDate And (tblTimeLog. LogDate)ltEndDate)) The Table VIEW of this query looks perfect. However, upon execution, I get the message: quotCould not delete from specified tablesquot Any help would be greatly appreciated. MBA Re: Delete Query error: quotCould not delete from specified tablesquot DISTINCTROW is used to supress duplicates. If you need to use this then your query clearly does not offer a suitable candidate key. Deletes become problematic once joins get involved. I usually do this kind of delete in two steps. Update one of the fields with an out of scope value then delete based on that flag. We often get questions about problems with archiving from new developers who think they have a large table when it gets to a few tens of thousands of records. When a table passes a million records then it is starting to get substantial. Moreover the dangerous process of moving records to another table is often under estimated and they assume the copy worked and nonchalently progress to the delete. In most cases a simple quotdeletedquot flag applied to the records is a simpler and safer option. With an index on the deleted field the performance is very similar. BTW The Datasheet View of any query is a SELECT so does not necessarily work as an action query. Originally Posted by Galaxiom DISTINCTROW is used to supress duplicates. If you need to use this then your query clearly does not offer a suitable candidate key. Deletes become problematic once joins get involved. I usually do this kind of delete in two steps. Update one of the fields with an out of scope value then delete based on that flag. We often get questions about problems with archiving from new developers who think they have a large table when it gets to a few tens of thousands of records. When a table passes a million records then it is starting to get substantial. Moreover the dangerous process of moving records to another table is often under estimated and they assume the copy worked and nonchalently progress to the delete. In most cases a simple quotdeletedquot flag applied to the records is a simpler and safer option. With an index on the deleted field the performance is very similar. BTW The Datasheet View of any query is a SELECT so does not necessarily work as an action query. Thanks so much for solving a huge problem for me. Im not archiving, but trying to eliminate some unwanted records in a dataset, and your two-step technique worked perfectly

Comments