Unterstrich ("_") in SQL maskieren?

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

  • Unterstrich ("_") in SQL maskieren?

    Hallo zusammen,

    ich möchte zu einer DB die Felder einer Tabelle anzeigen lassen:

    $result = mysql_query("SELECT * FROM '$tabelle'");
    $numfields = mysql_num_fields($result);
    $numrows = mysql_num_rows($result);

    Das klappt auch problemlos, es sei denn, der Tabellenname enthält einen Unterstrich, d.h. z.B. meyer_kunden etc.
    Ebenso gibt es Probleme, wenn die Feldbezeichner Unterstriche enthalten: kunden_nachname, kunden_vorname etc.

    Ich erhalte dann ein:
    "Warning: mysql_num_fields(): supplied argument is not a valid MySQL result "

    Da das nicht meine Tabellen sind, muss ich die Bezeichner nehmen, wie sie sind :-(

    Ich vermute, der Unterstrich wird in SQL als Platzhalter verwendet u. produziert daher den Fehler.

    Gibt es eine Möglichkeit, den String so zu übergeben, dass ein Unterstrich in dem SQL-Statement als Unterstrich verarbeitet wird?

    Gruß u. danke schon mal

    Olliu

  • #2
    Re: Unterstrich ("_&quot in SQL maskieren?

    http://dev.mysql.com/doc/refman/4.1/en/legal-names.html
    I don't believe in rebirth. Actually, I never did in my whole lives.

    Kommentar


    • #3
      Hallo wahsaga,

      danke, das hatte ich schon gelesen (aber vielleicht ziehe ich nicht die richtigen Schlüsse?!)

      Aber mein Problem ist ja nicht die Neubenennung von Feldern oder Tabellen (sonst würde ich die Unterstriche einfach weglassen), sondern ich schlage mich mit Tabellen- u. Feldnamen herum, die diesen '_' bereits beinhalten.

      Und ich weiß nicht, wie ich den sql-Modus (oder wie auch immer) mit PHP einstellen kann oder wie ich via PHP dazu bekomme, die Feldnamen an MySQL zu übergeben, ohne dass es zu den genannten Problemen kommt.

      D.h. Wie mache ich aus $tabelle = meyer_kunden ein Statement, dass den Unterstrich mit übergibt, ohne dass MySQL meckert?

      Gruß

      Olliu

      Kommentar


      • #4
        Original geschrieben von Olliu
        danke, das hatte ich schon gelesen
        Du meinst vermutlich eher überflogen ...?
        D.h. Wie mache ich aus $tabelle = meyer_kunden ein Statement, dass den Unterstrich mit übergibt, ohne dass MySQL meckert?
        Wie Namen, die Sonderzeichen enthalten, innerhalb einer Query notiert werden müssen, steht auf der verlinkten Seite.
        Also lies sie noch mal.
        I don't believe in rebirth. Actually, I never did in my whole lives.

        Kommentar


        • #5
          Lieber wahsaga,

          nein, nicht überflogen, sondern gelesen...

          Hilft mir aber nicht weiter. Muss ich mich wohl woanders umsehen. Danke dennoch für Deine Zeit.

          Olliu

          Kommentar


          • #6
            Original geschrieben von Olliu
            nein, nicht überflogen, sondern gelesen...
            Gut lieber Olliu also ... wie interpretierst Du den Satz:
            The identifier quote character is the backtick (‘`’):
            carpe noctem

            [color=blue]Bitte keine Fragen per EMail ... im Forum haben alle was davon ... und ich beantworte EMail-Fragen von Foren-Mitgliedern in der Regel eh nicht![/color]
            [color=red]Hinweis: Ich bin weder Mitglied noch Angestellter von ebiz-consult! Alles was ich hier von mir gebe tue ich in eigener Verantwortung![/color]

            Kommentar


            • #7
              Hallo, lieber Goth,

              Gut lieber Olliu also ... wie interpretierst Du den Satz: The identifier quote character is the backtick (‘`’):
              aha, ein Ratespiel - ich liebe Ratespiele :-)

              nein, Scherz beiseite.

              Also, Goth (und wahsaga): den Hinweis mit dem Backtick _habe_ ich gelesen. Und glaube verstanden zu haben, dass man damit ein anderes Zeichen - z.B. das "_" maskieren kann.
              Es müsste also - nehme ich an etwas wie `_ in der Bezeichnung der Tabelle oder des Feldes stehen.

              Das habe ich mit str_replace versucht.
              ($tabelle = str_replace(etc.);
              Klappt aber irgendwie nicht.
              Daher nützt mir der Hinweis alleine noch nichts. Denn: Ich übergebe nicht eine feste Tabelle, wo ich das "hardcoded" erledigen könnte, sondern habe es mit verschiedensten Tabellen zu tun, die ich über eine Variable $tabelle an das SQL-Statement übergebe (siehe mein erstes Posting).
              Nun ist z.B. $tabelle = "meyer_kunden".
              Das Statement in SQL sieht dann so aus:
              Select * from '$tabelle';

              Irgendwo hakt es. Ich bekomme immer dieselbe Fehlermeldung. Übergebe ich Tabellen OHNE Unterstrich an das Script, dann funktioniert das Script einwandfrei. Daher muss es m.E. daran liegen.
              Vielleicht bin ich ja auch völlig auf dem Holzweg?!

              Ich kann der MySQL Anleitung leider nicht entnehmen, wie ich das Problem löse - vielleicht mag EUCH das ja klar u. offensichtlich sein (wie ich Euren Postings zu entnehmen glaube) - mir ist es nicht klar. Wirklich nicht. Ich stehe auf dem Schlauch. Unter "maskieren" finde ich im Internet nur HTML-Maskierung oder Maßnahmen gegen SQL-Injections und meine Bücher geben leider auch keine Lösung her. Im Forum hier habe ich auch nichts gefunden - vielleicht suche ich ja auch nach dem falschen Stichwort. Und daher wäre ich für die LÖSUNG dankbar.

              Daher noch mal meine Frage:
              Wenn in $tabelle z.B. "meyer_kunden" steht, wie muss ich die dann in PHP umwandeln, damit das Statement

              "Select * from '$tabelle'"; funktioniert.

              Über eine konkrete Hilfe freue ich mich schon mal ;-)

              Gruß

              Olliu

              Kommentar


              • #8
                Irgendwie hast Du gar nichts verstanden ... !!!!

                Select * from `$tabelle`

                Backtick ... !!
                carpe noctem

                [color=blue]Bitte keine Fragen per EMail ... im Forum haben alle was davon ... und ich beantworte EMail-Fragen von Foren-Mitgliedern in der Regel eh nicht![/color]
                [color=red]Hinweis: Ich bin weder Mitglied noch Angestellter von ebiz-consult! Alles was ich hier von mir gebe tue ich in eigener Verantwortung![/color]

                Kommentar


                • #9
                  Hallo goth,

                  das ist der Moment, wo man sich mit der flachen Hand vor die Stirn schlägt... :-)

                  Ich habe die ganze Zeit versucht, die Backticks mit der Variable zu übergeben:

                  $tabelle = "`" . $tabelle . "`"

                  und ein Echo ergibt dann auch einen wunderschönen String. Und hat mich rätseln lassen.

                  Dann habe ich versucht, den Unterstrich zu maskieren - analog zu Maskierungen für Anführungszeichen (wenn \" = " ergibt, dann muss doch `_ = _ ergeben ...)

                  Dank Deinem Einzeiler funktionierts jetzt!

                  DANKE.

                  Olliu

                  Kommentar


                  • #10
                    Hallo Goth,

                    sorry, aber ich bins noch mal.

                    War wohl gestern doch zu vorschnell u. habe das Script gestern versehentlich mit einer falschen Tabelle (ohne "_") getestet (Mist!).

                    Bei Tabellen mit "_" versagt auch der Backtick.

                    Das steht jetzt so in meinem Code:

                    $sql = "Select * from `$tabelle`";

                    (etc.)

                    und produziert dieselben Fehler wie eingangs geschildert, wenn in $tabelle ein Wert mit einem "_" steht - wie z.B. meyer_kunden.
                    Heißt die Tabelle meyerkunden, dann geht alles glatt u. ohne Probleme.
                    Das Einpacken von $tabelle in Backticks scheint nicht zu reichen.

                    Gruß

                    Olliu

                    Kommentar


                    • #11
                      Hallo zusammen,

                      ich habe den Fehler gefunden - wenn ich ihn auch nicht erklären kann.
                      Also ich habe zwei Scripte:
                      1) Datenbankenzeigen.php
                      2) Datenbanktabelle.php

                      1 ruft alle DBs auf u. lässt eine Auswahl einer DB zu. Dann werden zu der DB die Tabellen angezeigt (Zugriffsrechte vorausgesetzt).

                      Script 1:
                      PHP-Code:
                      // Hier die Anbindung an Eure DB-Umgebung vornehmen
                      include "dbconnect_inc.php";

                      // Das Formular ruft sich immer wieder selbst auf. 
                      // Daher werden die Variablen vorbelegt, die beim vorherigen Aufruf besetzt wurden.

                      if (isset($_GET['datenbank']))
                      {
                          
                      $datenbank $_GET['datenbank'];
                          echo 
                      "DATENBANK: $datenbank";
                      }

                      if (isset(
                      $_GET['tabelle']))
                      {
                          
                      $datenbank $_GET['tabelle'];
                          echo 
                      "- $tabelle<br><br>\n";
                      }

                      // Zeige alle Datenbanken der MySQL-Umgebung
                      $db_list mysql_list_dbs();

                      $i 0;
                      $db_anzahl mysql_num_rows($db_list);

                      echo 
                      "<table border=1>\n";
                      echo 
                      "<tr><td colspan=2>Datenbanken:</td></tr>";
                      echo 
                      "<form action='$_SERVER[PHP_SELF]' method='GET'>\n";
                      while (
                      $i $db_anzahl)
                      {
                          echo 
                      "<tr><td><input type='radio' value=" mysql_db_name($db_list$i). " name='datenbank'></td><td>" mysql_db_name($db_list$i) . "</td></tr>\n";
                             
                      $i++;
                      }
                          echo 
                      "<tr><td colspan=2><input type='submit' name='tabellesenden' value='Tabellen zeigen'></td></tr>";
                          echo 
                      "</form>";
                      echo 
                      "</table>\n";

                      // Schalter auswerten

                          
                      if (isset($_GET['tabellesenden']))
                          {
                              
                      // Schalter ist gedrückt
                              
                      $datenbank $_GET['datenbank'];
                              if (
                      strlen($datenbank) == 0)
                              {
                                  echo 
                      "Bitte wählen Sie eine Datenbank aus.";
                                  exit;
                              }
                          } 
                          else
                          {
                              
                      // Schalter nicht gedrückt
                              
                      echo "Schalter nicht gedrückt.";
                              exit;
                          }


                      // Datenbank wurde ausgewählt, jetzt Tabellen zeigen
                      // 1. Datenbank wählen
                      mysql_select_db($datenbank); 

                      // 2. Tabellen einlesen, Anzahl einlesen
                      $result mysql_list_tables($datenbank);
                      $num mysql_num_rows($result);

                      echo 
                      "<table border=1>\n";
                      echo 
                      "<tr><td colspan=2>Tabellen der Datenbank: <b>$datenbank</b></td></tr>\n";
                      echo 
                      "<form action='$_SERVER[PHP_SELF]' method='GET'>\n";
                      for (
                      $i 0$i $num$i++) 
                      {
                         
                      $tabellemysql_tablename($result$i); 
                         echo 
                      "<tr><td><a href='datenbanktabelle.php?datenbank=$datenbank&tabelle=$tabelle'>$tabelle</a></td></tr>\n";
                      }
                          echo 
                      "<tr><td colspan=2><input type='submit' name='feldsenden' value='Felder zeigen'></td></tr>";
                      echo 
                      "</form>\n";
                      echo 
                      "</table>\n"
                      Script 2: Datenbanktabelle.php:
                      PHP-Code:
                      //Datenbankanbindung
                      include "dbconnect_inc.php";

                      if (!isset(
                      $_GET['datenbank']))
                      {
                          echo 
                      "Diese Seite kann nur von Datenbankenzeigen.php aufgerufen werden.";
                          exit;
                      }
                      $datenbank $_GET['datenbank'];
                      $tabelle $_GET['tabelle'];

                      // Hier muss mysql_select_db NOCH EINMAL angegeben werden, da sonst der Zugriff auf die 
                      // Tabellen mit Unterstrich nicht funktioniert.
                      // Interessanterweise liefert das Script ein Ergebnis, wenn die Tabelle keinen Unterstrich hat.
                      // Grund: ???
                      mysql_select_db($datenbank); 

                      // Das hier wurde mir im Forum empfohlen, geht aber nicht bei "_" (Backticks um $tabelle)
                      $sql "SELECT * FROM `$tabelle`";

                      $result mysql_query($sql);
                      $num_fields mysql_num_fields($result);
                      $num_rows mysql_num_rows($result);


                      echo 
                      "Datenbank: <b>$datenbank</b><br>";
                      echo 
                      "Die Tabelle <b>$tabelle</b> hat <b>$num_fields</b> Felder und <b>$num_rows</b> Datensätze: ";
                      echo 
                      "<br>";

                      echo 
                      "<table border=1>\n";
                      // Kopfleiste mit Feldern aufbauen
                      echo "<tr>";
                      for (
                      $i 0$i<$num_fields$i++)
                      {
                          
                      $feld mysql_field_name($result,$i);
                          
                      $feldarray[$i]=mysql_field_name($result,$i);
                          echo 
                      "<td>$feld</td>";
                      }
                      echo 
                      "</tr>\n";    

                      // Feldinhalte aufbauen:

                      for ($k 0$k<$num_rows$k++)
                      {
                          echo 
                      "<tr>";
                          for (
                      $i=0;$i<$num_fields;$i++)
                          {
                              
                      $content mysql_result($result,$k,$feldarray[$i]);
                              if (
                      $content=="")
                              {
                              
                      $content "LEER";    
                              }
                              echo 
                      "<td>$content</td>";
                          }
                          echo 
                      "</tr>\n";
                      }
                          
                      echo 
                      "</table>\n"
                      Szenario:
                      Hat die Datenbank in der Bezeichnung einen Unterstrich, die aufgerufene Tabelle aber NICHT, so funktioniert Script 2 auch ohne die Zeile
                      mysql_select_db($datenbank);

                      Wenn aber die Tabelle AUCH einen Unterstrich hat oder NUR die Tabelle einen Unterstrich hat, MUSS die o.g. Zeile zwingend in Script 2 eingefügt werden.

                      Warum? Keine Ahnung.
                      Jedenfalls so, wie oben gepostet, erhält man in Script 1 eine Auflistung aller DB und in Script 2 die Felder u. Inhalte einer Tabelle der ausgewählten DB.

                      Gruß, Danke noch mal

                      Olliu

                      Kommentar

                      Lädt...
                      X