Datenbankausgabe mit Blätterfunktion

hallo,
ich hoffe ich kann dir die richtige Antwort geben.
ich speichere folgende Daten:

PHP:
 $query  =   sprintf("SELECT * FROM ResBar " .$sql  ,
	
	mysqli_real_escape_string($db_link, $garten),
	mysqli_real_escape_string($db_link, $kueche),
	mysqli_real_escape_string($db_link, $plz),
	mysqli_real_escape_string($db_link, $ort),
	mysqli_real_escape_string($db_link, $behindert),
	mysqli_real_escape_string($db_link, $nacht),
	mysqli_real_escape_string($db_link, $freigabe)
);

und das staren sollte die WHERE abfrage oben sein.
es spielt vermutlich auch eine Rolle wie es nacheinander abgearbeitet werden soll, vielleicht habe ich da ja auch noch fehler gemacht.
Wie oft wird denn diese Seite bearbeitet? (klar, wenn ich eine Schleife habe, solange bis die Abfrage erfüllt sind) aber ohne Schleifenabfrage, läuft es nur einmal durch und das wars, bis ein neuer aufruf kommt, oder gibt es hier auch, wie in der SPS- Programmierung eine Zykluszeit, d.h. in dieser Zeit (oft nur einige ms) in der das Programm ständig durchlaufen wird.
Die Frage klingt vielleicht komisch aber ich finde sie wichtig für mein Verständnis.
 
Zum $sql:
der code steht oberhalb der Blätterfunktion
Bitte stell einfach einmal die ganze Datei rein,
inkl. includes wenn vorhanden.

Von mir aus kann ich die Verkürzung sogar machen (weil twas Zeit vorhanden),
aber ich will nicht jedesmal nachfragen müssen, was wo ist.

@SPS:
Nein, hier gibt es keine Zykluszeit, und generell ist sehr viel prinzipiell anders.
Die Codereihenfolge spielt trotzdem eine große Rolle (immer und überall)

Zur korrekten Verwendung von Session (wenn überhaupt) gibt es viele viele Tutorials...
 
Noch ein paar Tips von mir:

- Gib doch $sql vor dem mysqli_query() mal aus! Dann siehst du, wie dein Query für Seite 1, 2 oder 3 ausschaut. Auf Seite 2 dürfte der WHERE-Teil leer sein, weil du ja alle Datensätze siehst. Wenn ja, hast du schonmal einen Ansatzpunkt für das Debuggen. Jetzt überprüfst du welche Variable dafür ausschlaggebend ist, dass $sql so ist wie es ist.

- Für die Zukunft: ich würde dir wirklich Trennung von Layout und Logik empfehlen und Prepared Statements. Mit letzterem kannst du dir die mysqli_real_escape_string()-Aufrufe gänzlich sparen!
Zum ersten noch ein wenig: wenn du MV*-Prinzipien (z.B. MVC) befolgt hättest, dann hättest du jetzt eine schöne Trennung von Datenbankabfrage in Model und Datenausgabe in View. Das Model könntest du dann einzeln mit Unit Tests oder Methoden deiner Wahl testen, und zwar ohne den ganzen Schnickschnack der View zu haben! Ich weiß, ich erwähne ein wenig "hätte-hätte-Fahrradkette" :D. Aber wenn man einmal so eine schöne Trennung gesehen hat, dann will man NIE mehr anderen Code schreiben wollen.
 
Hallo,
erstmal vielen Dank für Euere Bemühungen,
wo kann ich denn die MV*-Prinzipien (z.B. MVC) sehen oder Beispiele wie es gemacht wird, wenn ich es verstehe dann soll es auch geändert werden, aber das ist Fleißaufgabe.
Das gesamte Programm aber mit vielen echos ist ganz oben, ich kann sie dir alle entfernen wenn du dann eine bessere Übersicht hast
nochmals vielen Dank
Gruß
Rainer

ich stell nochmal die ganze Datei rein
Das ist eine Untertabelle von ResBar, die in Abhängigleit der Plz. aufgerufen wird. Das sind immer nur 4 Bilder
PHP:
require_once ('konfiguration-ResBar.php');
$id          = $_POST['id'];
$plz         = $_POST['plz'];
$bild_a      = $_POST['bild_a'];
$bild_b      = $_POST['bild_b'];
$bild_c      = $_POST['bild_c'];
$bild_d      = $_POST['bild_d'];
$plzw = $plz;

 
$query2  =   sprintf(
	"SELECT distinct(rb.plz), bild_a, bild_b, bild_c, bild_d FROM Werbung w
	join ResBar rb on w.plzw = rb.plz
	where rb.plz = '".$plzw."'",
	mysqli_real_escape_string($db_link, $plzw)
); 
 

$db_ergw = mysqli_query( $db_link, $query2 );
if ( ! $db_ergw )
{
die('Ungültige Abfrage: ' . mysqli_error());
}

 
echo "<table width='100%'  >
      <tbody>
      <td  width='25%' >   </td>
      <td  width='25%' >   </td>
      <td  width='25%' >   </td>
      <td  width='25%' >   </td>
";
 

while ($zeilew = mysqli_fetch_array( $db_ergw, MYSQL_ASSOC))
{
		echo "<tr align='center' >";
		echo "<td>". $zeilew['bild_a'] .           "</td>";
		echo "<td>". $zeilew['bild_b'] .           "</td>";
		echo "<td>". $zeilew['bild_c'] .           "</td>";
		echo "<td>". $zeilew['bild_d'] .           "</td>";								
		echo "</tr>";
}


 
mysqli_free_result( $db_ergw ); 


echo "</tbody></table>";


und ab hier ist die Ausgabe der Datenbank wo ich die Blätterfunktion einbauen möchte

PHP:
require_once ('konfiguration-ResBar.php');

$garten      = $_POST['garten'];
$kueche      = $_POST['kueche'];
$plz         = $_POST['plz'];
$ort         = $_POST['ort'];
$behindert   = $_POST['behindert'];
$nacht       = $_POST['nacht']; 
$freigabe    = $_POST['freigabe'];
 
  
/* if( empty($_POST['ort'])  && empty($_POST['plz']) )
	{ echo 'Ort oder Plz. muss ausgefüllt werden';   exit;  }
 */
 
	$sql  = (empty($_POST['garten']))    ? '' : " AND garten    = '".$_POST['garten']      ."'";
	$sql .= (empty($_POST['ort']))       ? '' : " AND ort       = '".$_POST['ort']         ."'";
	$sql .= (empty($_POST['kueche']))    ? '' : " AND kueche    = '".$_POST['kueche']      ."'";
	$sql .= (empty($_POST['plz']))       ? '' : " AND plz       = '".$_POST['plz']         ."'";
	$sql .= (empty($_POST['behindert'])) ? '' : " AND behindert = '".$_POST['behindert']   ."'";
	$sql .= (empty($_POST['nacht']))     ? '' : " AND nacht     = '".$_POST['nacht']       ."'"; 
	$sql .= (empty($_POST['freigabe']))  ? '' : " AND freigabe  = '".$_POST['freigabe']    ."'"; 
	
	$sql = substr($sql, 5);
	$sql = ($sql == '') ? ""  : " WHERE ".$sql ;
  

 

$seite = $_GET["seite"];  //Abfrage auf welcher Seite man ist   


if(!isset($seite))  
   {
   $seite = 1;
   }


echo " Anzeige der Seite". " " ."$seite" . ", ". " ";

$eintraege_pro_seite = 30;


$start = $seite * $eintraege_pro_seite - $eintraege_pro_seite;
echo "$start" . " " . "=" . " ". "$seite". " ". "*". " ". "$eintraege_pro_seite" . " ". "-". " ". "$eintraege_pro_seite". " ";
 


 $query  =   sprintf("SELECT * FROM ResBar " .$sql  ,
	
	mysqli_real_escape_string($db_link, $garten),
	mysqli_real_escape_string($db_link, $kueche),
	mysqli_real_escape_string($db_link, $plz),
	mysqli_real_escape_string($db_link, $ort),
	mysqli_real_escape_string($db_link, $behindert),
	mysqli_real_escape_string($db_link, $nacht),
	mysqli_real_escape_string($db_link, $freigabe)
);  
 
 
 
$db_erg = mysqli_query( $db_link, $query );
if ( ! $db_erg )
{ die('Ungültige Abfrage: ' . mysqli_error());  }



$num_rows = mysqli_num_rows($db_erg);   // Abfragen wieviele Treffer Zeilen es gibt

echo "$num_rows Zeilen\n ohne Limit ";  // Ausgabe der Zeilen

$menge = $num_rows; 
 

$query  =   sprintf("SELECT * FROM ResBar " .$sql . "LIMIT $start, $eintraege_pro_seite" ,
	
	mysqli_real_escape_string($db_link, $garten),
	mysqli_real_escape_string($db_link, $kueche),
	mysqli_real_escape_string($db_link, $plz),
	mysqli_real_escape_string($db_link, $ort),
	mysqli_real_escape_string($db_link, $behindert),
	mysqli_real_escape_string($db_link, $nacht),
	mysqli_real_escape_string($db_link, $freigabe)
);  
 
 
$db_erg = mysqli_query( $db_link, $query );
if ( ! $db_erg )
{ die('Ungültige Abfrage: ' . mysqli_error());  }



$num_rows_2 = mysqli_num_rows($db_erg); 

echo "$num_rows_2 Zeilen\n mit bergrnzung ";

$eintraege_pro_seite = $num_rows_2; 
   
 
 
 echo "<table width='100%' class='altrowstable' id='alternatecolor' >
  <tbody>
  
      <td background='images/leiste-schatten-ausgabetabelle.gif' width='5%' >  Bild                 </td>
      <td background='images/leiste-schatten-ausgabetabelle.gif'>  Lokalname                        </td>
      <td background='images/leiste-schatten-ausgabetabelle.gif'>  Küche                            </td>
	  <td background='images/leiste-schatten-ausgabetabelle.gif'>  Garten                           </td>
	  <td background='images/leiste-schatten-ausgabetabelle.gif'>  Ruhetage                         </td> 
	  <td background='images/leiste-schatten-ausgabetabelle.gif'>  Über- <br>nachtung               </td> 
	  <td background='images/leiste-schatten-ausgabetabelle.gif'>  Behinderten- <br>freundlich      </td> 
	  <td background='images/leiste-schatten-ausgabetabelle.gif'>  Telefon                          </td> 
	  <td background='images/leiste-schatten-ausgabetabelle.gif'>  Postleitzahl                     </td> 
	  <td background='images/leiste-schatten-ausgabetabelle.gif'>  Ort                              </td> 
	  <td background='images/leiste-schatten-ausgabetabelle.gif'>  Straße                           </td> 
	  <td background='images/leiste-schatten-ausgabetabelle.gif'>  Homepage                         </td> 	  
   
";




while ($zeile = mysqli_fetch_array( $db_erg, MYSQL_ASSOC))
{
		echo "<tr>";
		echo "<td>". $zeile['bild'] .           "</td>";
		echo "<td>". $zeile['restaurantname'] . "</td>";
		echo "<td>". $zeile['kueche'] .         "</td>";
		echo "<td>". $zeile['garten'] .         "</td>";
		echo "<td>". $zeile['montag']  .' '.  $zeile['dienstag'] .' '.  $zeile['mittwoch'] . ' '.  $zeile['donnerstag'] . ' '.  $zeile['freitag']     .' '               . $zeile['samstag'] . ' '.  $zeile['sonntag'] . "</td>";
		echo "<td>". $zeile['nacht'] .          "</td>";
		echo "<td>". $zeile['behindert'] .      "</td>";
		echo "<td>". $zeile['telefon'] .        "</td>";
		echo "<td>". $zeile['plz'] .            "</td>"; 
		echo "<td>". $zeile['ort'] .            "</td>";    
		echo "<td>". $zeile['strasse'] .        "</td>";  

        // Escaping für Kontextwechsel nach HTML
        $e = function ($s) { return htmlspecialchars($s, ENT_QUOTES, 'UTF-8'); }; 
        //homepage Anzeige als Link
        echo '<td><a href="' . $zeile['homepage'] . '">' . $zeile['homepage'] . '</a></td>';  		 
		echo "</tr>";
}

 
mysqli_free_result( $db_erg ); 

	 
echo "</tbody></table>";
echo "&nbsp;";  // Leerzeile

if ( empty ($num_rows)){
echo " Keinen Treffer in Datenbank, bitte neue Suche";
 }


$wieviel_seiten = $menge / $eintraege_pro_seite;

echo "<div align=\"center\">";
echo "<b>Seite:</b> ";



for($a=0; $a < $wieviel_seiten; $a++)
   {
   $b = $a + 1;
   if($seite == $b)
      {
      echo "  <b>$b</b> ";
      }
   else
      {
      echo "  <a href=\"?seite=$b\">$b</a> ";
      }
   }
echo "</div>";

ich hab mal etwas Überflüssige Textbeschreibung entfernt.


Danke
 
Zuletzt bearbeitet:
Zu MVC

Ein MVC-Grundgerüst selber zu schreiben würde ich dir nicht empfehlen. Fertiges gibt es massenweise, z.B. CakePHP, ZendFramework, Yii, CodeIgniter, Symfony, ...

Eine Erklärung zu MVC (wenn auch eher etwas JS-bezogen), kannst du hier
unter der Überschrift "MVC" finden.
(Das Buch selbst handelt über JS Design Patterns - kann ich nur empfehlen; und wer Fehler findet: es ist Opensource)


Zu deinem Skript

Wie gesagt, füge doch mal folgende Zeile hinzu:
PHP:
$query  =   sprintf("SELECT * FROM ResBar " .$sql  , 
     
    mysqli_real_escape_string($db_link, $garten), 
    mysqli_real_escape_string($db_link, $kueche), 
    mysqli_real_escape_string($db_link, $plz), 
    mysqli_real_escape_string($db_link, $ort), 
    mysqli_real_escape_string($db_link, $behindert), 
    mysqli_real_escape_string($db_link, $nacht), 
    mysqli_real_escape_string($db_link, $freigabe) 
);   

// diese hier!
var_dump($query);
Und poste die Ausgabe.
 
Hallo, danke für die Infos,
habe als Plz. 91166 eingegeben und das ist das Ergebnis

string(67) "SELECT * FROM ResBar WHERE plz = '91166' AND freigabe = '1'" //Seite 1
string(21) "SELECT * FROM ResBar " //Seite 2, 3, 4 .....

es werden aber immer neue Datensätze ausgegeben, aber nur von oben nach unten der Datenbank
ohne etwas mit der plz. zu tun zu haben, naja der WHERE ....... fehlt ja



Ich habe mir mal die Programme angeschaut, die du oben aufgeführt hast.
Das ist ansich eine tolle sache, aber es ist doch voraussetzung, dass mann php schon sehr gut beherrscht.
So ähnlich wird auch bei uns programmiert, bei uns heißt es Funktionsbausteine
 
Zuletzt bearbeitet:
So und jetzt denke mal bitte einen Schritt weiter:

Kein WHERE-Teil im String
=> $sql ist anscheinend leer

Wann ist $sql leer bzw. von welchen Faktoren hängt dies ab?
- von den $_POST-Daten

Sprich, alle $_POST-Daten sind leer (du überprüfst sie in deinem Code mit empty()).

Und nun sind wir wieder bei Yaslaw's Aussage angekommen (Beitrag #9), u.a.:

Ich denke, dass das folgende dein Problem ist.
Du sendest das Formular. Damit wird $sql abgefüllt und die Daten gefiltert.
Wenn du dann auf Seite 2 gehst, verlierst du diese Information, da du die Daten in $_POST nciht mehr hast.

Beim ersten Suchen überträgst du die Formulardaten (Suchkriterien) per $_POST an dein Skript. Dein Skript zeigt nun die Suchergebnisse korrekt an. Jetzt klickst du auf den Link "Seite 2", welcher zu der URL ?seite=2 führt.
Nun erhält dein PHP-Skript nur einen einzigen Wert an sich vom Browser: $_GET['seite']. Mehr nicht!

Lösung (auch wie Yaslaw sagte): Die Suchkriterien irgendwo zwischenspeichern wäre im Prinzip die "direkte" Lösung zu deiner Problemstellung.

ABER diese Lösung ist auf keinen Fall benutzerfreundlich! Angenommen ich suche bei dir was, navigiere zur zweiten Seite und schicke nun den Link an einen Freund. Was sieht der Freund? Gar nichts - im besten Fall eine Fehlermeldung, wenn du dein Skript so programmierst. URLs von Suchanfragen sollten auf jeden Fall weiterleitbar sein! Deswegen würde ich empfehlen alle Suchkriterien per URL zu übergeben.

Eigentlich ist das ganze noch viel schlimmer, denn was passiert, wenn der Nutzer eine zweite Suchanfrage startet oder seine Cookies löscht? In beiden Fällen ist der alte Link ungültig.
 
hallo,
dann müsste in der Abfrage für Seite 2 auch noch rein was er abfragen soll,
$_GET['seite'] + die Abfrage mit SELECT * FROM ResBar " .$sql . "LIMIT $start, $eintraege_pro_seite
denn mit der Seite 2 werden ja auch die nächsten 3 Zeilen aus der Datenbank abgefragt
 
Ja, klar. An deiner Stelle würde ich auch nicht einen Parameter wie "Seite" nutzen, stattdessen eignen sich "start" + "count" besser, sprich Startzeile + Anzahl an weiteren Suchergebnissen.

Was das jetzt konkret heißt

Schreibe dein ganzes Skript so um, dass es $_GET statt $_POST nutzt. Außerdem musst du dein Suchformular so verändern, dass es $_GET statt $_POST-Requests schickt (method="get" statt method="post").
Schließlich musst du bei der Ausgabe für die Seitenlinks alle Parameter wieder in die URL einfügen!
 
Zurück