db Abfrage mit Formular

bisi blöd beschrieben von mir sorry!

zur Simultion:
in diesem $_POST array ist bei Datumv noch einmal ein => array

ich bekomme jetzt eben eine Fehlermeldung weil das array beim datum leer ist aber nicht gefiltert wurde.
Code:
$where =
 array
  'Name' => string 'Name LIKE 'user'' (length=19)
  'Datumv' => 
    array
      0 => string '' (length=0)
      1 => string '' (length=0)

daher meine Frage: kann es sein das mein zweites array bei Datumv=> nicht gefiltert wird?sollte ja eigentlich leer sein!
und ich bekomme daher diese sql Abfrage:
SELECT *FROM projekte WHERE Name LIKE 'user' AND ArrayUnknown column 'Array' in 'where clause'


Vielen Dank
Gruß
Larnhof
 
Zuletzt bearbeitet:
PHP:
<?php
  
  require("logintemplate.php");
  require("index.php");
  
  ?>
  <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
	<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</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">
												<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>
  <?php
   }
		

	else
	{		  error_reporting(E_ALL);
				
			
		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':
						         
						$wert = vsprintf('%04d-%02d-%02d', 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');
				$where = array_filter(array_intersect_key($_POST, $allowedPost));
				array_walk($where, 'createWherePart');
				$where = implode(' AND ', $where);
				if($where) $where = "WHERE {$where}";
				$sql = "SELECT *FROM projekte {$where}";
				echo $sql;
				
				$erg = @mysql_query($sql) or die( mysql_error());
						echo "<table border=3 bgcolor='#FFCC33'>";
						echo "<tr>";
						for($i=0; $i<mysql_num_fields($erg); $i++) //mysql_num_fields() liefert die Anzahl der Felder in der Ergebnismenge, die mit dem Parameter Ergebnis-Kennung angegeben wurde.
						{ 
						$feld = mysql_field_name($erg, $i);
							echo "<th>". $feld . "</th>";
						}
							echo "</tr>";
						while($row = mysql_fetch_row($erg)) 
						{
							echo "<tr>";
						  
						  for($i=0; $i<mysql_num_fields($erg); $i++)
							echo "<td>" . $row[$i] . "</td>";
							echo "</tr>";
						}
				
						echo "</table><p>";
		
				?><a href="datenauslesen.php<?php session::showLink(true); ?>">Zurück zu Auswahl</a></p><?php
	}
?>
		</body>
	</html>

das script funkt wenn ich das Datum auswähle doch sobald ich etwas anderes dazu oder alleine auswähle bekomme ich eben einen fehler weil das script immer ein "AND" noch einfügt obwohl mein Datum leer ist.

Vielen Dank!
Gruß
Larnhof
 
Nur Von-Datum:
SQL:
SELECT *FROM projekte WHERE Datumv >= '2001-01-01'

Nachd em * muss noch ein Leerzeichne hin.

Von und bis_Datum
SQL:
SELECT *FROM projekte WHERE Datumv BETWEEN '2001-01-01' AND '2001-01-01'

Nur Bis-Datum:
SQL:
Notice: Array to string conversion in I:\xampp\htdocs\test\test.php on line 145
SELECT *FROM projekte WHERE Array

Diesen Fall musst du noch ausprogrammieren. Ist sehr gut um den Code verstehen zu lernen.


Andere Felder und vonbis
SQL:
SELECT *FROM projekte WHERE Name LIKE 'name1' AND Firma LIKE 'Firma2' AND Standort LIKE 'Standort3' AND Datumv BETWEEN '2001-01-01' AND '2001-01-01'

Andere Felder ohne vonbis
SQL:
Notice: Array to string conversion in I:\xampp\htdocs\test\test.php on line 121
SELECT *FROM projekte WHERE Name LIKE 'name1' AND Firma LIKE 'Firma2' AND Standort LIKE 'Standort3' AND Array

Also, wenn kein Von-Datum da ist, gibts Probleme weil er aus dem Array kein String macht.


So passen wir mall die Funktion an und ergänzen um den fall "nur bis" und " weder bis "noch von"
PHP:
        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}'";
                    } elseif ($wert[1]){
                        $wert = "{$spalte} <= '{$bis}'";
                    } else{
                        $wert = false;
                    }
                                       
                    break;
                
                case 'date':
                    $wert = vsprintf('%04d-%02d-%02d', explode('-', $wert));
                    break;
                
                case 'number':
                    $wert = "{$spalte} = {$wert}";
                    break;
                
                case 'string':
                    $wert = "{$spalte} LIKE '{$wert}'";                
                }
            }

Damit der False-Fall kein leeres AND im Where generiert wenden wir noch einen Filter ein.
PHP:
                array_walk($where, 'createWherePart');
                $where = array_filter($where);
                $where = implode(' AND ', $where);
 
Zuletzt bearbeitet von einem Moderator:
Guten Morgen!

@yaslaw

Ich danke dir recht herzlich!!
es funktioniert jetzt alles so wie es sein muss!!
DANKE das ich von dir lernen durfte!

noch kurz zu
Code:
Notice: Array TO string conversion IN I:\xampp\htdocs\test\test.php ON line 145
SELECT *FROM projekte WHERE Array
bei diesen Fehler hab ich mir gedacht das es eben daran liegt, das mein array bei Datumv nicht gefiltert wurde!und genau so war es!!

Danke nochmals an alle!!
Gruß
Larnhof
 
Zurück