db Abfrage mit Formular

Hallo liebe Leute

@yaslaw
ich habe seit Gestern alles probiert um meine Datumseingabe hin zu bekommen aber Ergebnislos hab schon soviel probiert und nachgelesen aber irgendwie komm ich einfach nicht drauf dies zu lösen!
hab es jetzt so probiert:
PHP:
<?php
 
		
				
				
			$spalte = $_POST['Name'];  
			$spalte = $_POST['Firma'];
			$spalte = $_POST['Standort'];
			$spalte = $_POST['Datumv'];
			
			
			
			
			
						
			function createWherePart(&$wert, $spalte)
		{    
			switch($GLOBALS['allowedPost'][$spalte])
				{
				case 'string':            
				$wert = "{$spalte}  LIKE '{$wert}'";
				break; 				
				case 'date':
         		$wert ="{$spalte} =". vsprintf('"%04d-%02d-%02d"', explode('-', $wert))."AND {$spalte} <= ". vsprintf('"%04d-%02d-%02d"', explode('-', $wert));   				break; 
				
				case 'number':           
				          
				       
				default:            
					$wert = "'{$wert}'";  
			
				}    
			$wert = "{$wert}";        
		} 
?>

wenn ich ein echo $sql ausführe bekomme ich:
SELECT * FROM projekte WHERE Datumv ="2010-02-21"AND Datumv <= "2010-02-21"
was ja von SQL her eigentlich richtig ist nur das ich eben keinen 2 wert zum vergleichen habe

viel. könnte es was mit meinem Formular zu tun haben.
denn wenn ich bei phpmyadmin den SQL Befehl schreibe SELECT * FROM projekte WHERE Datumv ="2010-02-01"AND Datumv <= "2010-02-21"
bekomme ich auch das richtige Ergebnis

so sieht mein Formular aus:
HTML:
<html>
     <head>
           <title>Datensätze auswählen</title>
           <link rel="stylesheet" type="text/css" href="style.css">
     </head>
     <body>
 <?php if(!isset($_POST['submit']))
	{ ?>
		  <form action="<?php $PHP_SELF ?>" method="post">
		  <table width="600" bgcolor="#000000" border="0" cellpadding="5" cellspacing="1" align="center">
			<tr>
			  <td bgcolor="#e7e7e7" align="center" colspan="2">
			  <b>Datensatz auswählen</b>
			  </td>
			</tr>
			
			<tr>
			  <td width="170" bgcolor="#e7e7e7"><b>Wählen Sie einen Mitarbeiter aus</b></td>
			  <td bgcolor="#ffffff"><select name="Name" size="1" style="width:150; bgcolor:#ffffff">
			     <option select></option>
<?php			  
					$SQL_statement="SELECT Name FROM users"; 
					$resultset=mysql_query($SQL_statement); 
					while($data=mysql_fetch_array($resultset))
					{ 
						echo "<option value=\"$data[0]\">$data[0]</option>";
					}  			
									  
?>			  
			    </select>
			  </td>
			</tr>
			
			<tr>
			  <td width="170" bgcolor="#e7e7e7"><b>Bitte wählen Sie eine Firma aus</b></td>
			  <td bgcolor="#ffffff"><select name="Firma" size="1" style="width:150; bgcolor:#ffffff">
			     <option select></option>
<?php			  
					$SQL_statement="SELECT Firma  FROM projekte"; 
					$resultset=mysql_query($SQL_statement); 
					while($data=mysql_fetch_array($resultset))
					{ 
						echo "<option value=\"$data[0]\">$data[0]</option>";
					}  					
				  
?>			  
			    </select>
			  </td>
			</tr>
			
			<tr>
			  <td width="170" bgcolor="#e7e7e7"><b>Bitte wählen Sie einen Standort aus</b></td>
			  <td bgcolor="#ffffff"><select name="Standort" size="1" style="width:150; bgcolor:#ffffff">
			     <option select></option>
<?php			  
					$SQL_statement="SELECT Standort FROM projekte"; 
					$resultset=mysql_query($SQL_statement); 
					while($data=mysql_fetch_array($resultset))
					{ 
						echo "<option value=\"$data[0]\">$data[0]</option>";
					}  				
									  
?>			  
			    </select>
			  </td>
			</tr>
			
			<tr>
			  <td width="170" bgcolor="#e7e7e7"><b>Datum von</b><br><br>Bitte folgendes Datumformat verwenden:<br>z.B.: 2001-01-01</td>
			  <td width="230" bgcolor="#ffffff"><input type="Datumv" name="Datumv" size="32" class="input">
			</tr>
			
			<tr>
			  <td width="170" bgcolor="#e7e7e7"><b>Datum bis</b><br><br>Bitte folgendes Datumformat verwenden:<br>z.B.: 2001-01-01</td>
			  <td width="230" bgcolor="#ffffff"><input type="Datumv" name="Datumv" size="32" class="input">			  
			</tr>
					
		

			<tr>
			  <td bgcolor="#e7e7e7" align="center" colspan="2">
			  <input type="submit" name="submit" value="Daten auslesen" class="button">
			  </td>
			</tr>

		  </table>
		  </form>
      </body>
</html>

warum vergleicht er meinen zeiten Datumswert nicht?
ich bekomm auf meiner Gltze bald graue Haare:confused:

Vielen vielen Dank!!
Gruß
Larnhof
 
Du überschreibst $spalte 4 mal. Wenn
$spalte = $_POST['Name'];
$spalte = $_POST['Name'];
...


Wozu?


Datumv ="2010-02-21"AND Datumv <= "2010-02-21"
Also, Datum is gleich einem Wert und Datum ist kleiner als ein Wert. Das ist kein zwieschen.....

Im Formlular füllst du ein DatumVon und ein DatumBis in die gleiche Variable `datumd`. Ist nicht unbedingt umwerfend. Am besten machst du ein Wertebereich draus. Nenn sie datumv[]. Dann gibt es ein Array mit 2 Werten zurück.

Hab hier mein Beispiel für den between angepasst.
Dabei wird beachtet, ob das bis nicht abgefüllt ist.. Kann beliebig erweitert werden

PHP:
<?php
// Diese Zeile simuliert die Post-Übergabe eines Formulars
$_POST = array(
    'name'=>'user',    
    'firma'=>'GMBH',
    'standort'=>'',
    'datumv' => array('2010-15-2', '2010-13-3'),
    'unbekanntesFeld' => 'irgend was unerwünschtes');
 
/**
 * Funktion um aus den Werten je nach Datentyp einen richtigen SQL-WHERE - Teil zu bilden.
 */
function createWherePart(&$wert, $spalte){
    switch($GLOBALS['allowedPost'][$spalte]){
        case 'daterange':
            if ($wert[0])   $von = vsprintf('"%04d-%02d-%02d"', explode('-', $wert[0]));
            if ($wert[1])   $bis = vsprintf('"%04d-%02d-%02d"', explode('-', $wert[1]));
            
            if($wert[0] && $wert[1]){
                $wert = "{$spalte} BETWEEN '{$von}' AND '{$bis}'";
            } elseif ($wert[0]){
                $wert = "{$spalte} >= '{$von}'";
            }
            break;
        case 'date':
            //TODO: Format noch anpassen. Ist nicht umbedingt MySQL-Konform
            $wert = vsprintf('%02d-%02d-%04d', explode('.', $wert));
            break;
        case 'number':
            $wert = "{$spalte} = {$wert}"; 
            break;
        case 'string':
            $wert = "{$spalte} LIKE '{$wert}%'";
    }
}
 
//Erwartete Felder und ihr Datentyp
$allowedPost = array(
                    'name' => 'string',
                    'firma' => 'string',
                    'standort' => 'string',
                    'datumv' => 'daterange');
 
//Array erstellen mit allen übergebenen Variablen die in $allowedPost definiert sind
//Mehr dazu: http://wiki.yaslaw.info/wikka/PhpPost2Var
//array_intersect_key entfernt nicht definierte Post-Values. In meinem Beipsiel 'unbekanntesFeld'
//array_filter ohne Filterfunktion filter alle leeren Einträge aus. in diesem Fall 'standort'
$wheres = array_filter(array_intersect_key($_POST, $allowedPost));
 
//Alle Wheres formatieren
array_walk($wheres, 'createWherePart');
 
//Alle Wheres mit 'AND' zusammenfügen ...
$where = implode(' AND ', $wheres);
//... und ggf den Befehl WHERE voranstellen
if($where) $where = "WHERE {$where}";
 
//SQL erstellen
$sql = "SELECT *
       FROM projekte
       {$where}";
       
echo $sql;        
?>
 
Guten Morgen!

@yaslaw
So hab nun deinen Rat befolgt und hab es nun im Formular so gemacht:
HTML:
<tr>
	 <td width="170" bgcolor="#e7e7e7"><b>Datum</b><br><br>Bitte folgendes Datumformat verwenden:<br>z.B.: 2001-01-01</td>
	 <td width="230" bgcolor="#ffffff"><input type="hidden"  name="Datumv" value=$von><input type="DatumVon" name=$von size="32" class="input">
		                          <input type="hidden"  name="Datumv" value=$bis><input type="DatumBis" name=$bis size="32" class="input">	
</tr>

funkt. noch nicht denn wenn ich das script ausführe bekomme ich eine Fehlermeldung:
Warning: vsprintf() [function.vsprintf]: Too few arguments in

hab nachgeschaut was da sein kann und es wird gesagt das die Platzhalter% schuld sind!was ja in meinem fall eigentlich nicht sein kann oder
oder ist bei meinem Formular noch was falsch?

Vielen Dank
Gruß
Larnhof
 
Dann schmeiss mal ein echo auf $wert und eines auf explode('-', $wert[0]) rein um zu sehen was da drin steht
 
Dein Formular stimmt nicht ganz... kurz zur Erklärung zum Code vom Yaslaw:


PHP:
$_POST = array(    'name'=>'user',        'firma'=>'GMBH',    'standort'=>'',    'datumv' => array($_POST["datum_von"], $_POST["datum_bis"]),    'unbekanntesFeld' => 'irgend was unerwünschtes');

das ist jetzt soweit bearbeitet, dass du das mit einem Formular ausgeben kannst. GGF. ist da jetzt ein Syntax Fehler im array aber mit ein wenig rumprobieren bekommste das schon hin :-)

Jetzt zu deinem Formular:

HTML:
<tr>
	 <td width="170" bgcolor="#e7e7e7"><b>Datum</b><br><br>Bitte folgendes Datumformat verwenden:<br>z.B.: 2001-01-01</td>
	 <td width="230" bgcolor="#ffffff"><input type="hidden"  name="datum_von" value=$von><input type="datum_von" name=$von size="32" class="input">
		                          <input type="hidden"  name="datum_bis" value=$bis><input type="datum_bis" name=$bis size="32" class="input">	
</tr>

Versuchs mal so. Es sollte funktionieren
 
Also wenn ich in den zwei Zeilen % wegnehme
PHP:
if ($wert[0])   $von = vsprintf('"04d-02d-02d"', explode('-', $wert[0]));
if ($wert[1])   $bis = vsprintf('"04d-02d-02d"', explode('-', $wert[1]));

bekomme ich bei explode ('-', $wert[0]): Array
und bei Wert: Datumv BETWEEN "04d-02d-02d" AND "04d-02d-02d"

kann es sein das ich von meinem Formular nichts bekomme?

Danke!!
 
Hallo djbergo

Danke für deine Antwort
Also wie es yaslaw geschrieben
PHP:
$_POST = array(    'name'=>'user',        'firma'=>'GMBH',    'standort'=>'',    'datumv' => array($_POST["datum_von"], $_POST["datum_bis"]),    'unbekanntesFeld' => 'irgend was unerwünschtes');
das versteh ich.
deshalb habe ich es versucht gleich im Formular zu erledigen.

zu deinem Formular Code:
funkt leider nicht
bekomme immer noch den Fehler von den zwei Zeilen!

DANKE
 
OK, mach auf $wert mal nicht ein echo sondern ein print_r() oder var_dump() um zu sehen was da drin steht.

die % braucht es schon, sonst ists kein Formatstring
 
@yaslaw
du hast im script folgendes verwendet um leere einträge zu filtern:
PHP:
$where = array_filter(array_intersect_key($_POST, $allowedPost));

Frage kann es sein das er nur nach dem $_POST filtert und/oder wie ich es beim Datum dann habe wo nocheinmal ein array ist
PHP:
$_POST = array(    
				'name'=>'user',
				'firma'=>'GMBH',
				'standort'=>'',
				'datumv' => array('2010-15-2', '2010-13-3'), 
				'unbekanntesFeld' => 'irgend was unerwünschtes');

Danke!!
Gruß
 
Versteh deine Frage nicht ganz. Aber:

$_POST in meinem Beispiel ist nur eine Simulation die es mir ermöglichte das Script zu testen ohne das ich ein Formular etc. brauche. Diese Zeile fällt selbstverständlich am Ende weg.

$allowedPost = array(...) ist die definition aller zuässigen posts. Also der Namen aller Felder die mit post übergeben werden darf
 
Zurück