ugrás a tartalomhoz

Használtautó válogatás egyszerre több tulajdonság alapján, PHP/MySQL

Anonymous · 2006. Jan. 22. (V), 04.58
Hi!

Van egy nagyon nagy, és nagyon fontos problémám. Mégpedig: Csinálok éppen egy használtautó kereskedésnek weboldalt, és elakadtam. Mindent leírok, hogy értsetek.

Adatbázis szerkezete, ahol az autók és tulajdonságaik vannak:

Opel
----
rendszam:
tipus:
evjarat:
ajtok_szama:
motor:
futott_km:
szin:
extrak:
megteintheto:
ar:
megjegyzes:
id:
rate:
uzemanyag:
----------

Ugyan így a SUZUKI tábla, stb.
Ezt meghívom php-ban, hogy listázza ki a következő képpen:
<?php
print "<table>";
while ( $sor = mysql_fetch_row( $sql ) )
{

print "<tr>\n";
foreach ( $sor as $mezo )
print "\t<td>$mezo</td>\n";
print "</tr>\n";
}
print "</table>\n";
Ez eddig jó is...
De, azt szeretném, hogy van egy form, amin lehet szűkíteni a listát a mezők alapján (típus = Astra). A form megvan, de a feldolgozó kóddal van egy kis probléma: A form-ból kapott értékeket változókban kapja meg a script ($rendszam, $tipus stb.), és itt a probléma. Én eléggé érdekesen oldottam meg a leszűkítést, mert így eléggé hosszú lett a kód, és nem is működik rendesen, mert egyszerre több funkció alapján nem lehet szűkíteni:
<?php
if($rendszam)
{
$lekeres = "SELECT * FROM opel WHERE UPPER(rendszam) like '%$rendszam%'";
$sql = mysql_query($lekeres) or die(mysql_error());
$sor = mysql_fetch_assoc($sql);
$osszes_sor = mysql_num_rows($sql);
}

if($tipus)
{
$lekeres = "SELECT * FROM opel WHERE UPPER(tipus) like '%$tipus%'";
$sql = mysql_query($lekeres) or die(mysql_error());
$sor = mysql_fetch_assoc($sql);
$osszes_sor = mysql_num_rows($sql);
}
if($evjarat)
{
$lekeres = "SELECT * FROM opel WHERE UPPER(evjarat) like '%$evjarat%'";
$sql = mysql_query($lekeres) or die(mysql_error());
$sor = mysql_fetch_assoc($sql);
$osszes_sor = mysql_num_rows($sql);
}
// ...
// ???
Már nagyon régóta agyalok rajta, s ti vagytok az egyetlen esélyeim. Plíz help mí

A kérdés mégegyszer: Hogy tudom azt megcsinálni, hogy a form egyszeri elküldésével több input alapján tudjak szűkíteni.

Köszönöm: shraatz
 
1

<Nincs cím>

Fekete Ferenc GDA · 2006. Jan. 22. (V), 09.19
Lehet,h most kora reggel nem értem pontosan a kérdésedet (5 perce keltem:)), de ha 2 input mezőt akarsz ellenőrizni, és azzal szűkíteni, akkor miért nem úgy csinálod,h:

if ( $tipus && $evjarat )
{
   $lekeres = "SELECT * FROM opel WHERE tipus LIKE '".$tipus."' AND evjarat LIKE '".$evjarat."'";
}


a többi ugyanaz. így lekérdezi a formban megadott évjáratú típusokat.


Online 2.0
2

Tipusonkent tabla?

Jano · 2006. Jan. 22. (V), 11.02
Miert vannak tipusonként külön táblában az autók? Minden tipushoz más tulajdonságokat kell eltárolni? Ha nem, akkor az auto tipusa is lehetne egy mezo a tablaban, es akkor nem kell minden tipusra kulon tabla.
3

<Nincs cím>

Anonymous · 2006. Jan. 22. (V), 17.53
Nincs külön táblában... Van Opel tábla, suzuki tábla stb. A tipus az mező. :)
Ja és köszönöm a megoldást... PERFECT!

shraatz
4

Márka

Jano · 2006. Jan. 22. (V), 18.08
Ja igen. Akkor miért vannak márkánként külön táblában? Lehetne a márka is egy mező.
5

?

Anonymous · 2006. Jan. 22. (V), 18.30
Nem tudom, így esett kézre, és van egy funkció amiatt szükséges. Ki kell írni, hogy opelből, chevroletből, suzukiből van -e használt autó.
6

pl. autók kor szerint

Hojtsy Gábor · 2006. Jan. 22. (V), 18.33
És ha kell egy olyan funkció, hogy melyik autó milyen idős, akkor annak is lesz évenként külön tábla? Mi lesz akkor a márkánként külön táblákkal? Érdemes lenne ezen egy kicsit elgondolkodni.
7

huh

Anonymous · 2006. Jan. 22. (V), 18.53
huh. Lehet, hogy igazatok van. Gábor: Akkor mi lenne az ideális szerkezet? Amúgy ilyen funkciónál úgy gondoltam a megoldást, hogy date() fv. segítségével egyszerű matematikai művelettel kiszámítom.
8

SQL alap lecke

Jano · 2006. Jan. 22. (V), 19.05
Javaslom, hogy olvass el 1-2 alapvető SQL tutorialt, hogy képbe kerülj az SQL lehetősegeivel kapcsolatban és ne csak mint egy excel táblát tudjad használni.
9

<Nincs cím>

Anonymous · 2006. Jan. 22. (V), 19.30
Köszönöm, erre gondoltam már én is, csak most az a probléma, hogy nagyon sürget az idő. Nincs erre most lehetőségem, ezért kértem a segítségeteket. Ha van rá mód, akkor plíz help mí. Jelenlegi struktúra:

hasznaltautok = adatbázis
-------------------------

opel, suzuki, chevrolet, audi, stb. = táblák
--------------------------------------------

rendszam, tipus, evjarat, ajtok_szama, motor, futott_km, szin, extrak, megteintheto, ar, megjegyzes, id, rate, uzemanyag = mezők
----------------------------------------------------------

A mezők persze minden táblában ugyan azok.

köszönöm előre
10

így is lehet.

klimakiraly · 2006. Jan. 22. (V), 20.22
Helló!

Én is így csinálom gondolom sokan felsírnak majd. :-)
If szerkezettel összefüzöm a tulajdonságokat.
  $markanev=$_GET['markanev'];
  $marka=$_GET['marka'];
  $tipus=$_GET['tipus'];
//MÁRKA
  if (empty($marka)) {
  } else {
  if (empty($lekerdezes)) {
  $lekerdezes = "`marka` LIKE '" . $marka . "'";
  } else {
  $lekerdezes = $lekerdezes . " AND `marka` LIKE '" . $marka . "'";
  }
  }
//TÍPUS
  if (empty($tipus)) {
  } else {
  if (empty($lekerdezes)) {
  $lekerdezes = "`tipus` LIKE '" . $tipus . "'";
  } else {
  $lekerdezes = $lekerdezes . " AND `$tipus` LIKE '" . $tipus . "'";
  }
  }

$eredmemy = mysql_query("SELECT * FROM `$markanev` WHERE $lekerdezes");
12

Minek else ????

Anonymous · 2006. Jan. 22. (V), 21.08
Minek az ELSE ág????
Meg $lekerdezes = $lekerdezes." ... "; == $lekerdezes .= " ... "; így kicsit szebb.(meg nem utolsó sorban rövidebb)
Meg GET helyett inkább POST és, amúgy minek átrakni egy másik változóba???
az elgondolás jó csak meg lehet írni harmadannyi kóddal is

<?php
if (isset($_POST['marka']) AND !empty($_POST['marka']))
   $lekerdezes .= ($lekerdezes == '') ? " `marka` = ".$_POST['marka'] : " AND `marka` = '".$_POST['marka'];
if (isset($_POST['tipus']) AND !empty($_POST['tipus'])
   $lekerdezes .= ($lekerdezes == '') ? " `tipus` = ".$_POST['tipus'] : " AND `tipus` = '".$_POST['tipus'];

$sql = 'SELECT * FROM tabla WHERE'.$lekerdezes;
?>
15

implode

Jano · 2006. Jan. 23. (H), 00.11
Ha sok feltetel van akkor a soronkenti ellenorzes helyett, hogy kell-e AND-ot rakni, lehet a felteteleket egy tommre gyujteni majd implode() -ot hivni ra.

<?php
$whereAr = array();

if (isset($_POST['marka']) AND !empty($_POST['marka'])) $whereAr[] = "`marka` = '".$_POST['marka']."'";
if (isset($_POST['tipus']) AND !empty($_POST['tipus'])) $whereAr[] = "`tipus` = '".$_POST['tipus']."'";

$whereStr = implode(" AND ",$whereAr);

$sql = 'SELECT * FROM tabla WHERE'.$whereStr;

11

egy tabla

Jano · 2006. Jan. 22. (V), 20.23
Hat pedig sok idot megsporolnal, ha tudnad mik a lehetosegek. 2-3-orat szanhatsz tutorial olvasasra...

Tegyel minden egy tablaba es a marka is egy mezo legyen. Eztuan ha opeleket akarsz lekerdezni egyszeruen fuzd hozza a lekerdezeshez a markara szurest ami ebben az esetben WHERE marka = 'opel'
13

adatbázis tervezés

Anonymous · 2006. Jan. 22. (V), 21.59
Én teljesen szétszedném az egészet:

márka
-------------------
markaId auto_inc
marka varchar(120)


típus
------------------
tipusId auto_inc
tipus varchar(200)


motor
-----------------
motorId
fajta (benzin, dízel, gáz)


autok
------------------
rendszam (index)
markaId
tipusId
evjarat
ajtok_szama
motorId
futottkm
szín
ccm
megjegyzés (longtext php limit: pl 400karakter)
ar
megtekintheto


autok_extrak //kapcsolótábla
rendszam
extraId


extrak
-----------
extra varchar(255)
extraId auto_inc


remélem egyértelmű a vázlatomból, hogy mire gondoltam, sztem sokkal logikusabb, (illetve normalizált) mint amit te találtál ki. Így kereszttáblás lekérdezésekkel mindent szépen le tudsz kérdezni, esetleg az autok táblát is szétbonthatod két részre:

azokat az adatokat rakd egy táblába, amit ugyan akkor használsz
14

<Nincs cím>

Anonymous · 2006. Jan. 22. (V), 23.33
Azoknak a tablaknak amikben az id mellett csak 1 hasznos mezo van csak akkor van letjogosultsaga, ha gyakran megvaltozhat annak a tartalma es emiatt nem akarsz az egesz tablan futtatni updateket. Jelen esetben ezek teljesen feleslegesek.
16

thnx

Anonymous · 2006. Jan. 23. (H), 01.32
köszönöm az infokat. Sokat segítettek.
17

Miért?

PiG · 2006. Jan. 23. (H), 13.33
Szörnyűlködve olvastam a probléma "megoldását" (opel, suzuki külön tábla - na nee).
De:
Azoknak a tablaknak amikben az id mellett csak 1 hasznos mezo van csak akkor van letjogosultsaga, ha gyakran megvaltozhat annak a tartalma es emiatt nem akarsz az egesz tablan futtatni updateket. Jelen esetben ezek teljesen feleslegesek.

ez szöget ütött a fejembe. Miért feleslegesek?

P][G
18

másképpen nem megy

Szekeres Gergő · 2006. Jan. 23. (H), 16.41
Ez nem igaz. Gondolj bele, hogy extrákat felveszel az extra táblába

pl:

extraId extra
1 riasztó
2 cd-s rádió

viszont van egy autó, amiben mindkettő benne van, akkor csak úgy tudod beírni, hogy az auto_extra táblában létrehozod ezeket a sorokat:

rendszam extraId
aaa-001 1
aaa-001 2

Így egy sima lekédezéssel végig tudsz zongorázni a táblán, majd az extra táblából megjeleníted az extra nevét. Ha az extra nevét egyből beírnád ide, akkor redundancia lépne fel, és ha például a cd-t át akarnád írni CD-re, akkor az összes bejegyzésen végig kellene futni.

---
Könnyebb valamit jól megcsinálni, mint megmagyarázni, miért lett rossz.
19

csakugy

breakline · 2006. Jan. 26. (Cs), 00.14
Nos úgy tűnik nem tudok már érdemben hozzászólni, de azért mindenképpen szedd szét valahogy a táblákat, mert így kicsit áttekinthetőbb is lesz + keresésnél jelentősen gyorsabb.
Egyébként sztem csinálj egy külön mezőt minden autónak (mondjuk triviális, de legyen ID), talán áttekinthetőbb is lesz.

Üdv
BL