wyszukiwarka nie działa tak jak trzeba - prosze o pomoc

Języki, których efekty są wykonywane po stronie serwera. PHP, ASP czy CGI w połączeniu z bazami danych SQL dają niezwykłe możliwości budowy i zarządzania stron WWW. Tu zadajemy pytania oraz demonstrujemy kod, z którym mamy problem.
amp
Posty: 13
Rejestracja: czw kwie 26, 2007 5:32 pm

wyszukiwarka nie działa tak jak trzeba - prosze o pomoc

Post autor: amp »

mam taka prosta stronkę napisaną w PHP .
Z plików csv pobierane są dane dobazy danych które mają byc wyświetlone na stronie. strona wygląda tak że wcodze sobie np w biuro wezyr i tam mamm mini wyszukiwarke i okno w wynikami niesety wyszukiwarka nie chce wyszukiwac mi według regionów. Oto kod 2 głównych plików plik wezyr.php :
[php]

<?php
require_once('UniversalCSV.php');
function odkodujIATA($napis) {
$kody = array (
'WAW' => 'Warszawa',
'KRK' => 'Kraków',
'KTW' => 'Katowice',
'GDN' => 'Gdańsk',
'WRO' => 'Wrocław',
'POZ' => 'Poznań',
'RZE' => 'Rzeszów',
'LCJ' => 'Łód»',
'SZZ' => 'Szczecin',
'BZG' => 'Bydgoszcz',
'IEG' => 'Zielona Góra',
'SZY' => 'Szczytno');

while(list($klucz, $wartosc) = each($kody)) {
$napis = str_replace($klucz, $wartosc, $napis);
}

return $napis;
}

class Biuro extends UniversalCSV {

private $poleMiejsca;
private $poleWylotu;
private $poleKraju;
private $poleRegionu;
private $dataWylotu;


public function setPoleMiejsca($indeks) {
$this->poleMiejsca=$indeks;
}


public function setPoleWylotu($indeks) {
$this->poleWylotu=$indeks;
}

public function setPoleKraju($indeks) {
$this->poleKraju=$indeks;
}
public function setPoleRegionu($indeks) {
$this->poleRegionu=$indeks;
}
public function setPoleDaty($indeks) {
$this->dataWylotu=$indeks;
}
public function getMiejsca() {
return $this->wartosciPola($this->poleMiejsca);
}

public function getWyloty() {
return $this->wartosciPola($this->poleWylotu);
}

public function getKraje() {
return $this->wartosciPola($this->poleKraju);
}
public function getRegiony() {
return $this->wartosciPola($this->poleRegionu);
}
public function getDaty() {
return $this->wartosciPola($this->dataWylotu);
}

public function wypiszSiebie($tablica) {
//nie ma implementacji
//w kazdej klasie dziedziczacej z tego trzeba
//napisac wlasna funkcje wyswietlajaca
}

public function szukajWycieczki($kraj,$region, $data_od, $data_do, $wylot_z) {
$warunki = array();
$porzadek = array();

if(isset($this->poleKraju)) {
$warunki[$this->poleKraju] = $kraj;
if($kraj != "")
array_push($porzadek, "pole".$this->poleKraju);
}
if(isset($this->poleRegionu)) {
$warunki[$this->poleRegionu] = $region;
if($region != "")
array_push($porzadek, "pole".$this->poleRegionu);
}

if(isset($this->dataWylotu)) {
$warunki[$this->dataWylotu] = array($data_od, $data_do);
if(($data_od != "") || ($data_do != "") )
array_push($porzadek, "pole".$this->dataWylotu);
}


if(isset($this->poleWylotu))
$warunki[$this->poleWylotu] = $wylot_z;

if(count($porzadek) > 0)
$porzadek =" ORDER BY ".implode(",", $porzadek);
else
$porzadek = "";

return $this->search($warunki, $porzadek."");
}
}



class Wezyr extends Biuro {
function __construct() {
parent::__construct(Array("Kod hotelu",//0
"Nazwa hotelu",//1
"Kategoria hotelu",//2
"Nazwa Regionu",//3
"Data wylotu",//4
"Miejsce wylotu",//5
"Lotnisko docelowe",//6
"Długość pobytu",//7
"Wyżywienie",//8
"Cena",//9
"Typ pokoju",//10
"Typ oferty"), ",", "Wezyr");
$this->setPoleRegionu(3);
$this->setPoleWylotu(5);
//z tego co widzialem to kraj to turcja :D
$this->setPoleDaty(4);
}

public function getKraje() {
return Array("Turcja");
}



public function szukajWycieczki($kraj,$region, $data_od, $data_do, $wylot_z) {
if(stripos($region,"") === false || $region == "")
return array();

return parent::szukajWycieczki($kraj,$region, $data_od, $data_do, $wylot_z);
}
public function getWyloty() {
$miejsca=parent::getWyloty();
$res = array();
for($i=0; $i<count($miejsca); $i++) {

$temp=explode(" ", $miejsca[$i]);

for($j=0; $j<count($temp); $j++)

array_push($res, $temp[$j]);
}
return array_unique($res);
}

public function wypiszSiebie($tablica) {
//wypisuje oferte biura wezyr
//pamietaj ze pierwszy jest zawsze ID
echo "\n<table>";
echo "<tr><td><font color='#3221b6'><b>Turcja</b></font></td><td><font color='#3221b6'><b>Region:</b></font> <font color='#ff9900'>".$tablica[4]."</font></td></tr>";
echo "<tr><td><font color='#3221b6'>Hotel: </font><font color='#ff9900'>".$tablica[2]."</font></td></tr>";
echo "<tr><td><font color='#3221b6'>Wylot w dniu:</font><font color='#ff9900'>".$tablica[5]."</font></td><td><font color='#3221b6'>Cena: </font><font color='#ff9900'><b>".$tablica[10]."</b></font></td></tr>";
echo "<tr><td><font color='#3221b6'>Wylot z:</font><font color='#ff9900'> ".odkodujIATA($tablica[6])."</font></td></tr>";
echo "<tr><td><font color='#3221b6'>Długość pobytu:</font><font color='#ff9900'> ".$tablica[8]." dni</font></td><td><font color='#3221b6'>Wyżywienie: </font><font color='#ff9900'>".$tablica[9]."</font></td></tr>";
echo "<tr><td><font color='#3221b6'>Typ pokoju: </font><font color='#ff9900'>".$tablica[11]."</font></td><td><font color='#3221b6'>Typ oferty:</font><font color='#ff9900'>".$tablica[12]."</font></td></tr>";
echo "</table><hr/>\n";
}
}


$biura = array (
new Wezyr(),
);

function listaPol($funkcja) {
global $biura;
$result = array();

for($i=0; $i<count($biura); $i++)
$result = array_merge($biura[$i]->$funkcja(), $result);

$result = array_unique ($result);
sort($result);

return $result;
}

function listaKrajow() {
return listaPol("getKraje");
}
function listaRegionow() {
return listaPol("getRegiony");
}
function listaWylotow() {
return listaPol("getWyloty");
}
function listaDat() {
return listaPol("getDaty");
}
function wyszukajOfert($kraj,$region, $data_od, $data_do, $wylot_z) {
global $biura;
echo "<table>";
for($i=0; $i<count($biura); $i++) {
if(isset($_POST['biura'])) if($_POST['biura'] != $biura[$i]->getTabela()) continue;

$wyniki = $biura[$i]->szukajWycieczki($kraj,$region, $data_od, $data_do, $wylot_z);
echo "<tr><td valign='top'><b>".
$biura[$i]->getTabela().
"</b></td><td>";

for($j=0; $j<count($wyniki); $j++)
$biura[$i]->wypiszSiebie($wyniki[$j]);

echo "</td></tr>";
}
echo "</table>";
}

function doSelectFromArray($tablica, $nazwa, $funkcjaFiltrujaca="") {
echo "<select name='".$nazwa."'>";

foreach($tablica as $wartosc) {
echo "<option value='".$wartosc."'>";
if($funkcjaFiltrujaca != "")
echo $funkcjaFiltrujaca($wartosc);
else
echo $wartosc;
echo "</option>";
}

echo "</select>";
}
?>
[/php]

oraz szukaj2.php
[php]<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
</head>
<body>
<center>
<?php
require_once('wezyr.php');

if(isset($_POST['kraj']) &&
isset($_POST['region']) &&
isset($_POST['wylotZ']) &&
isset($_POST['dataWylotu'])) {

$kraj = $_POST['kraj'];
$region = $_POST['region'];
$wylotZ = $_POST['wylotZ'];
$dataWylotu = $_POST['dataWylotu'];

$dataDo = "9999-12-31";

wyszukajOfert($kraj,$region, $dataWylotu, $dataDo, $wylotZ);
} else {
?>
<form method=post action="szukaj.php" target="WynikiSzukaj">
<input type=hidden value="<?php echo $_GET['biura'];?>" name=biura>
<table>

<?php

echo "<tr><td>Kraj:</td><td>";
doSelectFromArray(listaKrajow(),"kraj");
echo "<tr><td>Region:</td><td>";
doSelectFromArray(listaRegionow(),"region");
echo "</td></tr><tr><td>Wylot z:</td><td>";
doSelectFromArray(listaWylotow(), "wylotZ", "odkodujIATA");
echo "</td></tr><tr><td>Wylot po:</td><td>";
doSelectFromArray(listaDat(), "dataWylotu");
echo "</td></tr>";
?>
<tr><td></td><td><input type="submit" value="Szukaj"></td></tr>
</table>
</form>

<?php
}
?>
</center>
</body></html>
[/php]

co robie źle? jeśli potrzebny jest jeszcze jakis plik to prosze o info.
123456
Zaczyna działać
Zaczyna działać
Posty: 514
Rejestracja: sob paź 28, 2006 1:19 pm

Re: wyszukiwarka nie działa tak jak trzeba - prosze o pomoc

Post autor: 123456 »

Trochę popatrzyłem na ten kod i muszę stwierdzić, że jest dość zagmatwany... Pokaż jeszcze metodę search() a najlepiej cały kod.
amp
Posty: 13
Rejestracja: czw kwie 26, 2007 5:32 pm

odp

Post autor: amp »

to zaweartość pliku UniversalCSV:
[php]<?php
include_once('database.php');

initMySQL();

class StatystykaPola {
private $length;
private $numeric;
private $alldigits;
private $float;

//konstruktot, domyslnie jest to liczba
//calkowita o zerowej dlugosci
public function __construct() {
$this->length = 0;
$this->numeric = true;
$this->alldigits = true;
$this->float = true;
}

//sprawdzamy statystyki danego pola
//aktualizujac je
public function zaktualizuj($napis) {
$napis = trim($napis);
$dlugosc = strlen($napis);
$this->length = max($dlugosc, $this->length);

if(strlen($napis)==0)
return;

if(!ctype_digit($napis))
$this->alldigits = false;

if(!is_float($napis))
$this->float = false;
}

public function isNumber() {
return $this->float || $this->alldigits;
}

public function isString() {
return !$this->isNumber();
}

public function getTypPola() {
if($this->float)
return "REAL";

if($this->alldigits)
return "INTEGER";

if($this->length<=255)
return "CHAR(".$this->length.")";

return "VARCHAR(".$this->length.")";
}

public function opakujDlaBazy($napis) {
if($this->alldigits)
return (int)$napis;

if($this->float)
return (float)$napis;

return "'".mysql_escape_string(trim($napis))."'";
}

public function opakujDoWyszukania($min, $max) {
//gdy max jest rowny min to mamy w przypadku pol typu
//napis wyszukiwanie w tresci
if($min == $max) {
if($this->isNumber())
return ' = '.$min;
else
return " LIKE '%".$min."%'";
} else
return " BETWEEN ".$this->opakujDlaBazy($min).
" AND ".$this->opakujDlaBazy($max);
}

public function getDlugosc() {
return $this->length;
}

public function isLiczbaCalkowita() {
return $this->alldigits;
}

public function isZmiennoprzecinkowa() {
return $this->float;
}

public function obczajZBazy($typ) {

$this->alldigits = (stripos($typ, "int") !== false);

$this->float = (stripos($typ, "real") !== false);

//pola sa w formacie typ(dlugosc)
//wyjmujemy dane z nawiasow
$this->length = (int)substr($typ, stripos($typ,"(")+1);
}
};

class UniversalCSV {
private $wszystkiePola;
private $separatorPol;
private $uniqueTableId;
//to pole jest uzywane tylko podczas wczytywania z pliku
//w innym przypadku jest puste
private $statystykaLinijek;

//inne rozne opcje
private $opcje;

//inicjacja klasy - zobacz do przykladow jak tego uzyc
public function __construct($pola, $separator, $tabela, $inneOpcje=Array()) {

if(!is_array($pola))
die("Parametr musi być tablicą!");

if(count($pola) == 0)
die("Pusta tablica parametrow, nie ze mna te numery!");

$this->wszystkiePola = $pola;
$this->separatorPol = $separator;
$this->uniqueTableId = $tabela;
$this->opcje = $inneOpcje;
}

private function sprawdzOpcje($nazwa) {
if(!isset($this->opcje[$nazwa]))
return false;

return ($this->opcje[$nazwa] == 1);
}

protected function wartosciPola($indeksPola) {
$ret = array();

//szukaj unikatowych wartosci pol
$result = query('SELECT DISTINCT pole'.
$indeksPola.
' FROM '.
$this->uniqueTableId.
' ORDER BY pole'.$indeksPola);

if (mysql_num_rows($result) > 0)
while ($row = mysql_fetch_array($result, MYSQL_NUM)) {
array_push($ret, $row[0]);
}

return $ret;
}

private function obczajLinijkiZBazy() {
//nie ma czego obczajac - trza stworzyc nowe
if(!isset($this->statystykaLinijek))
$this->statystykaLinijek = array();

//jesli juz obczajone to se daruj
if(count($this->statystykaLinijek) > 0)
return;

$sql = "SHOW COLUMNS FROM ".$this->uniqueTableId;

$result = query($sql);
$rows = mysql_num_rows($result);

//w kazdym wierszu jest pole
for($i=0; $i<$rows; $i++) {
$arr = mysql_fetch_array($result);
if($i==0)
continue; //olewamy ID :D

$this->statystykaLinijek[$i-1] = new StatystykaPola();
$this->statystykaLinijek[$i-1]->obczajZBazy($arr[1]);
}

}

//tabela
public function getTabela() {
return $this->uniqueTableId;
}

//funkcja do szperania w polach
public function search($warunki, $dodatek="") {

$ret = array(); //zwrot to tablica w kazdym wierszu pola w tablicy

$sql = "SELECT * FROM ".$this->uniqueTableId." WHERE ";

$this->obczajLinijkiZBazy();

$pierwszyKlucz = true;

while(list($klucz, $wartosc) = each($warunki)) {
//klucz to indeks pola liczony od 0
//wartosc to zalozone na to pole warunki
$min = $wartosc;
$max = $min;

//mozna podac obie wartosci :D
//nie tylko pierwsza czy tez druga
if(is_array($wartosc)) {
$min = $wartosc[0];
if(count($wartosc) > 1)
$max = $wartosc[1];
else
$max = $min;

}

if(($max == $min) && ($min == ""))
continue;

if(!$pierwszyKlucz)
$sql.=" AND ";

$sql.="(pole".$klucz." ".$this->statystykaLinijek[$klucz]->opakujDoWyszukania($min, $max).")";
$pierwszyKlucz=false;
}
$sql.=" ".$dodatek;
$result = query($sql);


while($arr = mysql_fetch_array($result, MYSQL_NUM))
array_push($ret, $arr);

return $ret;
}

private function wyczyscBazeDanych() {
//w krzaki z tym! idzie nowe
query("DROP TABLE IF EXISTS ".$this->uniqueTableId);

//tworzenie tabelki w locie - wszystkie dane jako tekst
//tak bedzie latwiej a i dzieci sie uciesza
$sql = "CREATE TABLE ".$this->uniqueTableId."(";
$sql.= " ID INTEGER UNSIGNED NOT NULL DEFAULT NULL AUTO_INCREMENT, ";
$dlugosc = count($this->wszystkiePola);
for($i=0; $i<$dlugosc; $i++) {
$sql.="\t pole".$i." ";

//wykoncypowujemy typ danego pola na podstawie statystyk
$sql.=$this->statystykaLinijek[$i]->getTypPola();

//tak dla ladnego wygladu
$sql.="\n";

$sql.=",";
}
$sql.=" PRIMARY KEY(ID)) ENGINE = MyISAM";
//tworzymy tabelke, ale z nas specjalisci :D
query($sql);
}


//mierzy dlugosc, szerokosci po to by lepsza baze stworzyc
private function obmierzLinijke($linijka) {

$rozbitaLinijka = explode($this->separatorPol, $linijka);
$dlugosc = count($rozbitaLinijka);

if($dlugosc == 0)
return;

for($i=0; $i<$dlugosc; $i++) {
if(!isset($this->statystykaLinijek[$i]))
$this->statystykaLinijek[$i]=new StatystykaPola();

$this->statystykaLinijek[$i]->zaktualizuj($rozbitaLinijka[$i]);
}
}

//zapisuje jedna linijke danych do bazy
private function zapiszLinijke($linijka) {

$rozbitaLinijka = explode($this->separatorPol, $linijka);
$dlugosc = count($rozbitaLinijka);

if($dlugosc == 0)
return;

$sql = "INSERT INTO ".$this->uniqueTableId."(";

//generuje indeksy pol do wstawiania
for($i=0; $i<$dlugosc; $i++) {
$sql.="pole".$i;

if($i!=$dlugosc-1)
$sql.=",";
}

$sql.=") VALUES(";

//dla kazdej linijki robimy to samo
for($i=0; $i < $dlugosc; $i++) {

$sql.=$this->statystykaLinijek[$i]->opakujDlaBazy($rozbitaLinijka[$i]);

if($i != $dlugosc - 1)
$sql.=",";
}
$sql.=")";

query($sql);

}

//przelec plik i cos dla kazdej linii zrob
private function przelecPlik($uchwytPliku, $funkcja) {
//wracamy do poczatku pliku
fseek($uchwytPliku, 0);

$pierwszaLinia = true;

while(!feof($uchwytPliku)) {
//zakladam ze najdluzsza linijka ma dwa kilobajty
$linia = fgets($uchwytPliku, 8096);

//sprawdzamy czy pierwsza linia
if($pierwszaLinia) {
$pierwszaLinia = false;
if($this->sprawdzOpcje("zignorujPierwszaLinie"))
continue;
}
$this->$funkcja(trim($linia));
}
}

//plikiem moze byc wszystkie lacznie z urlem
public function zaladujZPliku($plik) {

//otwieramy plik
$uchwytDoPliku=fopen($plik, "r");

//zapisujemy dane to tymczasowego pliku
$temp = tmpfile();

while(!feof($uchwytDoPliku)) {
$kawalek=fread($uchwytDoPliku, 4096);
fwrite($temp, $kawalek);
}
fclose($uchwytDoPliku);

fseek($temp, 0);

$uchwytDoPliku = $temp;

// to kasuje plik
//bez jaj, plik musi istniec :D
if(!$uchwytDoPliku) {
echo "Nie udało się otworzyć pliku: ".$plik;
return;
}

$this->statystykaLinijek = Array();
//obmierzamy kazda linijke
$this->przelecPlik($uchwytDoPliku, "obmierzLinijke");

//odswiezamy baze danych, wypieprzamy stare dane
$this->wyczyscBazeDanych();
//zapisz linijke
$this->przelecPlik($uchwytDoPliku, "zapiszLinijke");

//zamknij plik
fclose($uchwytDoPliku);
}
}
?>
[/php]
i update.php:

[php]<?php
require_once('biura.php');
require_once('wezyr.php');
require_once('eccot.php');

echo "Ładuje dane:\n";

echo "Wezyr:\n";
flush();

$biura[0]->zaladujZPliku("oferta.csv");


echo "Ecco Holiday:\n";
flush();
$biura[1]->zaladujZPliku('eh_csv_so.csv');


echo "Ecco Travel:\n";
flush();
$biura[2]->zaladujZPliku('et_csv_so.csv');
echo "Koniec";
?>

[/php]
ODPOWIEDZ