Patrick R.: Daten werden nicht ausgelesen

Guten Abend.

Es sollen die Mitarbeiter in der Datenbank ausgelesen wurden und angezeigt werden. Aber irgendwie gelingt das nichts so ganz.

Kann mir wer weiter helfen?

  
<html>  
<head>  
	<title>Mitarbeiter</title>
~~~~~~javascript
  
	<script type="text/javascript">  
		<!--  
		function Fenster(URL)  
		{  
			window.open(URL,"Mitarbeiter","width=400,height=300");  
		}  
		//-->  
	</script>
~~~~~~html
  
	<link rel="StyleSheet" type="text/css" href="intranetstyle.css" />  
</head>  
<body>  
<h1>Mitarbeiter</h1>  
<a href="mitarbeiter_neu.php">  
Einen neuen Mitarbeiter eintragen</a><br />  
<br />  
<table width="400" border="1" cellpadding="5">  
	<tr>  
		<th>Name</th>  
		<th>Vorname</th>  
		<th>Durchwahl</th>  
		<td>&nbsp;</td>  
	</tr>
~~~~~~php
  
<?  
error_reporting(0);  
$con = mysql_connect("localhost", "XXXXX", "XXXXXX");  
$db = mysql_select_db("XXXXXX");  
$id = $_GET["id"];  
$res = mysql_query("SELECT * FROM mitarbeiter WHERE abteilung = mysql_escape_string($id)");  
while($row = mysql_fetch_array($res))  
{  
?>
~~~~~~html
  
	<tr>  
		<td>  
		<? echo $row["name"]; ?>  
                </td>  
		<td>  
		<? echo $row["vorname"]; ?>  
                </td>  
		<td>  
		<? echo $row["telefon"]; ?>  
		</td>  
		<td>  
			<a href=javascript:Fenster('mitarbeiter_details.php?id=<? echo urlencode($row["id"]) ?>')>Details</a>  
		</td>  
		</tr>  
	<?  
	}  
	?>  
	</table>  
</body>  
</html>  

Vielen dank.

  1. Aber irgendwie gelingt das nichts so ganz.

    Ah ja, nur so zu 92,5% ?

    Dann lass dir doch mal im KLartext ausgeben, was
    mysql_query("SELECT * FROM mitarbeiter WHERE abteilung = mysql_escape_string($id)");
    bedeutet und gib das unter phpmyadmin ein.

    Vielleicht fehlen dem * Feldnamen oder die $id ist daneben. Was sagt denn mein Kaffeesatz?

    Ahh, unter der $id sind gar keine Einträge vorhanden. Tja, dann gelingt es eben nicht so ganz ...

    Kalle

  2. Hi,

    Es sollen die Mitarbeiter in der Datenbank ausgelesen wurden und angezeigt werden.

    Dann erspare uns bei solchen Fällen künftig bitte die Menge an clientseitigem Code, der absolut nichts damit zu tun hat.

    $id = $_GET["id"];
    $res = mysql_query("SELECT * FROM mitarbeiter WHERE abteilung = mysql_escape_string($id)");

    Für nummerische Werte ist mysql_escape_string sinnfrei, siehe auch http://aktuell.de.selfhtml.org/artikel/php/kontextwechsel/
    (Und für Stringwerte solltest du mysql_real_escape_string verwenden.)

    while($row = mysql_fetch_array($res))

    Wieso führst du keinerlei Erfolgskontrolle und Fehlerbehandlung durch?

    Überprüfe den Rückgabewert von mysql_query, werte im Fehlerfalle mysql_error() aus. Und lass dir die Query zur Kontrolle ausgeben, und teste sie per Copy&Paste über ein DB-Interface, bspw. phpMyAdmin.

    MfG ChrisB

    --
    “Whoever best describes the problem is the person most likely to solve the problem.” [Dan Roam]
    1. $id = $_GET["id"];
      $res = mysql_query("SELECT * FROM mitarbeiter WHERE abteilung = mysql_escape_string($id)");

      Für nummerische Werte ist mysql_escape_string sinnfrei, siehe auch http://aktuell.de.selfhtml.org/artikel/php/kontextwechsel/

      Falsch. Schon mal was von SQL injection gehört? ;)

      lg

      1. Hi!

        $id = $_GET["id"];
        $res = mysql_query("SELECT * FROM mitarbeiter WHERE abteilung = mysql_escape_string($id)");
        Für nummerische Werte ist mysql_escape_string sinnfrei, siehe auch http://aktuell.de.selfhtml.org/artikel/php/kontextwechsel/
        Falsch. Schon mal was von SQL injection gehört? ;)

        Alles Escaping nützt nichts, wenn man es falsch anwendet. Angenommen, der Funktionsaufruf wäre so eingebunden, dass er wirken könnte, so beispielsweise:

        $res = mysql_query(sprintf("SELECT * FROM mitarbeiter WHERE abteilung = %s", mysql_escape_string($id)));

        dann würden zwar in $id enthaltene ' und " zu ' und " gewandelt, aber da keine Anführungszeichen um den eingefügten Wert drumherum stehen, ist auch kein String-Kontext eingeleitet worden. Das Statement befindet sich immer noch im Anweisungsmodus und man kann ohne sich zu verrenken beliebige SQL-Syntax-Elemente einfügen. Und wenn man in dem Zustand selbst Strings einfügen möchte, nimmt man die Hex-Schreibweise, so dass die '"-Konvertierung nicht stört.

        Die entsprechende Stelle im Kontextwechsel-Artikel wäre: Zahlen im (My)SQL-Statement

        Also entweder (beispielsweise durch Zwangskonvertierung in einen Integerwert: intval(), Typecast) sicherstellen, dass wirklich nur eine Zahl das SQL-Statement erreicht oder mit mysql_real_escape_string() _und_ Anführungszeichen arbeiten (oder Prepared Statemens verwenden).

        $res = mysql_query(sprintf("SELECT * FROM mitarbeiter WHERE abteilung = %s", intval($_GET["id"])));
        $res = mysql_query(sprintf("SELECT * FROM mitarbeiter WHERE abteilung = %s", (int)$_GET["id"]));

        $res = mysql_query(sprintf("SELECT * FROM mitarbeiter WHERE abteilung = '%s'", mysql_real_escape_string($_GET["id"])));

        Lo!

        1. Alles Escaping nützt nichts, wenn man es falsch anwendet. Angenommen, der Funktionsaufruf wäre so eingebunden, dass er wirken könnte, so beispielsweise:

          Keine Frage da hast du schon recht, ich bin jetzt auch nicht näher daruf eingegangen, nur das es komplett umsonst ist wollte ich da jetzt nicht so stehen lassen. ;)

          $res = mysql_query(sprintf("SELECT * FROM mitarbeiter WHERE abteilung = %s", intval($_GET["id"])));
          $res = mysql_query(sprintf("SELECT * FROM mitarbeiter WHERE abteilung = %s", (int)$_GET["id"]));

          Allerdings ist dein sprintf da oben bei einem typecast umsonst und erzeugt nur unötigen overhead ;) *scnr*

          lf

          1. Hi!

            $res = mysql_query(sprintf("SELECT * FROM mitarbeiter WHERE abteilung = %s", intval($_GET["id"])));
            $res = mysql_query(sprintf("SELECT * FROM mitarbeiter WHERE abteilung = %s", (int)$_GET["id"]));

            Allerdings ist dein sprintf da oben bei einem typecast umsonst und erzeugt nur unötigen overhead ;) *scnr*

            In dem Fall ja. Doch wenn das SQL-Statement weitergeht, erhöht es meiner Meinung nach die Übersichtlichkeit. Das Statement wird dann nicht durch das String-Raus-Rein unterbrochen. Außerdem ist diese Funktion unter Anfängern wenig bekannt, so dass ich sie zugunsten ihrer Popularität und trotz ihrer mir bewusst gewesenen Unnötigkeit einsetzte. Obendrein (siehe Übersichtlichkeit) sah man dabei schön den Unterschied zwischen %s und '%s'.

            Lo!

            1. Außerdem ist diese Funktion unter Anfängern wenig bekannt, so dass ich sie zugunsten ihrer Popularität und trotz ihrer mir bewusst gewesenen Unnötigkeit einsetzte.

              Also ein "Förderer" von sprintf ;) Da erkennt man die alten C Coder ;)

      2. Hi,

        Für nummerische Werte ist mysql_escape_string sinnfrei, siehe auch http://aktuell.de.selfhtml.org/artikel/php/kontextwechsel/

        Falsch. Schon mal was von SQL injection gehört? ;)

        Schon mal den Artikel gelesen?

        MfG ChrisB

        --
        “Whoever best describes the problem is the person most likely to solve the problem.” [Dan Roam]
        1. Hi,

          Für nummerische Werte ist mysql_escape_string sinnfrei, siehe auch http://aktuell.de.selfhtml.org/artikel/php/kontextwechsel/

          Falsch. Schon mal was von SQL injection gehört? ;)

          Schon mal den Artikel gelesen?

          hab ich durchgesehen, aber nix für ungut, der Artikel kratz grad mal an der Oberfläche. Da hab ich ganze Bücher dazu.

          mysql_escape_string ist im Bezug nicht die beste und optimale Variante, aber wie schon erwähnt, absolut Sinnfrei ist es in diesem "gesamt Kontext" defintiv nicht. Den Rest hab ich schon im Post mit dedlfix gesagt

          lg

  3. Mahlzeit Patrick R.,

    zusätzlich zu den von Kalle_B und ChrisB gegebenen Hinweisen:

    <?

    short_open_tags waren noch nie eine gute Idee und sind es immer noch nicht ... dass sie es einmal werden, ist äußerst unwahrscheinlich.

    $id = $_GET["id"];

    Dieses Umkopieren ist sinnfrei.

    $res = mysql_query("SELECT * FROM mitarbeiter WHERE abteilung = mysql_escape_string($id)");

    mysql_escape_string() ist *keine* MySQL-Funktion und hat deswegen auch in der SQL-Abfrage in der gezeigten Weise nichts zu suchen.

    Generell würde ich Dir empfehlen, Dich ans EVA-Prinzip zu halten - das sorgt für deutlich leichter lesbaren und verständlichen Code.

    MfG,
    EKKi

    --
    sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|