Sql Abfrage über Session speichern !

skype20

Mitglied
Hallo, ich hatte schon einen Thread über eine Suchfunktion mit Blätterfunktion geöffnet leider lief er erfolglos.. aber ich habe alternativ eine neue Lösung gefunden nähmlich sessions . Für die jenigen die bis jetzt nicht wissen von welchen Problem ich rede Erläutere ich mal kurz. Und zwar habe ich eine Suchfunktion gebaut die ab sagen wir mal 3 Suchergebnissen eine 2 Seite erstellt. Aber nun ist da POST-Array immer leer wenn ich die 2 Seite öffne. Nun habe ich sessions eingesetzt aber irgenwie klappt es nicht.... Könnte mir einer bitte helfen, danke

Hier ist das Skript.



PHP:
session_start();

// Prüfen ob das Formular gesendet wurde
if(isset($_POST['submit'])){
    // Array initializieren. Falls kein argument angegeben wurde,
    // dann ist die Argumentliste ein leeres Array
    $wheres = array();
    //Jedes Feld prüfen und ggf in den Where-Array einfügen
    if($_POST['sex']) $wheres[] = "sex='{$_POST['sex']}'";
    if($_POST['land']) $wheres[] = "land='{$_POST['land']}'";
    if($_POST['username']) $wheres[] = "nickname LIKE '%{$_POST['username']}%'";
    if($_POST['state']) $wheres[] = "state='{$_POST['state']}'";
    if($_POST['status']) $wheres[] = "status='{$_POST['status']}'";



    // WHERE-Tel des SQL-String zusammenstellen
    if(count($wheres)>0) $wherestring = "WHERE ".implode(' AND ', $wheres);
    //SQL-String zusammensetzen
    $sql = mysql_query("SELECT * FROM `".PREFIX."user`{$wherestring}");
    //TODO: Sql an die DB absetzen

}


2. Teil des Skriptes( Session+ Blätterfunktion)

PHP:
if(!isset($wherestring))
   {
   $wherestring = "";
   }


    $_SESSION['whereklausel'] = $wherestring;




// Anzahl der Mitglieder
$user_count= safe_query("SELECT * FROM ".PREFIX."user ");
$user_results= mysql_num_rows($user_count);
// Anzahl der Mitglieder

$maxusers = 2;
$alle = safe_query("SELECT * FROM `".PREFIX."user`{$wherestring}");
$gesamt = mysql_num_rows($alle);
$pages = ceil($gesamt/$maxusers);

if(isset($_GET['page'])) $page=(int)$_GET['page'];
else $page = 1;
$sort="nickname";
if(isset($_GET['sort'])){
  if(($_GET['sort']=='country') || ($_GET['sort']=='nickname') || ($_GET['sort']=='lastlogin') || ($_GET['sort']=='registerdate')) $sort=$_GET['sort'];
}

$type="ASC";
if(isset($_GET['type'])){
  if(($_GET['type']=='ASC') || ($_GET['type']=='DESC')) $type=$_GET['type'];
}

if($pages>1) $page_link = makepagelink("index.php?site=registered_users&sort=$sort&type=$type", $page, $pages);
else $page_link='';

if($page == "1") {
	$ergebnis = safe_query("SELECT * FROM `".PREFIX."user`{$wherestring} ORDER BY ".$sort." ".$type." LIMIT 0,".$maxusers);
	if($type=="DESC") $n=$gesam;
	else $n=1;
}
else {
	$start=$page*$maxusers-$maxusers;
	$ergebnis = safe_query("SELECT * FROM `".PREFIX."user`{$wherestring} ORDER BY ".$sort." ".$type." LIMIT ".$start.",".$maxusers);
	if($type=="DESC") $n = ($gesamt)-$page*$maxusers+$maxusers;
	else $n = ($gesamt+1)-$page*$maxusers+$maxusers;
}

$anz=mysql_num_rows($ergebnis);


Ich hoffe ihr könnt mir helfen denn versuche schon c.a seit 2 wochen das Problem zu lösen :rolleyes:

mfg

skype20
 
Warum eine Session? Die paar Parameter kannst du doch über die URL weiter reichen eine URL kann bis zu 1024 bytes lang sein. Und für eine Zählung der Datensätze solltest du nicht alle abrufen und schon gar nicht mit SELECT. Arbeite mit LIMIT wenn du nur 3 Datensätze brauchst.

Wie sieht denn die Tabelle genau aus von der Struktur her, dann schreib ich dir ein grobes Skript für die Abfrage, wenn du willst.

PS: pro SELECT * - 1xWTF und für jede unvalidierte Variable 2xWTF
 
Dankeschön,

Ich habe 3 Screenshots von der Tabelle gemacht da sie auch so lang ist . Die Tabellen Struktur abzutippen wäre zu umständlich.


Teil 1

m584tz5i



Teil 2

1hbtyxj6



Teil 3

hfjj1mgn


mfg

skype20
 
Das nützt mir nix, ich kann nur ein Bild runter laden.

Ein einfacher Struktur Export würde schon reichen, da musst du auch nicht viel tippen.

ZB:
SQL:
CREATE TABLE IF NOT EXISTS `columns_priv` (
  `Host` char(60) COLLATE utf8_bin NOT NULL DEFAULT '',
  `Db` char(64) COLLATE utf8_bin NOT NULL DEFAULT '',
  `User` char(16) COLLATE utf8_bin NOT NULL DEFAULT '',
  `Table_name` char(64) COLLATE utf8_bin NOT NULL DEFAULT '',
  `Column_name` char(64) COLLATE utf8_bin NOT NULL DEFAULT '',
  `Timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `Column_priv` set('Select','Insert','Update','References') CHARACTER SET utf8 NOT NULL DEFAULT '',
  PRIMARY KEY (`Host`,`Db`,`User`,`Table_name`,`Column_name`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='Column privileges';
 
Zuletzt bearbeitet von einem Moderator:
Hmm.. sorry das ist so schwer bin aber mit dem beispiel wird ja ne mysql Tabelle erstellt jedoch ist meine doch schon erstell worden und deshalb kann ich den code nicht mehr anfordern bzw. rückwirkend holen und der strukur export exportiert mir doch nur die Datei aber falls du meinst kann ich sie dir schicken ... :S
 
Hi skype20,

lade deine Screenshots entweder hier im Forum als Anhang hoch oder auf einen freien Bildhoster.
Zum Beispiel: http://imgur.com

Und halte dich bitte weiter an die Netiquette hier im Forum, sprich groß- und kleinschreibung, sowie Satzzeichen.

Gruß
BK
 
Dankeschön, dann fange ich nochmal an.

DB TEIL 1

x457p.jpg


DB TEIL 2

fHmgG.jpg


DB TEIL 3

QVx2P.jpg


Ich hoffe es hat dir weitergeholfen ....
 
Halli Hallo,

ich möchte dir nur mitteilen, wie ich sowas machen würde:

- Führe den SELECT auf die gewünschten Spalten genau einmal aus.
- Hole alle Ergebnisse und lade sie in ein Array
- Generiere eine Unique-ID (z.B. aktueller Timestamp aus time()+Remote-IP aus $_SERVER) mittels MD5
- Serialisiere mittel serialize() das Ergebnis-Array und füge den serialisierten String + die Unique-ID in eine Datei oder neue Tabelle in der DB am besten mit INDEX auf die Spalte, die die Unique-ID beinhaltet.
- Stelle die ersten X Suchergebnisse auf der Seite dar, inkl. dem Link für die nächste Seite, der als GET-Parameter die Unique und die Seiten-Zahl beinhaltet
- Prüfe beim Laden des Such-Scripts, ob eine Unique-ID und eine Seitennummer übergeben wurde, wenn ja, hole die serialsierten Ergebnisse aus der DB und deserialisiere sie mittels unserialize(); Splice das Array in Teile durch Angabe der Elemente pro Splice, hole das Array mit dem Index Seitenzahl aus dem Splice-Array und stelle die Ergebnisse inkl. Link für die nächste Seite dar.
- usw...

Das hat den Charme, dass
- Du nur einmal die Suche ausführen musst, was bei umfangreichen WHERE-Klauseln viel Performance kosten kann
- Man keine Session braucht
- Kein Post braucht
- Die Get-Parameter überschaubar bleiben -> Prima auch für SEO-Urls.
- Die serialisierten Daten natürlich wie ein Cache funktionieren.
 
Um ehrlich zu sein habe ich nicht so wirklich viel verstanden. Ich bin ein Php Anfänger und bin gerade am lernen aber danke für die Bemühungen du müsstest mir den code leicht verständlicher erklären.
 
Naja, du fragst ja derzeit die Datenbank mit einem SELECT und den zugehörigen Bedingungen ab. Das machst du jedes mal wenn die Suche aufgerufen wird. Auch wenn du weiter blätterst in den Ergebnissen, fragst du die Datenbank noch mal und noch mal ab...

Das kannst du abkürzen. Du speicherst die Ergebnisse einfach ab. Das kann man mittels serialisieren machen, dabei wird die zu serialisierende Variable in einen String umgewandelt.

Ein Beispiel soll es dir erklären:

Du hast ein Array, ich definiere es hier direkt, es kann aber auch das Ergebnis einer SQL-Abfrage sein.

PHP:
$array = array(
  "Hallo",
  "Welt",
  "Hier", 
  "sind",
  "ganz",
  "viele",
  "Ergebnisse",
  "drin"
);

echo serialize($array);

Ergebnis:

Code:
a:8:{i:0;s:5:"Hallo";i:1;s:4:"Welt";i:2;s:4:"Hier";i:3;s:4:"sind";i:4;s:4:"ganz";i:5;s:5:"viele";i:6;s:10:"Ergebnisse";i:7;s:4:"drin";}

Statt den String auszugeben, kann man den auch in einer Tabelle speichern, die so aufgebaut ist:

Code:
unique_id VARCHAR(32) NOT NULL [UNIQUE INDEX]
serialized_search_results TEXT NOT NULL

Dann kann man ihn jederzeit aus der Tabelle holen, und zwar mittels SELECT und WHERE-Klausel in der in der Spalte unique_id nach der UNIQUE ID gesucht wird. Das Ergebnis ist der serialisierte String, den man einfach mittels unserialize() zurück in ein Array wandeln kann.

Dieses Array ist dann exakt das gleiche, was du zuvor serialisiert hast. array_splice() teilt das Array in Teile mit gleicher Anzahl Elemente. Wenn du nun die Anzahl der Elemente so festlegst, das sie der Anzahl der Suchergebnisse pro Seite (z.B. 3) entspricht, dann bekommst du ein Array, welches wiederum Arrays enthält:

PHP:
// Definiere die Anzahl der Ergebnisse pro Seite
$num_search_result_per_page = 3;

// Seite besorgen
$page = 0;
if(isset($_GET['page']))
  $page = (int)$_GET['page'];

// Das ist das serialisierte Ergebnis-Array des Such-SELECTS
$serialized_array = 'a:8:{i:0;s:5:"Hallo";i:1;s:4:"Welt";i:2;s:4:"Hier";i:3;s:4:"sind";i:4;s:4:"ganz";i:5;s:5:"viele";i:6;s:10:"Ergebnisse";i:7;s:4:"drin";}';

// Deserialisiere die Ergebnisse in ein Array
$search_results = unserialize($serialized_array);

// Hole die Ergebnisse für die entsprechende Seite aus dem deserialisierten Array
$paged_results = array_splice($search_results, $page*$num_search_result_per_page, $num_search_result_per_page);

// Zum anzeigen, was gefunden wurde
echo "<pre>";
var_dump($paged_results);
echo "</pre>";

Wenn du diesen Code in ein neues Script kopierst und dann aufrufst, siehst du das hier:

Code:
array
  0 => string 'Hallo' (length=5)
  1 => string 'Welt' (length=4)
  2 => string 'Hier' (length=4)

Wenn du dann an die Adresse im Browser noch den GET-Parameter "page=1" anhängst, siehst du das hier:

Code:
array
  0 => string 'sind' (length=4)
  1 => string 'ganz' (length=4)
  2 => string 'viele' (length=5)

Viel Spaß beim probieren. Ach übrigens, die rot-markierten Befehle in den PHP-Scripten kann man anklicken. Man landet da direkt im PHP-Handbuch auf der entsprechenden Seite, auf die Befehle erklärt werden.

Du kannst aber gern weiter fragen, wenn du das so lösen willst.

Ich hoffe, das hat es etwas besser erklärt.
 
Zurück