Ankündigung

Einklappen
Keine Ankündigung bisher.

Sonderzeichen in MySql

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Sonderzeichen in MySql

    Ich habe einen Newsbereich in PHP in dem News (Text und Bilder) in eine MySql Datenbank hochgeladen werden. Dies klappt auch soweit einwandfrei. Nun wollte jemand ein Apostroph ' mit hochgeladen bzw. beim Editieren, was von der Datenbank abgelehnt wurde mit der Fehlermeldung:
    Ein Fehler ist aufgetreten 1064: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ')' WHERE id = '37'' at line 1
    Ich habe nun versucht mit der Funktion mysql_real_escape_string() dies zu Filtern in dem ich diese Funktion beim Update folgendermaßen einfüge:

    PHP-Code:
    if ($id) {
    $result=mysql_db_query("$db""UPDATE artikel SET headline_klein = '$headline_klein', datum = '$datum', content_klein = '$content_klein', content = 'mysqli_real_escape_string($content)' WHERE id = '$id'"); 
    Leider ohne Erfolg. Gibt es andere Lösungsansätze? Taugt diese Funktion hierfür überhaupt? Es geht mir Hauptsächlich um den Inhalt also hier "content"
    Ich bin Wiedereinsteiger und bin hier leider nicht mehr auf dem neuesten und bestem Stand, sorry also Falls die Frage etwas unverständlich rüberkommt.
    Bin für alle Anregungen sehr Dankbar.

  • #2
    Nutze PDO mit Prepare Statements. Anleitungen und fertige Codebeispiele findest Du mit der Stichwortsuche.
    bitcoin.de <- Meine Freelancerwährung

    Kommentar


    • #3
      Zitat von Andyeffe Beitrag anzeigen
      ...
      PHP-Code:
      if ($id) {
      $result=mysql_db_query("$db""UPDATE artikel SET headline_klein = '$headline_klein', datum = '$datum', content_klein = '$content_klein', content = 'mysqli_real_escape_string($content)' WHERE id = '$id'"); 
      ...
      Punkt 1: mysql_* Funktionen sind veraltet! Nutze konsequent mysqli_* Funktionen, oder (wie schon erwähnt) PDO.

      Punkt 2: Wenn du einen ordentlichen Editor mit Syntaxhighlighting nutzen würdest (ebenso wie hier im Forum die [PHP ] [/PHP ] Tags), wäre dir schon aufgefallen, dass "mysqli_real_escape_string()" in deinem Query als String und nicht als Funktion verarbeitet wird, was zu dem Fehler führt.

      Kommentar


      • #4
        https://php-de.github.io/jumpto/pdo/

        https://www.php-rocks.de/thema/49-ei...tatements.html
        The string "()()" is not palindrom but the String "())(" is.

        Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
        PHP.de Wissenssammlung | Kein Support per PN

        Kommentar


        • #5
          Erst mal Danke für Eure Antworten,
          ich war länger nicht aktiv deshalb natürlich die veralteten Abfragen bei mir die ja soweit immer noch funktioniert hatten.
          Habe nun mal versucht das Ganze, Also die Artikel Upzudaten mit den PHP Data Objekts umzusetzen, bzw. da ranzukommen, und es zu verstehen.

          das sieht nun so in etwas aus:

          $sDsn = 'mysql:host=localhost;dbname=xxxx;charset=utf8';
          $sUsername = 'xxxx';
          $sPassword = 'xxxx';
          $aOptions = array(
          PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_OBJ,
          PDO::ATTR_EMULATE_PREPARES => false,
          PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
          );
          $pdoObject = new PDO( $sDsn, $sUsername, $sPassword, $aOptions );
          $tpl=hier werden die Templates erstellt
          ));
          if ($id) {
          $pdoStmnt = $pdoObject->prepare("UPDATE artikel SET headline_klein = '$headline_klein', usw.

          mit ->prepare funktioniert das Update leider nicht und alles bleibt wie es vorher war. Versuche ich allerdings das Apostroph mit Upzudaten bekommen ich (Die Seite weist einen Programmierfehler auf)
          Tausche ich ->prepare mit query aus funktioniert das Update wenigstens schon mit normalem Text. Wenigstens scheint die Datenbankverbindung zu funktionieren.
          Hier fehlt wohl noch einiges um das Update mit dem Apostroph korrekt auszuführen.
          Bin mir auch nicht sicher ob die Methode mit
          mysqli_real_escape_string() als Funktion hier nicht besser wäre.
          hoffe mir kann da jemand meiner Unwissenheit auf die Sprünge helfen. Versuche mich natürlich weiter einzulesen.

          Kommentar


          • #6
            Du nutzt das PS falsch. Und ausführen musst du es auch noch.

            Bitte Code-Tags verwenden.
            The string "()()" is not palindrom but the String "())(" is.

            Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
            PHP.de Wissenssammlung | Kein Support per PN

            Kommentar


            • #7
              mysqli_real_escape_string() als Funktion hier nicht besser wäre.
              Du kannst die Funktionen nicht mischen. Mysqli und PDO sind API mit eigene Funktionen.
              Siehe http://php.net/manual/en/mysqlinfo.api.choosing.php

              Kommentar


              • #8
                Dann werde ich mich doch besser für PDO entscheiden und damit weiterarbeiten.
                Die Syntax müsste dann wohl richtig so aussehen, oder?

                PHP-Code:
                <?php
                if ($n_id) {
                $pdoStmnt $pdoObject->prepare("UPDATE artikel SET headline_klein = :headline_klein, datum = :datum, content_klein = :content_klein, content = :content WHERE id = :id");
                und ausführen bei Update wenn ich das richtig verstehe:
                $pdoStmnt->execute();
                ?>

                Kann ich da die gleichen Namen verwenden :headline_klein oder :headline_klein_neu?

                Kommentar


                • #9
                  So sollte es klappen:

                  PHP-Code:
                  <?php
                  if ($n_id) {
                  $pdoStmnt $pdoObject->prepare("UPDATE `artikel` SET `headline_klein` = :headline_klein, `datum` = :datum, `content_klein` = :content_klein, `content` = :content WHERE `id` = :id");
                  $pdoStmnt->execute([
                      
                  ':headline_klein' => $headline_klein,
                      
                  ':datum' => $datum,
                      
                  ':content_klein' => $content_klein,
                      
                  ':content' => $content,
                      
                  ':id' => $id
                  ]);

                  Kommentar


                  • #10
                    Erst mal danke, geht aber leider noch nicht. Bekomme immer
                    (Die Seite weist einen Programmierfehler auf) Habe alle möglichen Varianten durchprobiert mit und ohne die Apostrophe. Der Fehler muss im execute liegen

                    Wenn ich nur

                    PHP-Code:
                    if ($id) {
                    $pdoStmnt $pdoObject->prepare("UPDATE artikel SET headline_klein = :headline_klein, datum = :datum, content_klein = :content_klein, content = :content WHERE id = :id");
                    $pdoStmnt->execute(); 
                    ausführe kommt zwar die FM nicht wird aber logischerweise nicht ausgeführt. Und sobald ich bei
                    content = :content die Apostrophe setze 'content' = :content kommt ebenfalls die FM
                    Vermute also die Syntax in der execute()
                    Habt Ihr da noch eine Idee? Kann ja hoffentlich nur noch eine Kleinigkeit sein....

                    Kommentar


                    • #11
                      Der Fehler liegt bestimmt nicht im execute (und auch nicht deren Syntax) und ich glaube kaum, dass "Die Seite weist einen Programmierfehler auf" die Fehlermeldung ist die angezeigt wird. Dreh das Error-Rerporting auf (Debug Leitfaden: https://php-de.github.io/#debugging), dann bekommst auch aussagekräftige Fehlermeldungen angezeigt!

                      Und nutze in Zukunft die Code-Tags hier im Forum Editor um PHP Code lesbar darzustellen!

                      Und sobald ich bei
                      content = :content die Apostrophe setze 'content' = :content kommt ebenfalls die FM
                      Du sollst da auch keine Apostrophe setzen, das sind sog. Backticks!

                      ' = Single quote
                      ` = Backtick

                      Als "Wiedereinsteiger" sollte dir der Unterschied bewusst sein.

                      Kommentar


                      • #12
                        Den Unterschied kenne ich natürlich, hab beides versucht, ging aber mit beiden und ohne nicht. In vielen Codebeispielen wurden die ganz weggelassen. Das hat mich irritiert.
                        Ich schau mal das ich die Fehlermeldungen angezeigt bekomme nicht die HTML Seite.

                        Kommentar


                        • #13
                          Das nutzen von Backticks ist aus dem Grund empfehlenswert, falls du mal einen Tabellen- oder Spaltennamen benutzt, der ein "geschütztes" Keyword der Datenbank ist.

                          Kommentar


                          • #14
                            Hallo erst mal gutes Neues zusammen,

                            leider scheitern meine Bemühungen weiterhin das Update Skript zum laufen zu bringen.
                            Mit diesem eingegrenztem Skript habe ich versucht das Update zu realisieren Backsticks habe ich hier mal weggelassen an denen liegt's wohl nicht. Ich bekomme sofort die Fehlermeldung. Die Verfügbarkeit ist gegeben PDO steht auf enabled.

                            Mit
                            error_reporting(
                            -1
                            );
                            ini_set(
                            'display_errors'
                            ,
                            1
                            );
                            habe ich versucht mir die Fehler anzeigen zu lassen (Leitfaden). Ohne Erfolg siehe Fehlermelde-
                            Seite.


                            error.JPG
                            Komme also gar nicht so weit


                            PHP-Code:
                            <?php
                            $sDsn 
                            'mysql:host=localhost;dbname=xxx;charset=utf8';
                            $sUsername 'xxx';
                            $sPassword 'xxx';
                            $aOptions = array(
                            PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_OBJ,
                            PDO::ATTR_EMULATE_PREPARES => false,
                            PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
                            );
                            $pdoObject = new PDO($sDsn$sUsername$sPassword$aOptions);
                            $n_id '387';
                            $content 'test';
                            $pdoStmnt $pdoObject->prepare("UPDATE news SET content =:content WHERE n_id=:n_id");
                            $pdoStmnt->execute([
                                
                            ':content' => $content,
                                
                            ':n_id' => $n_id
                            ]);
                            ?>
                            dieses Versuchs- Skript mit der Select Abfrage funktioniert dagegen einwandfrei.

                            PHP-Code:
                            <?php
                            $sDsn 
                            'mysql:host=localhost;dbname=xxxx;charset=utf8';
                            $sUsername 'xxxx';
                            $sPassword 'xxxxx';
                            $aOptions = array(
                            PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_OBJ,
                            PDO::ATTR_EMULATE_PREPARES => false,
                            PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
                            );
                            $pdoObject = new PDO($sDsn$sUsername$sPassword$aOptions);
                            $pdoStmnt $pdoObject->prepare"SELECT content FROM news" );
                            $pdoStmnt->execute();
                            while ( 
                            $dsRow $pdoStmnt->fetch() ) {

                                echo 
                            $dsRow->content '<br />';

                            }
                            ?>
                            Könnte es eventuell noch an der Tabellenstruktur in der Datenbank liegen?

                            db.JPG

                            Kommentar


                            • #15
                              Status 500 => Ins error.log schauen.

                              Kommentar

                              Lädt...
                              X