Datenbankausgabe mit Blätterfunktion

solala123

Erfahrenes Mitglied
Hallo,
die Datenbankausgabe funktioniert und auch die Begrenzung der Ausgabe mit LIMIT funktioniert auch.

was nicht funktioniert, bzw falsch funktioniert,
es sind z.B. 12 Einträge mit Plz. 91166 in der Datenbank vorhanden, es werden die ersten 3 auch richtig angezeigt, die Seitenanzahl wird mit 4 angegeben auch das stimmt.
wenn ich jetzt auf Seite 2 Blättere, dann gibt es wieder eine Berechnung der Seitenanzahl aber mit allen einträgen der Datenbank und diese kann ich auch durchblättern.
Wie kann man das verhindern, bzw. wie kann ich die 4 Seiten nur begrenzen?

hier mal mein Code:

PHP:
// ======================== Anfang der Blätterfunktion ==================================

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

//Wenn man keine Seite angegeben hat, ist man automatisch auf Seite 1
if(!isset($seite))
   {
   $seite = 1;
   }


//Einträge pro Seite: Hier 3 pro Seite
$eintraege_pro_seite = 3;

//Ausrechen welche Spalte man zuerst ausgeben muss:

$start = $seite * $eintraege_pro_seite - $eintraege_pro_seite;
echo "$start" . " " . "=" . " ". "$seite". " ". "*". " ". "$eintraege_pro_seite" . " ". "-". " ". "$eintraege_pro_seite". " ";
 
 // ========================= Ende der Blätterfunktion ==================================
 
 
 
// ===== Anfang ==== Abfrage wieviel Treffer Zeilen es gibt ohnr Begrenzung ============= 
//====== Wieviele Einträge gibt es überhaupt

 $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; 

// ===== Ende ==== Abfrage wieviel Treffer Zeilen es gibt ohnr Begrenzung =============== 
 
 
 
// ===== Anfang ==== Abfrage wieviel Treffer Zeilen es gibt mit Begrenzung ============== 
$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());  }


// Abfragen wieviele Zeilen ausgegeben werden
$num_rows_2 = mysqli_num_rows($db_erg); 
// Ausgabe der Zeilen
echo "$num_rows_2 Zeilen\n mit bergrnzung ";

$eintraege_pro_seite = $num_rows_2; 
   
 
// ===== Ende ==== Abfrage wieviel Treffer Zeilen es gibt mit Begrenzung ================ 
 
 
 
 
 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";
 }


//Errechnen wieviele Seiten es geben wird
$wieviel_seiten = $menge / $eintraege_pro_seite;

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


//Ausgabe der Links zu den Seiten
for($a=0; $a < $wieviel_seiten; $a++)
   {
   $b = $a + 1;

   //Wenn der User sich auf dieser Seite befindet, keinen Link ausgeben
   if($seite == $b)
      {
      echo "  <b>$b</b> ";
      }

   //Aus dieser Seite ist der User nicht, also einen Link ausgeben
   else
      {
      echo "  <a href=\"?seite=$b\">$b</a> ";
      }


   }
echo "</div>";

Vielen Dank
mfg
Rainer
 
Zuletzt bearbeitet:
Tut er, nur bei dir nicht, weil das hier für dich nicht mehr neu (ungelesen) ist.

Dass niemand antwortet dürfte daran liegen,
dass der Code so durcheinander ist, dass man ihn schwer durchblickt,
daran, dass Teile fehlen,
und dass niemand Lust hat, die überflüssigen 90% rauszukürzen
(dass der Code auch kürzer geht ist sicher)
 
hallo,
es ist mir klar, dass es immer verbesserungen in der Software gibt und wenn ich es in diesen Fall besser machen könnte, dann würde ich nicht Euere Hilfe benötigen.
mfg
Rainer
 
Was sheel sagen wollte. Du postest uns da 173 Zeilen Code und erwartest dass wir jetzt hingehen und diesen durchsuchen.
Um das PRoblem zu finden müssten wir alsoe den Code durchgehen, alles Problemunrelevante entfernen, versuchen zu verstehen was du da genau machst und dann einen Fehler finden

Sorry, dazu hat fast niemand Lust.

Ich hab mal kurz reingeschaut. Schon auf Zeile 28 kapituliere ich, weil da ein $sql, dass mMn für das Problem zentral sein könnte, einfach aus dem Nichts auftaucht.

Dafür habe ich viele Zeilen HTML-Gedöns was mich für die Problemsuche absolut nicht interessiert.

Also, was du vorbereitend tun solltest, ist die Relevante Teile aus dem Code herauslösen und diese dann hier zu posten (inkl. $slq)

Nachtrag
Den LIMIT, von dem du schreibst, sehe ich nirgens im Code
 
hallo,
ich hab das ganze Skript gesendet, weil ich dachte man kann es besser verfolgen was da los ist.
Was meinst du denn mit "mMn" das verstehe ich nicht.
Das LIMIT steht ca. in der mitte des Codes
Die ganzen echos und Kommentare habe ich zum überprüfen reingeschrieben, damit ich sehe was mit Variablen passiert.
Damit man es besser lesen kann, soll ich die echos und Dokumentationen entfernen? Ich versuch es mal,

PHP:
$seite = $_GET["seite"];
if(!isset($seite))
   {
   $seite = 1;
   }

$eintraege_pro_seite = 30;
$start = $seite * $eintraege_pro_seite - $eintraege_pro_seite;



 $query  =   sprintf("SELECT * FROM ResBar " .$sql  ,
	
	mysqli_real_escape_string($db_link, $garten),
        .
        .
);
$num_rows = mysqli_num_rows($db_erg);   // Abfragen wieviele Treffer Zeilen es gibt
$menge = $num_rows;

 
$query  =   sprintf("SELECT * FROM ResBar " .$sql . "LIMIT $start, $eintraege_pro_seite" ,
	
	mysqli_real_escape_string($db_link, $garten),
        .
        .
);


$num_rows_2 = mysqli_num_rows($db_erg); // Abfragen wieviele Zeilen ausgegeben werden
$eintraege_pro_seite = $num_rows_2; 


while ($zeile = mysqli_fetch_array( $db_erg, MYSQL_ASSOC)) //Ausgabe Tabelle
{
		echo "<tr>";
		echo "<td>". $zeile['bild'] .           "</td>";
                .
                .
}

mysqli_free_result( $db_erg );


$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 hoffe es ist jetzt besser,

Vielen Dank
Gruß
Rainer
 
Zuletzt bearbeitet:
mMn: meiner Meinung nach
Limit: Jepp, jetzt seh ich es.

Aber woher kommt $sql? Das ist eine zentrale Variable, aber ich sehe nicht dass sie jemals abgefüllt wird.
 
hallo,

PHP:
	$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 ;

das kommt von meinem Formular. Ich habe 6 mögliche Eingaben zur Abfrage der Datenbank aber es ist nicht nötig alle auszufüllen.
Die Felder, die ausgefüllt wurden, werden mit AND verknüpft.

der code steht oberhalb der Blätterfunktion
 
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.
Diese musst du über die Session oder über GET mit dem Link mitgeben. und auf Seite 2 erneut auswerten.
 
das die Daten auf der Seite 2 nicht mehr zur Verfügung stehen, das leuchtet mir ein, aber weshalb wird dann auf den folgenden Seiten ( ab Seite 2 ) wieder die GESAMTE Datenbank abgefragt?

Ich erklärs mal in meiner SPS Sprache:
1. Daten aus Datenbank abfragen
2. Daten holen (in unseren Fall Begrenzt mit LIMIT)
3. Alle Daten abspeichern die gefunden wurden
4. wenn die 2 Seite aufgerufen wird, Daten aus Speicher holen und nicht aus der Datenbank.

der Befehl Session scheint ja mein "Zwischenspeicher" zu sein

aber ich habe keinen blassen schimmer, wie ich den einbauen muss.

Gruß
Rainer
 
Zurück