Zwei Werte prüfen vor dem insert in der DB
Ich weiß wirklich nicht, was ich da falsch mache. Hier mein Code
ich würde gerne prüfen, ob die zwei Werte $sf_sid und $sf_sem schon in der Datenbank sind oder nicht. erst danach füge ich die übergebene Werte ein.
aber die werden einfach gespeichert auch wenn sie schon vorhanden sind, als ob es keine Prüfung stattfindet.
Die Daten werden über einen Formular an die Funktion übergeben.
Bitte um eure Hilfe
ich würde gerne prüfen, ob die zwei Werte $sf_sid und $sf_sem schon in der Datenbank sind oder nicht. erst danach füge ich die übergebene Werte ein.
aber die werden einfach gespeichert auch wenn sie schon vorhanden sind, als ob es keine Prüfung stattfindet.
Die Daten werden über einen Formular an die Funktion übergeben.
Bitte um eure Hilfe
public function add_newfee($sf_nid, $sf_sid, $sf_name, $sf_fee_eur, $sf_fee_cent, $sf_sem, $sf_semy, $sf_sp, $sf_uni, $sf_comment){
if (!$sf_nid || !$sf_sid || !$sf_name || !$sf_fee_eur || !$sf_fee_cent || !$sf_sem || !$sf_semy || !$sf_sp || !$sf_uni) {
echo '<div class="error">';
echo 'Daten fehlen';
echo '<br>';
die(mysql_error());
echo '</div>';
}
require ('db_connect.php');
$tbl_name="infrastructure.studyfees"; // Table name
// Connect to server and select databse.
mysql_connect("$host", "$username", "$password")or die("cannot connect");
mysql_select_db("$db_name")or die("cannot select DB");
mysql_query("set names 'utf8'");
$sf_checkID ="SELECT sf_nid,sf_name,sf_sem FROM $tbl_name WHERE sf_nid = '%$sf_nid%' AND sf_sem = '%$sf_sem%' ";
echo mysql_error();
echo"<br><br>";
$result = mysql_query($sf_checkID);
if (mysql_num_rows($result) > 0) {
// $sf_nid_s = $row['0'];
// $sf_sem_s = $row['2'];
echo '<div class="error">';
echo "es wurden Studiengebühren für";
echo "/ة ";
echo '<br>';
echo $result['sf_name'];
echo '<br>';
echo "schon bezahlt";
echo '</div>';
}
else {
$sf_insert="INSERT INTO $tbl_name(sf_nid,sf_sid,sf_name,sf_fee_eur,sf_fee_cent,sf_sem,sf_semy,sf_sp,sf_uni,sf_comment)
VALUES('$sf_nid','$sf_sid','$sf_name','$sf_fee_eur','$sf_fee_cent','$sf_sem','$sf_semy','$sf_sp','$sf_uni','$sf_comment')";
$write = mysql_query($sf_insert);
if(!$write) //checking here if record is inserted
{
echo '<div class="error">';
echo "daten wurde nicht gespeichert ";
echo '</div>';
echo '<div class="error">';
die('Error:'. mysql_error());
echo '</div>';
}
else
{
$sf_check_OK = mysql_query("SELECT sf_name,sf_fee_eur,sf_fee_cent FROM studyfees group by sf_name DESC LIMIT 1");
$row = mysql_fetch_assoc($sf_check_OK);
echo '<div class="succes">';
print('es wurden daten erfolgreich gespeichert');
echo '</div>';
echo '<div class="succes">';
print $row["sf_fee_eur"];
print ',';
print $row["sf_fee_cent"];
echo '</div>';
echo '<div class="succes">';
print('für: ');
print $row["sf_name"];
echo '</div>';
mysql_free_result($sf_check_OK);
}
}
}
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 147472
Url: https://administrator.de/contentid/147472
Ausgedruckt am: 15.11.2024 um 15:11 Uhr
14 Kommentare
Neuester Kommentar
Moin SILVERMAN,
was soll denn " WHERE sf_nid = '%$sf_nid%' AND sf_sem = '%$sf_sem%' "; " machen??
Die Felder "sf_nid" und "sf_sem" sind vom Datentyp...?? Vielleicht ja sogar etwas VARCHAR()-artiges.
Aber selbst wenn das so sein sollte - was bewirken denn die Prozentzeichen davor/danach geplanterweise?
Symptom ist doch: du findest in keinem Fall den Satz, den du suchst.
Dann schau dir doch erstmal den Querystring an, den du erzeugst und copy/paste den in irgendeinen SQL-Client...
Grüße
Biber
was soll denn " WHERE sf_nid = '%$sf_nid%' AND sf_sem = '%$sf_sem%' "; " machen??
Die Felder "sf_nid" und "sf_sem" sind vom Datentyp...?? Vielleicht ja sogar etwas VARCHAR()-artiges.
Aber selbst wenn das so sein sollte - was bewirken denn die Prozentzeichen davor/danach geplanterweise?
Symptom ist doch: du findest in keinem Fall den Satz, den du suchst.
Dann schau dir doch erstmal den Querystring an, den du erzeugst und copy/paste den in irgendeinen SQL-Client...
Grüße
Biber
add_newfee($sf_nid, $sf_sid, $sf_name, $sf_fee_eur, $sf_fee_cent, $sf_sem, $sf_semy, $sf_sp, $sf_uni, $sf_comment){
Für diese Variablenbenennung muss noch jemand sterben...
echo '<div class="error">';
Schöne Vermischung von Backend und Frontend Code...
die(mysql_error());
Aha, und genau welche SQL-Abfrage könnte an der Stelle fehlschlagen???
$sf_checkID ="SELECT sf_nid,sf_name,sf_sem FROM $tbl_name WHERE sf_nid = '%$sf_nid%' AND sf_sem = '%$sf_sem%' ";
Und alle Scriptkiddies so: "SQL-Injection, yeah!".
die('Error:'. mysql_error());
Stichwort: Information Disclosure
$sf_check_OK = mysql_query("SELECT sf_name,sf_fee_eur,sf_fee_cent FROM studyfees group by sf_name DESC LIMIT 1");
Aber
mysql_insert_id()
kennst du schon?Aber selbst wenn das so sein sollte - was bewirken denn die Prozentzeichen davor/danach geplanterweise?
Hätte er ja korrekterweise ein
LIKE
verwendet währen es Platzhalter, so ist es ein % (war die Frage rhetorisch?)...
Moin dog,
So kritisch ist das ja nicht, wenn es sich auf einen fehlgeschlagenen INSERT bezieht..
Meinst du, es lässt sich zurückverfolgen? *gg
Grüße
Biber
Stichwort: Information Disclosure
Andererseits....So kritisch ist das ja nicht, wenn es sich auf einen fehlgeschlagenen INSERT bezieht..
$sf_insert="INSERT INTO $tbl_name(sf_nid,sf_sid,sf_name,sf_fee_eur,sf_fee_cent,sf_sem,sf_semy,sf_sp,sf_uni,sf_comment)
VALUES('$sf_nid','$sf_sid','$sf_name','$sf_fee_eur','$sf_fee_cent','$sf_sem','$sf_semy','$sf_sp','$sf_uni','$sf_comment')";
Selbst wenn dann $sf_name "Huber, Karl Georg" und $sf_sem=5 und $sf_uni="FU Berlin" und $sf_comment="Vordiplom 2x vergeigt" auf den Bildschirm durchschlägt...VALUES('$sf_nid','$sf_sid','$sf_name','$sf_fee_eur','$sf_fee_cent','$sf_sem','$sf_semy','$sf_sp','$sf_uni','$sf_comment')";
Meinst du, es lässt sich zurückverfolgen? *gg
(war die Frage rhetorisch?)
Würde ich so etwas jemals tun?Grüße
Biber
Ich lache niemanden aus.
Bei mir ist es eher die Panik, dass solcher Code irgendwo produktiv eingesetzt wird.
Denn selben Mist hab ich auch mal gemacht als ich mit PHP angefangen habe, dann genauso eins auf den Deckel bekommen und seit dem bin ich vorsichtig.
Aber wenn du es im Detail nennst:
1. Du schreibst Code nicht so, dass du ihn verstehst, sondern, dass Andere ihn verstehen.
Und mit deinen Variablen kann absolut niemand was anfangen (nicht mal du nach 2 Wochen).
Es bringt niemanden um eindeutige Variablen zu benutzen und jeder gute Code-Editor vervollständigt die ohnehin.
Ich habe eine ganz einfache Regel: Wird die Variable für mehr als 10 Zeilen (also mein Sichtfeld) benutzt, muss sie eindeutig sein.
2. Nein, natürlich nicht.
Warum erstellst du eine Funktion, wenn die dann wieder HTML-Code erzeugt?
Der Sinn von Funktionen ist die Abstrahierung von Code und Aufspaltung von verschiedenen Layern.
Vielleicht willst du irgendwann mal nicht nur ein Frontend in HTML, sondern auch eine API schreiben und dann nützt dir eine Funktion die konkretes HTML ausgibt nichts mehr.
3. Siehe Zeile 8.
Ohne auch nur eine SQL-Abfrage ausgeführt zu haben kann es auch keinen Fehler geben. Logisch, oder?
4. Die Frage beantwortet Wikipedia zur Genüge: http://de.wikipedia.org/wiki/SQL-Injection#PHP
Erste Grundregel der Webprogrammierung: Traue NICHTS, das vom User kommt.
5. Ich weiß ja nicht, was der Tippgeber geraucht hat, aber es war mieses Zeug.
% ist ein Wildcard-Zeichen von MySQL und steht für "beliebig viele Zeichen an dieser Stelle".
Das funktioniert aber nicht mit einem
Bei mir ist es eher die Panik, dass solcher Code irgendwo produktiv eingesetzt wird.
Denn selben Mist hab ich auch mal gemacht als ich mit PHP angefangen habe, dann genauso eins auf den Deckel bekommen und seit dem bin ich vorsichtig.
Aber wenn du es im Detail nennst:
1. Du schreibst Code nicht so, dass du ihn verstehst, sondern, dass Andere ihn verstehen.
Und mit deinen Variablen kann absolut niemand was anfangen (nicht mal du nach 2 Wochen).
Es bringt niemanden um eindeutige Variablen zu benutzen und jeder gute Code-Editor vervollständigt die ohnehin.
Ich habe eine ganz einfache Regel: Wird die Variable für mehr als 10 Zeilen (also mein Sichtfeld) benutzt, muss sie eindeutig sein.
2. Nein, natürlich nicht.
Warum erstellst du eine Funktion, wenn die dann wieder HTML-Code erzeugt?
Der Sinn von Funktionen ist die Abstrahierung von Code und Aufspaltung von verschiedenen Layern.
Vielleicht willst du irgendwann mal nicht nur ein Frontend in HTML, sondern auch eine API schreiben und dann nützt dir eine Funktion die konkretes HTML ausgibt nichts mehr.
3. Siehe Zeile 8.
Ohne auch nur eine SQL-Abfrage ausgeführt zu haben kann es auch keinen Fehler geben. Logisch, oder?
4. Die Frage beantwortet Wikipedia zur Genüge: http://de.wikipedia.org/wiki/SQL-Injection#PHP
Erste Grundregel der Webprogrammierung: Traue NICHTS, das vom User kommt.
5. Ich weiß ja nicht, was der Tippgeber geraucht hat, aber es war mieses Zeug.
% ist ein Wildcard-Zeichen von MySQL und steht für "beliebig viele Zeichen an dieser Stelle".
Das funktioniert aber nicht mit einem
=
-Operator, sondern nur mit LIKE
Moin SILVERMAN,
da muss ich aber dog ausdrücklich in Schutz nehmen... er hat durchaus daruf hingewiesen, was du tun kannst und wo offene Flanken sind.
Insbesondere zu dem von dir gemeldeten "Fehler in Line 112" schrieb er:
Aha, und genau welche SQL-Abfrage könnte an der Stelle fehlschlagen???
Wir können (und werden) die Fehlerchen schon rauspuhlen.
Aber es ist ja momentan nicht auf Tippfehler wie "einfaches Anführungszeichen vergessen" beschränkt,
sondern es sind noch ein paar Verständnis-Klemmer dabei.
Und da ist es immer sinnvoller, ein bisschen zu schubsen in die richtige Richtung als zu schreiben "Ersetze Zeile 37 durch dieses hier".
Noch mal in Ruhe drei Nachfragen:
Grüße
Biber
[Edit] Kommentar weitgehendst obsolet - steht schon alles bei dog. [/Edit]
da muss ich aber dog ausdrücklich in Schutz nehmen... er hat durchaus daruf hingewiesen, was du tun kannst und wo offene Flanken sind.
Insbesondere zu dem von dir gemeldeten "Fehler in Line 112" schrieb er:
die(mysql_error());
Aha, und genau welche SQL-Abfrage könnte an der Stelle fehlschlagen???
Wir können (und werden) die Fehlerchen schon rauspuhlen.
Aber es ist ja momentan nicht auf Tippfehler wie "einfaches Anführungszeichen vergessen" beschränkt,
sondern es sind noch ein paar Verständnis-Klemmer dabei.
Und da ist es immer sinnvoller, ein bisschen zu schubsen in die richtige Richtung als zu schreiben "Ersetze Zeile 37 durch dieses hier".
Noch mal in Ruhe drei Nachfragen:
- die Primary Keys der Tabelle, die irgendwasID heißen, sind vom Datentyp... ????
- du kannst die Statements trocken testen /hast die Statements trocken getestet über phpMyAdmin oder einen bedienbareren SQL-Client?
- und hast du zufällig noch einen Link auf die "lieber ein paar Prozentzeichen aus Kompatibilitätsgründen"-Seite parat? Da muss irgendwas Missverständliches stehen...
Grüße
Biber
[Edit] Kommentar weitgehendst obsolet - steht schon alles bei dog. [/Edit]
Moin SILVERMAN,
nochmsl zu deiner Fehlermeldung "Supplied argument is not a valid MySQL-Link resource"...
Mir liegt zwar aher französisch als englisch, und mySQL spreche ich eigentlich gar nicht...
Aber als fachfremder Laie würde ich mal behaupten, da passiert genau das, was die Fehlermeldung aussagt.
Nämlich "mysql_error()" [und auch mysql_errno()] lassen sich entweder ohne Parameter aufrufen und liefern dann Fehlertext bzw. Fehlercode des letzten Statements.
Oder optional mit einem Parameter, der eine gültige Datenbankverbindung darstellt.
Was du aber nicht wirklich brauchst, denn in dem ganzen Fragment hast du ja höchstens eine einzige und nicht zwölf davon.
Der Fehler ist also ein aufgetretener Fehler, sondern schlicht und einfach eine falsch bzw. mit falschem Parameter aufgerufene Methode.
-> Lass den Parameter weg, dann hast du einen Fehler weniger.
Oder aber, wie auch mehrach angedeutet: Lass den ganzen Aufruf an dieser Stelle weg.
Denn WTHF glaubst du denn da prüfen zu können???? Ob das "SET UTF8" geklappt hat???
Erstaunlich finde ich nur, dass du im Code überhaupt so weit kommst... die ganzen Variablen, die wir nur erahnen können ($host, $dbname,...) scheinen ja irgendwo irgendwann von irgendwem global und gültig definiert worden zu sein.
Und auch noch mal ein letzter Versuch der Frageformulierung hierzu:
Worauf ich mit der Frage hinauswollte:
Du suchst in deinem SELECT nach zwei mit deinen Suchwerten übereinstimmenden Feldern
[Falls überhaupt irgendwelche Assoziation geweckt werden bei so einem Namen... wenn ich nachts aus der Kneipe Richtung Büro gehe und aus irgendeiner Seitengasse ruft jemand "sf_sem"... da müsste ich zweimal überlegen, was wohl gemeint ist]
Anyway.... jedenfalls vergleichst du beide Felder mit einem String. Ist das richtig und gewollt bzw was sind denn die ver###ten Datentypen?
Grüße
Biber
nochmsl zu deiner Fehlermeldung "Supplied argument is not a valid MySQL-Link resource"...
Mir liegt zwar aher französisch als englisch, und mySQL spreche ich eigentlich gar nicht...
Aber als fachfremder Laie würde ich mal behaupten, da passiert genau das, was die Fehlermeldung aussagt.
Nämlich "mysql_error()" [und auch mysql_errno()] lassen sich entweder ohne Parameter aufrufen und liefern dann Fehlertext bzw. Fehlercode des letzten Statements.
Oder optional mit einem Parameter, der eine gültige Datenbankverbindung darstellt.
Was du aber nicht wirklich brauchst, denn in dem ganzen Fragment hast du ja höchstens eine einzige und nicht zwölf davon.
Der Fehler ist also ein aufgetretener Fehler, sondern schlicht und einfach eine falsch bzw. mit falschem Parameter aufgerufene Methode.
-> Lass den Parameter weg, dann hast du einen Fehler weniger.
Oder aber, wie auch mehrach angedeutet: Lass den ganzen Aufruf an dieser Stelle weg.
Denn WTHF glaubst du denn da prüfen zu können???? Ob das "SET UTF8" geklappt hat???
Erstaunlich finde ich nur, dass du im Code überhaupt so weit kommst... die ganzen Variablen, die wir nur erahnen können ($host, $dbname,...) scheinen ja irgendwo irgendwann von irgendwem global und gültig definiert worden zu sein.
Und auch noch mal ein letzter Versuch der Frageformulierung hierzu:
die Primary Keys der Tabelle, die irgendwasID heißen, sind vom Datentyp... ????
Okay, streiche den Begriff "PrimaryKeys"... setze einfach dafür "deine SELECT-Suchfelder"Worauf ich mit der Frage hinauswollte:
Du suchst in deinem SELECT nach zwei mit deinen Suchwerten übereinstimmenden Feldern
... WHERE sf_nid = '%$sf_nid%' AND sf_sem = '%$sf_sem%' ";
Ein Feld heist "sf_nid " und sollte eigentlich gemäss allen Konventionen der DB-Modellierung incl. der Genfer Konvention eine ID (=numerisch) sein, das zweiten Feld heißt "sf_sem" was nun eher prosaisch klingt.... wie ein Zeichen/Stringfeld.[Falls überhaupt irgendwelche Assoziation geweckt werden bei so einem Namen... wenn ich nachts aus der Kneipe Richtung Büro gehe und aus irgendeiner Seitengasse ruft jemand "sf_sem"... da müsste ich zweimal überlegen, was wohl gemeint ist]
Anyway.... jedenfalls vergleichst du beide Felder mit einem String. Ist das richtig und gewollt bzw was sind denn die ver###ten Datentypen?
Grüße
Biber