Tom: MySQL-Statements richtig aufbauen

Beitrag lesen

Hello,

wenn ich jetzt die Testtabelle ("users") mit zwei Felder (username, password) durch die mit phpMyAdmin erstellte Tabelle mit mehreren Feldern ("anbieter") ersetzen moechte, funktioniert's nicht:

Und ich habe nur

Tabelle "users" hat zwei Felder, da passen dann also auch zwei Values dazu. Die Angabe der Feldnamen für die Zuordnung _darf_ entfallen.

"INSERT INTO users VALUES ('$username', '$password')"

Tabelle "anbieter" hat deiner Aussage nach mehr als zwei Spalten. Wenn man nun versucht, einen unvollständigen Datansatz einzufügen, weigert sich MySQL, da es keine Verantwortung für die Zuordnung der Datenwerte zu den Spalten übernimmt. Die hat die ProgrammiererIn!

"INSERT INTO anbieter VALUES ('$username', '$password')"

Nun kannst Du schreiben:

http://www.mysql.de/doc/de/HANDLER.html

"INSERT INTO anbieter (username, password) VALUES ('$username', '$password')"

oder

"INSERT INTO anbieter set
    username = '$username',
    password = '$password'"

Und wenn Du es noch besser machen willst, dann schreibst Du:

$sql= "INSERT INTO anbieter set ".
      "username = '".mysql_escape_string($username)"', ".
      "password = '".mysql_escape_string($password)"'";

http://de2.php.net/manual/de/function.mysql-escape-string.php

Ggf. musst Du vorher die von PHP automatisch ergänzten Backslashes wieder entfernen. Das geht am einfachsten gleich mit einer rekursiven Funktion:

#-----------------------------------------------
function strip($_data)
{
  if (!get_magic_quotes_gpc())
  {
    return $_data;
  }

if (is_array($_data))
  {
    foreach($_data as $key => $val)
    {
      $data[$key] = strip($val);
    }
  }
  else
  {
    $_data = stripslashes($_data);
  }
  return $_data;
}
#-----------------------------------------------

$_POST = strip($_POST);

#===============================================

Die Funktion prüft, ob auf dem Server die magic_quotes_gpc eingeschaltet sind http://de2.php.net/manual/de/function.get-magic-quotes-gpc.php und sollte dies der Fall sein (das ist default), dann entfernt sie die Backslashes wieder aus allen Post-Variablen. Die Postparamter können dabei als beliebige Array-Strukturen angelegt worden sein.

Nun _muss_ man aber auf jeden fall selber für Sicherheit bei der Datenübergabe an die DB sorgen und die zur DB passende Escape-Funktion verwenden. Für MySQL heißt sie eben mysql_(real_)escape_string().

Liebe Grüße aus http://www.braunschweig.de

Tom

--
Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen