SELFPHP: Version 5.8.2 Befehlsreferenz - Tutorial – Kochbuch – Forum für PHP Einsteiger und professionelle Entwickler

SELFPHP


Professional CronJob-Service

Suche



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



:: Buchempfehlung ::

TYPO3 Kochbuch

TYPO3 Kochbuch zur Buchempfehlung
 

:: Anbieterverzeichnis ::

Globale Branchen

Informieren Sie sich über ausgewählte Unternehmen im Anbieterverzeichnis von SELFPHP  

 

:: Newsletter ::

Abonnieren Sie hier den kostenlosen SELFPHP Newsletter!

Vorname: 
Name:
E-Mail:
 
 

Zurück   PHP Forum > SELFPHP > PHP Grundlagen

PHP Grundlagen Hier kann über grundlegende Probleme oder Anfängerschwierigkeiten diskutiert werden

Antwort
 
Themen-Optionen Ansicht
  #1  
Alt 30.01.2012, 12:53:39
tsunamitsunami tsunamitsunami ist offline
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?
Mit Zitat antworten
  #2  
Alt 30.01.2012, 17:24:59
jabubo jabubo ist offline
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.
__________________
PHP online testen, zum Beispiel: md5, sha1, base64_decode, preg_match, urldecode und viele weitere...
Mit Zitat antworten
  #3  
Alt 30.01.2012, 18:21:11
tsunamitsunami tsunamitsunami ist offline
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?
Mit Zitat antworten
  #4  
Alt 27.03.2012, 13:08:16
Benutzerbild von urvater
urvater urvater ist offline
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.
Mit Zitat antworten
  #5  
Alt 27.03.2012, 18:12:35
Benutzerbild von meikel (†)
meikel (†) meikel (†) ist offline
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 Beitrag anzeigen
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();

Mit Zitat antworten
  #6  
Alt 28.03.2012, 01:12:39
Ckaos Ckaos ist offline
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!
Mit Zitat antworten
  #7  
Alt 28.03.2012, 13:16:15
Benutzerbild von meikel (†)
meikel (†) meikel (†) ist offline
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 Beitrag anzeigen
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.
Mit Zitat antworten
Antwort


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen
Ansicht

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.

BB-Code ist an.
Smileys sind aus.
[IMG] Code ist aus.
HTML-Code ist aus.

Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Brauche Hilfe Partygirl MySQLi/PDO/(MySQL) 10 01.03.2011 09:18:11
checkbox array in sql abfrage Sedrah MySQLi/PDO/(MySQL) 1 07.03.2010 22:02:54
SQL Abfrage mit PHP Variablen die leer sind WHERE plz = ? Loki555 MySQLi/PDO/(MySQL) 8 28.04.2009 15:18:33
Abfrage einer bestimmten Spalte in SQL LV2005 MySQLi/PDO/(MySQL) 7 01.08.2006 19:15:54
SQL ABfrage in Tabelle ausgeben. Shape24 PHP für Fortgeschrittene und Experten 13 17.05.2003 11:33:30


Alle Zeitangaben in WEZ +2. Es ist jetzt 16:37:54 Uhr.


Powered by vBulletin® Version 3.8.3 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.


© 2001-2024 E-Mail SELFPHP OHG, info@selfphp.deImpressumKontakt