DB Suche optimieren

Grunge

Erfahrenes Mitglied
Hallo Leute,

ich habe ein kleines Problem. Und zwar: Ich habe eine Suche, dabei hab ich vier Möglichkeiten:

1. Suche nach Kategorie (durch klicken auf Link)
2. Suche nach PLZ
3. Alles Kombiniert^^
4. Suche ohne Kriterien

Zur Optimierung der Seite, sollen nur 16 Ergebnisse pro Seite angezeigt werden. Das funktioniert auch soweit ganz gut, nur wenn man auf die 2. Seite geht, sucht er automatisch die ganze DB ab, und nicht die benutzerdefinierte Suche, die vorher getätigt wurde. Wie kann man das nun am besten optimieren? Und am einfachsten Umsetzen?

Falls Code benötigt wird, sagt mir welchen.

Bis dahin
 
Hi

also der Benutezr gibt in einem Formular Suchkriterien ein, nach denen wird abgefragt und die erste
Ergebnisseite ausgegeben, und der Link zur nächsten Seite hat die Suchkritieren aber nicht drin?
...dann muss man die (in der PHP-Datei der ersten Suche ja vorhandenen) Kriterien eben als Teil vom Link ausgeben?
Versteh die Schwierigkeit nicht ganz.
 
Hier ist zwar das Paging noch nicht implementiert, aber grundsätzlich würde ich es (mit PDO) so umsetzen:
PHP:
$category = isset( $_GET[ 'category' ] ) ?       $_GET[ 'category' ] : null;
$postcode = isset( $_GET[ 'postcode' ] ) ?       $_GET[ 'postcode' ] : null;
$page     = isset( $_GET[ 'page'     ] ) ? (int) $_GET[ 'page'     ] : 1;

$case  = 0;
$case += $category * 1;
$case += $postcode * 2;

switch ( $case ) {
  # category and postcode are not defined
   case 0:
    $stmt = $pdo->prepare( 'SELECT * FROM `table`' );
  break;
 
  # category is defined, but not postcode
   case 1:
    $stmt = $pdo->prepare( 'SELECT * FROM `table` WHERE `category` = ?' );
    $stmt->bindValue( 0, $category );
  break;

  # postcode is defined, but not category
   case 2:
    $stmt = $pdo->prepare( 'SELECT * FROM `table` WHERE `postcode` = ?' );
    $stmt->bindValue( 0, $postcode );
  break;

  # category and postcode are defined
   case 3:
    $stmt = $pdo->prepare( 'SELECT * FROM `table` WHERE `category` = ? AND `postcode` = ?' );
    $stmt->bindValue( 0, $category );
    $stmt->bindValue( 1, $postcode );
  break;
}

$stmt->execute();
 
Jap so ähnlich habe ich es nun auch gemacht, nun ist nur mein Problem, dass wenn ich die Blätterfunktion hinzugefügt habe, um immer nur 16 Beiträge pro Seite anzuzeigen, der Link zur nächsten Seite, ja die Abfrage voraussetzt, die er auf der nächsten Seite ausführen muss, nur der Limit eben angepasst.

leider gibt er mir als String immer:

SELECT * FROM xxx WHERE xxx=\'xxxx\' ....
und durch die Backslashes kann natürlich keine vernünftige Abfrage erfolgen. Wisst ihr, wie man das ganze elegant lösen kann bzw die Backslashes entfernen ?
 
Das hört sich eher nach einem Verständnisproblem bei Stringliteralen an :rolleyes:
Kannst du uns den Code zeigen, wo deine Abfrage zusammengesetzt wird und wie sie gesendet wird?
 
Code:
$categorie = $_GET['categorie'];
    $sql = "SELECT * FROM wp_models WHERE $categorie AND ($einordnung) LIMIT $start, $eintraege_pro_seite";
            $seitenabfrage="SELECT * FROM wp_models WHERE $categorie AND ($einordnung)";

das funktioniert einwandfrei, nur weiter unten, bei der seitenausgabe:
Code:
//SEITEN AUSGABE
            $seiten_result=$db->query($seitenabfrage);
            $menge = 0;
            while($seitenrow=$seiten_result->fetch_assoc()) {
                $menge++;
            }
            $wieviel_seiten = $menge / $eintraege_pro_seite;
                //Seitenausgabe
                ?>
                <table width="100%" border="0">
                    <tbody>
                  <tr>
                <td width="50%" align="left">
                 <?php
                if($_GET['seite'] > 1) {
                    $page=$_GET['seite'] - 1;
                    echo "<a href=\"?page_id=5&suche=suche1&seite=$page\">Zurück</a>";
                }
                ?>
                
                 </td>
                <td width="50%" align="right">
                <?php
                if(isset($_GET['seite'])) {
                    $vor=$_GET['seite']+1;
                }else{
                $vor=2;  
                }
              
                ?>
                <a style="color:#000;" href="?page_id=5&suche=suche1&cat=<?php echo $categorie; ?>&seite=<?php echo $vor; ?>">Vor</a></td>
                      </tr>
                  </tbody>
                </table>

und das $categorie macht hier die Probleme es wird mit \" \" ausgegeben, so dass es oben bei der DB abfrage natürlich zu Komplikationen kommt
 
SQL:
SELECT * FROM wp_models WHERE $categorie AND ($einordnung) LIMIT $start, $eintraege_pro_seite

Diese Form einer WHERE Klausel kenn ich gar nicht, muss da nicht noch irgendwas hin? WHERE category = $categorie zum Beispiel? Sonst steht doch da am Schluss einfach zum Beispiel "... WHERE 1 AND 2..." was dir immer sämtliche Resultate liefert.

Ausserdem scheinst du weder mit prepared statements noch mit escaping zu arbeiten. Also wenn man einen Request an deine Seite macht mit dem categorie GET-Parameter auf "1; DROP TABLE wp_models; SELECT * FROM wp_models WHERE 1 " hat man am Ende "SELECT * FROM wp_models WHERE 1; DROP TABLE wp_models; SELECT * FROM wp_models WHERE 1 AND ($einordnung) LIMIT...". Klingt sympathisch!
 
Also $einordnung wird vorher gesetzt:
Code:
$categorie="";
            if(isset($_GET['cat'])) {
                $categorie=$_GET['cat'];
            }
            switch($_POST['categorie']) {

                case ("kids"):
                $categorie=" einordnung_kids='1'";
                break;
                case ("wmodels"):
                $categorie=" einordnung_wmodels='1'";
                break;
                case ("mmodels"):
                $categorie=" einordnung_mmodels='1'";
                break;
                case ("bestager"):
                $categorie=" einordnung_bestager='1'";
                break;
                case ("xxl"):
                $categorie=" einordnung_xxl='1'";
                break;
                case ("typen"):
                $categorie=" einordnung_typen='1'";
                break;
               
               
            }
$einordnung="";
            if(isset($_POST['portrait'])) {
            $einordnung=$einordnung."portrait='1'";
            }else{
            $einordnung=$einordnung."portrait='0'";
            }
            if(isset($_POST['mode'])) {
            $einordnung=$einordnung." OR mode='1'";
            }else{
            $einordnung=$einordnung." OR mode='0'";
            }
            if(isset($_POST['bade'])) {
            $einordnung=$einordnung." OR bade='1'";
            }else{
            $einordnung=$einordnung." OR bade='0'";
            }
            if(isset($_POST['teilakt'])) {
            $einordnung=$einordnung." OR teilakt='1'";
            }else{
            $einordnung=$einordnung." OR teilakt='0'";
            }
            if(isset($_POST['akt'])) {
            $einordnung=$einordnung." OR akt='1'";
            }else{
            $einordnung=$einordnung." OR akt='0'";
            }
            if(isset($_POST['laufsteg'])) {
            $einordnung=$einordnung." OR laufsteg='1'";
            }else{
            $einordnung=$einordnung." OR laufsteg='0'";
            }
            if(isset($_POST['messe'])) {
            $einordnung=$einordnung." OR messe='1'";
            }else{
            $einordnung=$einordnung." OR messe='0'";
            }
            if(isset($_POST['tv'])) {
            $einordnung=$einordnung." OR tv='1'";
            }else{
            $einordnung=$einordnung." OR tv='0'";
            }

so! Das klärt aber immer noch nicht wieso in meiner URL die \ sind.
 
Das ist ja jetzt plötzlich ganz anderer Code als vorhin! Wenn du nicht nochmals ne andere Version hast kann man aber immernoch mit nem entsprechenden Request deine Datenbank nach belieben modifzieren. GET parameter cat auf das setzen, was ich in meinem vorherigen Posting vorschlug und POST Parameter categorie auf irgendwas setzen, was nicht im switch vorhanden ist. Du darfst nie Requestparameter direkt für queries verwenden, das ist dein eigenes Todesurteil. Dein ganzer Aufbau scheint mir generell äusserst schräg, zum Beispiel hier:
PHP:
&cat=<?php echo $categorie; ?>

Das $categorie da ist ja Teil einer SQL-Abfrage und das willst du als URL haben? Also dann irgendwie sowas: &cat=%20einordnung_kids%3D1 ?

Code an den User zu schicken in einer sichtbaren Form ist jetzt nicht sooo prickelnd. Warum lässt du die ganze Unterscheidung mit GET und POST einfach sein und machst einfach nur einen GET Parameter der die Werte aus deinem POST-switch hat und machst darauf aufbauend dann die Query?
 
Zurück