No masz Pan, wczoraj przeglądałem Twoją stronkę, zaciekawił mnie art. o generowaniu linków i tego nie zauważyłem.
Dzięki.
Nie wiem czy dobrze, że tu zamieszczam a nie nowy temat tworzę, ale to w sumie w ramach starego jest, jakby co to założę nowy.
Do rzeczy, posiedziałem trochę i spłodziłem coś takiego, generalnie działa tak jak chciałem żeby działało ale mam wrażenie, że coś przegapiłem.
Krótkie wprowadzenie:
Skrypt wyszukiwarki, mamy trzy okienka na stronie, województwa (provinces), miasta (cities), usługi (services), po wejściu na stroną od razu ładują się województwa, po wybraniu jednego lub kilku województw w okienku miast pokazują się te miasta które należą do wybranych województw, jeszcze obok jest lista ikonek reprezentujących usługi, można wybrać jakieś usługi lub nie, warunek jest taki, że zawsze musi być wybrane przynajmniej jedno województwo inaczej wywali komunikat o zawężeniu kryteriów wyszukiwania, reszta jest opcjonalna.
Po wybraniu odpowiednich kryteriów, za pomocą jquery (ajaxa) przekazuję (GET'em) zmienne dotyczące województw, miast lub usług do pliku ze skryptem poniżej a wyniki ładuję w DIV'a. Teraz moje pytanie czy waszym zdaniem przyjęty sposób sprawdzania poprawności w/w zmiennych (preg_match()) jest wystarczający, czy może coś jeszcze dopisać, druga sprawa to czy coś byście zmienili w samym zapytaniu lub sposobie jego generowania.
Docelowo zmienne są przekazywane GET'em ale poniżej zamieszczam skrypt testowy i odpowiednikiem tych zmiennych są zmienne $p (województwa), $c (miasta), $s (usługi) - to tak jakby ktoś się pytał.
<span style="font: normal 10pt Arial;">
<?php
require_once( "../configure.php" );
//$p = '1|2|';
$c = '50|51|';
//$s = '1|2|';
$provincesArray = explode( "|", $p ); $servicesArray = explode( "|", $s );
foreach( $provincesArray as $provinceId ) {
if( !isset( $province ) ) { if( preg_match( '/^[0-9]{1,2}$/', $provinceId ) == TRUE ) $province = '`dc`.`provinceId` = '.$provinceId; } else {
if( preg_match( '/^[0-9]{1,2}$/', $provinceId ) == TRUE ) $province .= ' || `dc`.`provinceId` = '.$provinceId; }
}
foreach( $citiesArray as $cityId ) {
if( preg_match( '/^[0-9]{1,9}$/', $cityId ) == TRUE ) $city = '`dc`.`cityId` = '.$cityId; } else {
if( preg_match( '/^[0-9]{1,9}$/', $cityId ) == TRUE ) $city .= ' || `dc`.`cityId` = '.$cityId; }
}
foreach( $servicesArray as $serviceId ) {
if( !isset( $service ) ) { if( preg_match( '/^[0-9]{1,2}$/', $serviceId ) == TRUE ) $service = '`cse`.`serviceId` = '.$serviceId; } else {
if( preg_match( '/^[0-9]{1,2}$/', $serviceId ) == TRUE ) $service .= ' || `cse`.`serviceId` = '.$serviceId; }
}
if( $province == "" && $city == "" ) {
echo '<h1 class="header">Błąd wyszukiwania!</h1><p class="body">Należy zawęzić kryteria wyszukiwania.</p>'; } else {
if( $city == "" ) {
$location = $province;
} else {
$location = $city;
}
if( $service == "" ) {
$services = '
LEFT JOIN (
SELECT
`cse`.`cbdId`,
`wds`.`title`,
`wds`.`class`
FROM `WWS_CL_SE` cse, `WWS_DICT_SERVICES` wds, `WWS_CL_ED` wce
WHERE `cse`.`cbdId` = `wce`.`cbdId`
AND `wds`.`serviceId` = `cse`.`serviceId`
AND `wce`.`expires` > NOW()
) AS `ser` ON ( `cbd`.`cbdId` = `ser`.`cbdId` )
';
} else {
$services = '
INNER JOIN (
SELECT
`cse`.`cbdId`,
`wds`.`title`,
`wds`.`class`
FROM `WWS_CL_SE` cse, `WWS_DICT_SERVICES` wds, `WWS_CL_ED` wce
WHERE ( '.$service.' )
AND `cse`.`cbdId` = `wce`.`cbdId`
AND `wds`.`serviceId` = `cse`.`serviceId`
AND `wce`.`expires` > NOW()
) AS `ser` ON ( `cbd`.`cbdId` = `ser`.`cbdId` )
';
}
$selectQuery = $db->prepare( '
SELECT
`cbd`.`cbdId`,
`cbd`.`cityId`,
`cbd`.`name`,
`cbd`.`street`,
`cbd`.`postal`,
`loc`.`city`,
`loc`.`province`,
`cbd`.`phone1`,
`ced`.`www`,
`ced`.`emails`,
`ced`.`phones`,
`ced`.`open`,
`ser`.`title`,
`ser`.`class`
FROM `WWS_CL_BD` cbd
LEFT JOIN (
SELECT
`ced`.`cbdId`,
`ced`.`www`,
`ced`.`emails`,
`ced`.`phones`,
`ced`.`open`
FROM `WWS_CL_ED` ced
WHERE `ced`.`expires` > NOW()
) AS `ced` ON ( `cbd`.`cbdId` = `ced`.`cbdId` )
'.$services.'
INNER JOIN (
SELECT
`dc`.`cityId`,
`dc`.`name` AS `city`,
`dp`.`short_name` AS `province`
FROM `WWS_DICT_CITIES` dc, `WWS_DICT_PROVINCES` dp
WHERE `dc`.`provinceId` = `dp`.`provinceId`
AND ( '.$location.' )
) AS `loc` ON ( `cbd`.`cityId` = `loc`.`cityId` )
' );
$selectQuery->execute();
while( $resultQuery = $selectQuery->fetch( PDO::FETCH_ASSOC ) ) {
$cbdId = $resultQuery['cbdId'];
if( !isset( $clinics[$cbdId] ) ) { $clinics[$cbdId] = array( 'name' => $resultQuery['name'],
'street' => $resultQuery['street'],
'postal' => $resultQuery['postal'],
'city' => $resultQuery['city'],
'province' => $resultQuery['province'],
'phone1' => $resultQuery['phone1'],
'www' => $resultQuery['www'],
);
}
if( !empty( $resultQuery['title'] ) ) { $clinics[$cbdId]['services'][] = array( 'class' => $resultQuery['class'],
'title' => $resultQuery['title']
);
}
}
//echo $city.'<br />'.$province.'<br />'.$service;
foreach( $clinics as $clinicId => $clinic ) { //petla, która leci po klinikach
echo '<h1>'.$clinic['name'].'</h1>'; echo '<p>'.$clinic['street'].'</p>'; echo '<p>'.$clinic['postal'].', '.$clinic['city'].'</p>'; echo '<p>woj. '.$clinic['province'].'</p>'; echo '<p>'.$clinic['phone1'].'</p>'; if( $clinic['www'] != "" ) echo '<p>'.$clinic['www'].'</p>'; if( $clinic['services'] != "" ) {
echo '<p>Usługi ('.count($clinic['services']).')</p>'; foreach( $clinic['services'] as $service ) { //pętla, która leci po usługach
echo '<li>'.$service['title'].' - '.$service['class'].'</li>'; }
}
}
}
?>
</span>
Edited
No i co ? I dupa!
Przetestowałem dokładniej i znalazłem błąd, jak wybieram jedną usługę to pokazuje klinikę a dla niej tą jedną usługą nawet jak klinika ma ich więcej pokazuje tylko tą wybraną.
Kurde męczę się i męczę, pomocy ....