CronJob-Service
bei SELFPHP mit ...
|
+ minütlichen Aufrufen
+ eigenem Crontab Eintrag
+ unbegrenzten CronJobs
+ Statistiken
+ Beispielaufrufen
+ Control-Bereich
Führen Sie mit den CronJobs von
SELFPHP zeitgesteuert Programme
auf Ihrem Server
aus. Weitere Infos
|
:: Anbieterverzeichnis ::
Globale Branchen
Informieren Sie sich über ausgewählte Unternehmen im Anbieterverzeichnis von SELFPHP
:: Newsletter ::
Abonnieren Sie hier den kostenlosen
SELFPHP Newsletter!
|
PHP Grundlagen Hier kann über grundlegende Probleme oder Anfängerschwierigkeiten diskutiert werden |
30.01.2012, 12:53:39
|
Junior Member
|
|
Registriert seit: Dec 2005
Alter: 51
Beiträge: 236
|
|
Dynamische SQL-Abfrage mit mysql_real_escape_string
Hallo,
erstmal zum Szenario:
Ich habe eine Datenbank ua mit der Tabelle Beiträge.
Über Filter wähle ich das anzuzeigende Quartal und die anzuzeigenden Jahre. (checkboxen). Über eine verwaltungsvariable lege ich fest wie weit die Jahre zurückgehen sollen.
Die Abfrage:
PHP-Code:
$sql_quittungen=sprintf("select beitraege.* from beitraege where
(if(%s=999,0,quarter(quittungen.datum)=%s)or
if(%s=999,0,quarter(quittungen.datum)=%s)or
if(%s=999,0,quarter(quittungen.datum)=%s)or
if(%s=999,0,quarter(quittungen.datum)=%s)) and
(if(%s=999,0,Date_Format(quittungen.datum,'%%Y') = %s)or
if(%s=999,0,Date_Format(quittungen.datum,'%%Y') = %s)or
if(%s=999,0,Date_Format(quittungen.datum,'%%Y') = %s)or
if(%s=999,0,Date_Format(quittungen.datum,'%%Y') = %s))
mysql_real_escape_string($quartal1),
mysql_real_escape_string($quartal1),
mysql_real_escape_string($quartal2),
mysql_real_escape_string($quartal2),
mysql_real_escape_string($quartal3),
mysql_real_escape_string($quartal3),
mysql_real_escape_string($quartal4),
mysql_real_escape_string($quartal4),
mysql_real_escape_string($jahreanzahl_array[0]),
mysql_real_escape_string($aktuellesjahr),
mysql_real_escape_string($jahreanzahl_array[1]),
mysql_real_escape_string($aktuellesjahr-1),
mysql_real_escape_string($jahreanzahl_array[2]),
mysql_real_escape_string($aktuellesjahr-2),
mysql_real_escape_string($jahreanzahl_array[3]),
mysql_real_escape_string($aktuellesjahr-3)
);
Soll heissen:
Wenn checkbox quartal 1 gesetzt ist, zeige mir alle Beiträge aus dem ersten Quartal.
Wenn checkbox quartal 2 gesetzt ist, zeige mir alle Beiträge aus dem zweiten Quartal.
Wenn checkbox 2012 gesetzt ist gesetzt ist, zeige mir alle Beiträge aus 2012 und dem Quartal xy.
usw.
Also habe ich derzeit die Anzahl der auswählbaren Jahre auf 4 festgelegt. Also ab 2009 bis 2012 kann alles ausgewählt werden. Im Array $jahreanzahl_array sind die Werte 999 oder Jahreszahl.
Nun möchte ich die Anzahl der zurückreichenden Jahre dynamisch machen. Also sowas wie eine Konfigurationsvariable $jahrezurueck.
=> $jahrezurueck =5. Dann kann der User die letzten 4 jahre + das aktuelle auswählen. Bei $jahrezurueck=3 nur die letzten 2 Jahre + das aktuelle Jahr. usw.
Eine Idee ist das Ganze mit einer for-schleife zu machen und dann die sql-Abfrage via string Operationen zusammen zu bauen. (Quartal wegen der Übersichtlichkeit weggelassen). Die forschleife geht von 0 bis count(jahrezurueck_array).
PHP-Code:
$sql_teil1= "select * from beitrage where ";
$sql_string_tei2="";
for($d=0;$d<=$jahrezurueck;$d++)
{
$schleifenjahr=$aktuellesjahr-$d;
$sql_string_tei2.=" if('999'=".$jahreanzahl_array[$d].",0,Date_Format(beitraege.datum,'%Y') = ".$schleifenjahr.")or";
}
$sql_string_tei2=substr($sql_string_tei2,0,-2);
$sql = $sql_teil1.$sql_teil2;
Die Abfrage ist nur ein string. Funktioniert.
Nun zur Frage:
Aber wie kriege ich das mit dem mysql_real_escape_string und den Platzhaltern hin?
Oder ist der Denkansatz falsch?
|
30.01.2012, 17:24:59
|
Anfänger
|
|
Registriert seit: Aug 2010
Alter: 43
Beiträge: 27
|
|
AW: Dynamische SQL-Abfrage mit mysql_real_escape_string
mysql_real_escape_string ist eine PHP Funktion. Du verwendest sie aktuell in deiner Query (Bestandteil des String). Dadurch wird die Funktion nicht ausgeführt, sondern im Query an deine DB übergeben. Diese wird damit vermutlich nichts anzufangen wissen.
Zur Query an sich, kann ich nicht viel sagen, da sie irgendwie unlogisch erscheint. Wenn du ein bestimmtest Datum zur Eingrenzung hast, warum verwendest du dieses nicht direkt? Deine Bedingungen wirken auf mich sehr suspekt.
|
30.01.2012, 18:21:11
|
Junior Member
|
|
Registriert seit: Dec 2005
Alter: 51
Beiträge: 236
|
|
AW: Dynamische SQL-Abfrage mit mysql_real_escape_string
Ok, zu undeutlich formuliert.
Als Filter habe ich jahre und Quartal. Als Beispiel sind 2012, 2011 und 2010 angewählt. Dazu Quartal 1und Quartal 3.
Mit den ifs frage ich ab, ob das Quartal 1 gesetzt ist oder nicht bzw. das jahr.
Das Jahr ist dynamisch. Bei 4 jahrenzurück habe ich 2012,2011, 2010 und 2009, welches ich auswählen kann. 2014 währen es nur 2014, 2013, 2012 und 2011..
Die Funktion mysql_real_escape_string ist eine php-Funktion, welche die Platzhalter %s im ersten Teil des sql-strings durch die Werte in den Klammern von mysql_real_escape_string ersetzt. Ein Sicherheitsfeature gegen sql-Injection usw.
Das ist schon richtig so. Die echo-Ausgabe der Query ist korrekt. Daher auch das Sprintf.
Mein Problem sind die jahrezurück. Wenn der user nun nicht die Ausgaben der letzten 4 Jahre betrachten will, sondern der letzten 8 Jahre oder er wid von der Menge erschlagen udn möchte nur 2 Jahre betrachten.
Ok ich kann die Quartale und die gewählten Jahre in ein Array packen udn dies abarbeiten, dann wird die Query etwas kleiner. Das löst aber nicht mein Problem. Mache ich es unsicher, also ohne sprintf bzw. mysql_real_escape_string isses kein Problem...
Ich muss also eine funktion aufrufen und der Funktion einen dynamischen string übergeben.
Ist es nun klarer geworden?
|
27.03.2012, 13:08:16
|
|
Senior Member
|
|
Registriert seit: Feb 2006
Ort: Wallrabenstein
Alter: 55
Beiträge: 1.044
|
|
AW: Dynamische SQL-Abfrage mit mysql_real_escape_string
Ein wenig spät aber ich kann nicht erkennen ob das Problem schon gelöst ist.
Quartal, ist ja sicher eine Zahl. Somit könntest du dir mysql_real_escape_string sparen.
in_numeric($_POST['quartal']) oder $quartal = $_POST['quartal']+0,würde schon einmal dafür sorgen, dass du dir sicher gehen kannst, dass tatsächlich nur eine Zahl existiert.
Du müsstest somit nur noch prüfen ob diese Zahl zwischen 1 und 4 liegt.
Jahr ist ebenfalls eine Zahl und könnte auch wie oben geprüft werden.
Anzahl der anzuzeigenden Jahre = s.o.
Hier muss lediglich noch geprüft werden ob diese Zahl überhaupt ausgewählt werden darf.
Du köntest also ein Startjahr setzen. Vom aktuellen Jahr subtrahierst du dann dieses Startjahr. Die übergebene Anzahl muss somit >=0 und <= Summe(akt_jahr-startjahr) sein.
Für deine Query solltest du dich einmal mit BETWEEN auseiander setzen. Ich denke damit kannst du leichter dein Ziel erreichen.
|
27.03.2012, 18:12:35
|
|
SELFPHP Guru
|
|
Registriert seit: Dec 2003
Ort: Erfurt
Alter: 75
Beiträge: 4.001
|
|
AW: Dynamische SQL-Abfrage mit mysql_real_escape_string
Mist. Hatte vorher noch nen Text bezüglich des SQL Problems getippert, aber verwessen, vor dem Klick den Kram in die Zwischenablage zu packen. Nu isser weg und ich zu faul, mir das noch mal alles aus den Fingern zu saugen. Das Zauberwort BETWEEN hatte der Urvater ja schon geschrieben.
Zitat:
Zitat von tsunamitsunami
Die Funktion mysql_real_escape_string ist eine php-Funktion, welche die Platzhalter %s im ersten Teil des sql-strings durch die Werte in den Klammern von mysql_real_escape_string ersetzt.
|
Tut sie nicht bzw. nur ungenügend, weil die gefährlichen Daten nach einem INSERT, UPDATE oder REPLACE trotzdem unescaped in der Datenbank liegen.
Beweis:
http://mod.php.developer.vc/test/37/
Wie Du siehst, verhindert die Funktion nur Syntaxfehler im String, aber nach der SQL Operation liegt der Müll genauso rum, als hätte es mysql_real_escape_string() nie gegeben.
Zitat:
Ein Sicherheitsfeature gegen sql-Injection usw.
|
Das ist Augenwischerei.
Teste einfach die Uservariablen auf erlaubte Inhalte. Wenn Du Digits erwartest:
PHP-Code:
if (! ctype_digit($_POST['var'])) die('Nur Ziffern eingeben, Du Hacker');
Wenn Du ein Datum erwartest, verwendest Du 3 Textfelder und setzt den Kram dann zusammen.
Wenn Du Text erwartest:
http://lu.php.net/htmlspecialchars
PHP-Code:
$_POST['text'] = htmlspecialchars($_POST['text'], ENT_QUOTES, 'UTF-8');
Und wenn Du Bilder erwartest, die keinen JS Trojaner beinhalten:
PHP-Code:
if (isset($_FILES['formluar']) and ! $_FILES['formluar']['error']) { $finfo = new finfo(FILEINFO_MIME); if ($finfo->file($_FILES['formular']['tmp_name']) != 'image/jpeg') die('Nur JPG Bilder!'); tu_was(); }
|
28.03.2012, 01:12:39
|
Member
|
|
Registriert seit: Nov 2007
Beiträge: 843
|
|
AW: Dynamische SQL-Abfrage mit mysql_real_escape_string
Hi
Zitat:
Und wenn Du Bilder erwartest, die keinen JS Trojaner beinhalten:
|
Sehr interessant! Link zur Hand?
Hab bissle gegoogelt aber nix neues -.-
mfg
CKaos
__________________
"Wenn die Leute Häuser so bauen würden, wie wir Programme schreiben, würde der erstbeste Specht unsere Zivilisation zerhacken."
In den allermeisten Fällen sitzt der Bug etwa 40 cm vor dem Monitor!
|
28.03.2012, 13:16:15
|
|
SELFPHP Guru
|
|
Registriert seit: Dec 2003
Ort: Erfurt
Alter: 75
Beiträge: 4.001
|
|
AW: Dynamische SQL-Abfrage mit mysql_real_escape_string
Bilder aus Javascript
Zitat:
Zitat von Ckaos
Sehr interessant! Link zur Hand?
|
Nein. Paar Jahre her. Und da mein Virenscanner die Giftprobe beim Festplattenumstapeln gefressen hat, weiß ich auch nicht mehr, wie das Teil hieß.
Zitat:
Hab bissle gegoogelt aber nix neues -.-
|
Solche Biester schaden genau dann, wenn man nicht prüft und sich nen Etikettenschwindel unterschieben läßt. Ob die Browser immer noch so dämlich sind und Javascript bei bild.jpg ausführen, weiß ich nicht. Die üblichen Virenscanner reagieren darauf wenigstens mit nem Genickschuß. Desinfizieren hilft da nicht, weil dann 0 Bytes übrig bleiben.
Es macht aber einen sehr schlechten Eindruck, wenn der Virenscanner Alarm schlägt, weil ein "netter" User sowas zB. als Avatar hinterlegen konnte, weil das Uploadscript den Content-typ nicht geprüft hat. Genau da fällt es ja auf, wenn der Content-typ nicht 'image/jpeg' sondern 'text/javascript' heißt
Egal: wer von der Extension auf Content-typ schließt und sich darauf verläßt, stirbt.
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
Themen-Optionen |
|
Ansicht |
Linear-Darstellung
|
Forumregeln
|
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.
HTML-Code ist aus.
|
|
|
Alle Zeitangaben in WEZ +2. Es ist jetzt 16:37:54 Uhr.
|