Moin!
ich bin grade dabei, mich mit Prozeduren in MySQL vertraut zu machen - womit ich bis jetzt leider noch nicht so erfolreich war.
Im Moment lasse ich z.B. Daten durch folgenden Code in meine Datenbank eintragen:
Du benutzt die alte mysql-Extension für den Zugriff auf MySQL. Das ist ok für alles "normale" Query-Zeugs, aber spätestens bei fortgeschrittenen Dingen, wie du sie vorhast, wirst du an irgendeinem Punkt scheitern - weil die Features, die du benutzen willst, teilweise nur mit der neueren Extension mysqli funktionieren. Grundsätzlich wird empfohlen, nur noch mysqli zu verwenden - es bietet auch rein PHP-seitig Features an, die man gerne haben will, beispielsweise objektorientiertes Arbeiten.
if (isset($submitbutton))
{
$sql = "INSERT INTO TABELLE (user, task, credate) VALUES('$user', '$task', 'CURRENT_DATE()')";
if (mysql_query($sql))
echo "";
else
echo "<br><b>Nicht</b> eingetragen. Bitte Admin informieren!</br>";
}
>
> Verstehe ich das jetzt richtig, dass ich mit MySQL, z.B. in PHPMyAdmin, eine Prozedur erstellen muss, die quasi den INSERT-Befehl enthält?
Die Frage ist, was du dir von sowas versprichst? So oder so würde in der Datenbank immer ein INSERT ausgeführt. Eine Prozedur würde dir eventuell ein wenig Komplexitätsarbeit abnehmen, wenn du in mehr als eine Tabelle schreiben musst. Und natürlich könnte man auch Validierung der übergebenen Daten dort reinschreiben.
Das aber würde dann bedeuten, dass ein größerer Teil deiner Programmlogik nicht mehr in PHP programmiert ist, sondern in MySQL. Das ist nicht unbedingt so schön. Es ist wahrscheinlich, dass deine Anwendung niemals in einen Nutzungsbereich gerät, wo Performance eine Rolle spielt, aber trotzdem will ich anmerken, dass es aus dieser Sicht sehr hinderlich ist, wenn die Datenbank noch mehr tun muss, als nur die Daten schreiben zu müssen.
Dein oben gezeigter Code enthält allerdings etliche sofort offensichtliche Schwachstellen:
1\. Du verlässt dich auf register\_globals = on, oder du kopierst sämtliche Variablen aus $\_POST in neue Einzelvariablen. Das ist sehr ungünstig. register\_globals steht auf der Abschussliste und wird aus PHP entfernt, d.h. du hast nicht automatisch `$submitbutton`{:.language-php}, wenn du `<input type="submit" name="submitbutton">`{:.language-html} in deinem Formular stehen hast, sondern nur $\_POST['submitbutton']. Und das Umkopieren mit `$submitbutton = $_POST['submitbutton']`{:.language-php} ist nicht nur ziemlich überflüssig (kostet halt Rechenzeit), sondern es verschleiert dir auch die Herkunft der Werte. Denn es ist nicht irrelevant, ob der Inhalt einer Variablen von außen vom bösen User gekommen ist, oder tatsächlich intern aus vertrauenswürdigerer Quelle.
2\. Du hast keinerlei Escaping in dein Query eingebaut. Damit zerschießt dir der User dein SQL-Statement potentiell - außer es ist magic\_quotes\_gpc = on gesetzt. Diese Magic Quotes sind aber auch ein ekliges Feature, denn sie retten zwar deinen Query, aber stören bei jeder sonstigen Ausgabe von Variablen. magic\_quotes\_gpc können auch abgeschaltet sein - wenn dein Provider an der Einstellung was ändert, oder du den Provider wechselst, wäre dein Skript plötzlich ungeschützt.
3\. Deine Fehlerbehandlung ist ziemlich rauh. Immerhin ist sie vorhanden, aber "Bitte Admin informieren" ist nicht wirklich das, was man sich als Admin wünscht. Weil das die User nicht hinkriegen. PHP bietet etliche Methoden, Fehler zu loggen und so für den Admin zu konservieren.
> Würde die Prozedur dann so aussehen?
>
> ~~~sql
> delimiter //
> drop procedure sql_insert;
>
> create procedure sql_insert ()
> begin
> INSERT INTO DATENBANK.TABELLE (user, task, credate) values
> ('$User', '$task', CURRENT_DATE());
> end;
>
Wenn ja, wie rufe ich diese Prozedur dann in PHP auf?
Zu deiner Prozedur kann ich nix sagen. Hab ich noch nicht ausprobiert, war in meinen Projekten noch nicht notwendig - eben aus oben genannten Gründen.
Der Aufruf aber geschieht ganz simpel über einen MySQL-Query, der die Prozedur aufruft. Näheres dazu steht in der MySQL-Dokumentation. Da du dich offenbar in die Programmierung von SQL stürzen willst, bleibt dir ohnehin nichts anderes übrig, als dich mit der Doku auseinanderzusetzen.
- Sven Rautenberg