MySQL normalizacija baze podataka

poruka: 37
|
čitano: 6.968
|
moderatori: Lazarus Long, XXX-Man, vincimus
+/- sve poruke
ravni prikaz
starije poruke gore
13 godina
neaktivan
offline
MySQL normalizacija baze podataka

Pozdrav svima

 

Imam jedan problem kojem ne mogu naci rjesenje. Naime  napravio sam bazu  u MySQL-u u kojoj su pohranjeni lijekovi. tj registar lijekova. Pretrazivanje i  umetanje lijekova sam  implementirao pomocu PHP-a. Lijekova ima 728 i baza radi fantasticno ( u localhostu je) te za sada nemam namjere da je stavljam na web itd. Posto je registar bio samo u stampanoj formi ovaj mi je "programcic" ubrzao pretrazivanje i propisivanje recepata itd.

 

Sad problem. Sama baza se sastoji od jedne tabele u kojoj se  nalazi abededni redoslijed lijeka, glavna grupa lijeka ,podgrupa lijeka itd. Htio sam da napravim prakticnije bazu te da izdvojim sve komponente koje se ponavljaju vise puta. Znaci napravio sam  6 tabela. Svaka se sastoji od ID-a i npr abecedni_redoslijed itd. Svih 5 tabela povezano je sa foreign key-ovima na "glavnu tabelu" lijekovi . Umetanje lijekova sada ide po tipu da unosim naziv lijeka,indikacije itd a iz padajuceg menija izaberem abecedni redoslijed,grupu lijekova itd. To sve fino radi.

 

Problem se nalazi u pretrazivanju. Posto sam do sada pretrazivanje implementirao pomocu jedne tabele i  select * from lijekovi where ".$searchtype." like '%".$searchterm."%. Znaci imam HTML formu u kojoj se nalazi padajuci izbornik iz kojeg izaberem abecedni redoslijed,glavna grupa lijekova itd  i polja u koje unesem pojam, nakon toga dugme trazi koje poziva result.php fajl u kojem se nalazi navedeni query. Sada mi sa tim kodom  izbaci rezultat ali naravno na mjestu gdje se nalazi abecedni redoslijed itd mi pise ID broj npr 2. 

 

Pokusao sam da povezem query pomocu LEFT JOIN-a   

 

SELECT abecedni_redoslijed_id,glavna_grupa_lijekova_id,grupa_lijekova_id,podgrupa_lijekova_id,vrsta_lijekova_id,ime_lijeka,djelovanje,indikacije,doziranje_i_nacin_primjene,kontraindikacije,nezeljeni_efekti,posebna_upozorenja,registrirani_lijekovi FROM lijekovi li

LEFT JOIN abecedni_redoslijed ab_red

ON ab_red.id=li.abecedni_redoslijed_id 

 

ali opet rezultat izbacuje sa ID brojem.

 

Problem je u prikazivanju rezultata te kako bi onda najgalantnije mogao da odaberem polje ili tabelu iz koje bi trazio rezultat .

 

Unaprijed hvala na pomoci

 
0 0 hvala 0
15 godina
odjavljen
offline
MySQL normalizacija baze podataka

Dosta si neprecizno napisao što želiš postići, koliko sam shvatio želiš queryiem izlistati zapise iz više tablica, za sada nisam imao potrebe za takvim kompleksnijim upitima, pa neznam konkretno riješenje, ali predložio bih ti da baciš oko ovdje, ako već nisi.

 

OT: Lijekovi?

 
0 0 hvala 0
14 godina
neaktivan
offline
Re: MySQL normalizacija baze podataka

Prvo krivo si to napravio ovako trebaće ti tablica sa ljekovi di će ti ići podaci o svakom ljeku al će ići ić i FK isl. Trebat će ti druga tabica npr Vrsta u koju možeš stavit analgetik, antialargenik... id (pk) ti je i FK koji je u tablici sa ljekovima na taj naćin si pojednostvanio upis jer imaš listu koji izabereš, a isto možeš i pretraživat po tome. Ako ti treba baš abecedno nemoraš to radit imaš naredbe za to u SQL-u i sama baza će ti tako izbacit podatke ako joj kažeš isto vrijedi i za razne druge prikaze podataka.

 

Dakle pogledaj kakoa sve moš sortirati podatke i di si moš olakšati unuos i kako te napravi tako bazu i relacije kasnije će je bit lakše održavat i unosit podatke.

 

Oprilike bi ja to ovako napravio tablice ljekovi, abecedni_redosljed, grupa_ljekova, vrsta-ljekova, djelovanje_ljeka, indikacije_ljeka sak i sad ih povežeš međusobo preko relaciaja. To za abecedno mu sam kažeš u queryu kad hvata podatke kak da ih ispiše to kaj su tebi podaci zbrda zdola u bazi neznaći niš ako mu kažeš da ih prikaže abecedno bude.

Poruka je uređivana zadnji put ned 22.7.2012 15:31 (NoorMomento).
13 godina
neaktivan
offline
MySQL normalizacija baze podataka

 Hvala na pomoci.

 

Ja sam vec tako napravio bazu kao sto ti  predlazes.Znaci imam "glavnu " tabelu koja se zove lijekovi. Neka polja u njoj su kao sto je glavna_grupa_lijekova_id itd povezana sa foreign key-ovima sa tabelom glavna_grupa_lijekova. Znaci sve glavne grupe podgrupe itd ubacujem u tabele posebno napravljene za njih. Kad unosim npr novi lijek unosim ime lijeka,indikacije,kontraindikacije  itd. a iz padajuceg izbornika povlacim iz  baze vec prije  pohranjene glavna grupa itd. Znaci u tabeli lijekovi u phpmyadminu mi se nalazi na mjestu glavne grupe lijekova npr 1, podgrupa lijekova npr 12 i onda ide ime lijeka itd.

 

Problem je sa querijem kojim bi pri pretrazi umjesto da mi izbaci sad na polju grupa lijekova 1 izbacio naziv koji se nalazi  u tabeli glavna_grupa_lijekova.

 

Prilikom rangiranja pretrage znaci u kojim poljima da trazi pojam npr glavna grupa lijekova i unesem pojam da se automatski poveze sa npr glavna grupa lijekova  jer sad sa ovim querijem koji sa napisao prije ako upisem ime lijeka i odaberem da pretrazuje po  imenu lijeka izbaci rezultat , ali ako krenem pretrazivati po npr glavna grupa lijekova  nece naci rezultat jer u tabeli lijekovi koja je glavna na mjestu glavna_grupa_lijekova_id pise npr 1. 

 

 

Sto se tice abecednog pretrazivanja znam da moze da se pretrazuje  abecedno ali evo u cemu je problem. Sam registar je podijeljen po sustavima organa i sad npr kaze krv i krvotvorni organi trebalo bi da bude pod K slovom ali  ono se nalazi pod B jer u registru je to pod Blood tj krv jer svi su izrazi tj glavne grupe engleski napisane.

 

 

Nadam se da sam sada objasnio problem.

 
0 0 hvala 0
14 godina
neaktivan
offline
Re: MySQL normalizacija baze podataka

dodaj tablicu abecedno koja se satoji od id-abecedno, abeceda, dakle ima polja kolko ti treba u abecedi i povežeš je relaciono sa ljekom i vršiš pretraživanje po njoj i ako si stavio k onda je K a usput ih moš i dalje slagat abecedno.

13 godina
neaktivan
offline
Re: MySQL normalizacija baze podataka

Uradio sam ja i to ali problem je znaci kako da povezem tablice sa  tablicom lijekovi.Napravio sam ja foreign key (sve radi fino pri ubacivanju lijekovia) ali mi treba query koji bi povezao  sadrzaj jedne tablice sa poljem u tablici lijekovi. Gledao sam full join, inner join,left join ali nikako ne mogu da nakacim sve tablice  na  ID polja u  tablici lijekovi.

15 godina
odjavljen
offline
Re: MySQL normalizacija baze podataka
Myro1 kaže...

Uradio sam ja i to ali problem je znaci kako da povezem tablice sa  tablicom lijekovi.Napravio sam ja foreign key (sve radi fino pri ubacivanju lijekovia) ali mi treba query koji bi povezao  sadrzaj jedne tablice sa poljem u tablici lijekovi. Gledao sam full join, inner join,left join ali nikako ne mogu da nakacim sve tablice  na  ID polja u  tablici lijekovi.

A da fino pukneš ER dijagram ili još bolje cijeli SQL file negdje ako nije problem zbog podataka? Recimo da imaš strukturu podataka jednaku u obadvije tablice mogao bi to napraviti sa UNION statementom, ali čisto sumnjam, negdje griješiš sa JOIN-om.

16 godina
offline
Re: MySQL normalizacija baze podataka

SELECT ime.lijekovi, naziv.podvrsta

FROM lijekovi

INNER JOIN podvrsta

ON podvrsta_id.lijekovi = id.podvrsta;

 

Izgled tablice lijekovi

 

__________________

id | ime | podvrsta_id|

1|aspirin | 3

2|andol| 1

__________________

 

Izgled tablice podvrsta

 

____________________

id | naziv

1| dobar

2| još bolji

3| odličan

___________________

You can patch technical vulnerabilities as they evolve, but there is no patch for stupidity, or rather gullibility. - Kevin Mitnick
13 godina
neaktivan
offline
MySQL normalizacija baze podataka

Evo cijele baze 

 

######################################

#create abecedni_redoslijed table

######################################

 

CREATE TABLE abecedni_redoslijed (

  id int(11) NOT NULL PRIMARY KEY AUTO_INCREMENT,

  abecedni_redoslijed varchar(255) NOT NULL

 

 );

 

######################################

#create glavna_grupa_lijekova table

######################################

 

CREATE TABLE glavna_grupa_lijekova (

  id int(11) NOT NULL PRIMARY KEY AUTO_INCREMENT,

  glavna_grupa_lijekova varchar(255) NOT NULL

 

 ); 

 

######################################

#create  grupa_lijekova table

######################################

 

CREATE TABLE grupa_lijekova (

  id int(11) NOT NULL PRIMARY KEY AUTO_INCREMENT,

  grupa_lijekova varchar(255) NOT NULL

 

 );

 

######################################

#create podgrupa_lijekova table

######################################

 

CREATE TABLE podgrupa_lijekova (

  id int(11) NOT NULL PRIMARY KEY AUTO_INCREMENT,

  podgrupa_lijekova varchar(255) NOT NULL

 

 );

 

######################################

#create vrsta_lijekova table

######################################

 

CREATE TABLE vrsta_lijekova (

  id int(11) NOT NULL PRIMARY KEY AUTO_INCREMENT,

  vrsta_lijekova varchar(255) NOT NULL

 

);  

 

######################################

#create lijekovi table

######################################

 

CREATE TABLE lijekovi (

  id int(11) NOT NULL PRIMARY KEY AUTO_INCREMENT,

  abecedni_redoslijed_id int(11)NOT NULL,

  glavna_grupa_lijekova_id int(11)NOT NULL,

  grupa_lijekova_id int(11)NOT NULL,

  podgrupa_lijekova_id int(11)NOT NULL,

  vrsta_lijekova_id int(11)NOT NULL,

  ime_lijeka varchar(255)NOT NULL,

  djelovanje text NOT NULL,

  indikacije text NOT NULL,

  doziranje_i_nacin_primjene text NOT NULL,

  kontraindikacije  text NOT NULL,

  nezeljeni_efekti text NOT NULL,

  posebna_upozorenja text NOT NULL,

  registrirani_lijekovi text NOT NULL

 

);

Svaka tabela povezana je sa tabelom lijekovi preko FK (ovo je sql faj koji nema na sebi FK vec kad importujem bazu preko phpmyadmina  napravim FK) na svoje polje .  Znaci problem mi je sto ne znam kako pri pretrazi da povuce rezultate iz izdvojenih tabela  u odgovarajuca  polja u tabeli lijekovi.

 
0 0 hvala 0
16 godina
offline
Re: MySQL normalizacija baze podataka
Myro1 kaže...

SELECT abecedni_redoslijed_id,glavna_grupa_lijekova_id,grupa_lijekova_id,podgrupa_lijekova_id,vrsta_lijekova_id,ime_lijeka,djelovanje,indikacije,doziranje_i_nacin_primjene,kontraindikacije,nezeljeni_efekti,posebna_upozorenja,registrirani_lijekovi FROM lijekovi li

LEFT JOIN abecedni_redoslijed ab_red

ON ab_red.id=li.abecedni_redoslijed_id 

 

Bukva kaže...

SELECT ime.lijekovi, naziv.podvrsta

FROM lijekovi

INNER JOIN podvrsta

ON podvrsta_id.lijekovi = id.podvrsta;

Pa naravno da ti izbaci IDeve kad njih selektaš, ne ono što hoćeš.

 

SELECTom uzmeš podatke koje hoćeš viewati, a sve kasnije je ili filtriranje ili manipulacija nad tom (SELECT-RESULT, privremena interna) tablicom.

Ova tablica abecedni_red ti nije potrebna. Jednostavno ideš ORDER BY.

 

Primjerice

SELECT ime.lijekovi, naziv.podvrsta

FROM lijekovi

INNER JOIN podvrsta

ON podvrsta_id.likovi = id.podvrsta

ORDER BY ime.lijekovi ASC;

You can patch technical vulnerabilities as they evolve, but there is no patch for stupidity, or rather gullibility. - Kevin Mitnick
17 godina
offline
Re: MySQL normalizacija baze podataka

SELECT a.glavna_grupa_lijekova, b.grupa_lijekova, c.vrsta_lijekova, d.indikacije, d.posebna_upozorenja

 

FROM glavna_grupa_lijekova a, grupa_lijekova b, vrsta_lijekova c, lijekovi d

 

WHERE a.glavna_grupa_lijekova_id = d.glavna_grupa_lijekova_id

AND b.grupa_lijekova_id = d.grupa_lijekova_id

AND c.vrsta_lijekova_id = d.vrsta_lijekova_id

 

 

U SELECTu ispišeš što želiš da ti prikaže (znači sve nazive, bez ID-ova), u FROM iz kojih sve tablica (zato su i prefiksi tamo da se zna gdje šta spada (a.neki_naziv), a u WHERE uvjetu povežeš sve PK iz drugih tablica koje si koristio sa onom glavnom (lijekovi) preko ID-a.

Mislim da bi ovako trebalo raditi, nisam isprobavao.

'Dvije su stvari beskonačne - svemir i ljudska glupost. Za svemir nisam siguran' - Einstein
13 godina
neaktivan
offline
MySQL normalizacija baze podataka

Jeste to je to .  Ovako radi

 

SELECT abecedni_redoslijed, glavna_grupa_lijekova, grupa_lijekova, podgrupa_lijekova vrsta_lijekova, ime_lijeka, djelovanje, indikacije, doziranje_i_nacin_primjene, kontraindikacije, nezeljeni_efekti, posebna_upozorenja, registrirani_lijekovi

FROM abecedni_redoslijed, glavna_grupa_lijekova, grupa_lijekova, podgrupa_lijekova, vrsta_lijekova, lijekovi

WHERE abecedni_redoslijed_id = abecedni_redoslijed_id

AND glavna_grupa_lijekova_id = glavna_grupa_lijekova_id

AND grupa_lijekova_id = grupa_lijekova_id

AND podgrupa_lijekova_id = podgrupa_lijekova_id

AND vrsta_lijekova_id = vrsta_lijekova_id

AND ime_lijeka =  'furosemid'

 

Jedino mi brka polja vrsta lijekova i podgrupa lijekova tj. prikazuje mi podatke podgrupe lijekova kao vrste lijekova dok podgrupe nemam, ali to  sam vjerovatno negdje zeznuo.

 

E sad jos jedno pitanje kod pretrage ako ukucam glavna_grupa_lijekova_ID tj. foreign polje iz tablice lijekovi i unesem pojam za pretrazivanje izbaci da nema, ali ako unesem npr 2 onda dobijem rezultat u ovisnosti sto se nalazi pod poljem 2 u glavnoj tabeli. Moze li se pomocu query-a povezati da pri pretrazi  potrazi rezultat u "glavnoj" tabeli iako se pretraga vrsi u tabeli lijekovi.

 

Jos jednom hvala na pomoci.

 
0 0 hvala 0
13 godina
neaktivan
offline
Re: MySQL normalizacija baze podataka

EDIT:

 

Sredio problem sa podgrupom lijekova.Nisam stavio zarez iza podgrupe{#}

13 godina
neaktivan
offline
Re: MySQL normalizacija baze podataka

Pozdrav svima. 

 

Kao prvo da svima zaželim sretnu Novu godinu.

 

Odavno nisam pisao nista na ovu temu, ali napokon se naslo vremena da se i ovaj moj interni projekat malo pogleda. Sto se tice ubacivanja podataka u bazu vecina stvari je rijesena. Problem predstavlja pretraga same baze. Ako krene pretraga po abecednom redu sve radi dobro. Problem se javlja kod glavne grupe lijekova itd. Najveci problem jeste kod imena lijeka. U samoj bazi se nalazi samo jedan naziv lijeka. To znaci kad pokrenem pretragu po imenu lijeka trebalo bi da rezultat bude ili jedan lijek ili obavijest da sam lijek nije nadjen u bazi. 

 

Meni izbacuje rezultat kao kombinaciju svih probnih podataka koji se sada nalaze u bazi. Taj  rezultat stvara mi problem jer nigdje ne izbacuje nikakvu gresku. Sve fino radi ali nikako da izabi podatke onako kako sam ja zamislio.

 

http://imageshack.us/photo/my-images/248/slika1w.jpg/

 

http://imageshack.us/photo/my-images/594/slika2u.jpg/

 

http://imageshack.us/photo/my-images/252/slika3aw.jpg/

 

PHP kod za pretragu

 

 

<html>

<head>

  <title>Registar lijekova 1.0.1</title>

</head>

<body>

<h1 align="center">Registar lijekova-rezultati pretrage</h1>

<?php

  // kreiranje imena varijable

 

  $searchtype=$_POST['searchtype'];

  $searchterm=trim($_POST['searchterm']);

 

  if (!$searchtype || !$searchterm) {

   echo 'Niste unijeli sve potrebne detalje.  Vratite se i pokusajte ponovo.';

   exit;

  }

 

  if (!get_magic_quotes_gpc()){

   $searchtype = addslashes($searchtype);

   $searchterm = addslashes($searchterm);

  }

 

  // konektovanje na bazu podataka

 

  @ $db = new mysqli('localhost', 'root', '', 'registar_lijekova');

 

  if (mysqli_connect_errno()) {

   echo 'Greska: Ne moze se konektovati na bazu podataka.  Molimo pokusajte kasnije.';

   exit;

  }

  // SQL upit za pretragu baze podataka

 

  $query = "SELECT abecedni_redoslijed, glavna_grupa_lijekova, grupa_lijekova, podgrupa_lijekova, vrsta_lijekova, ime_lijeka, djelovanje, indikacije, doziranje_i_nacin_primjene, kontraindikacije, nezeljeni_efekti, posebna_upozorenja, registrirani_lijekovi

       FROM abecedni_redoslijed, glavna_grupa_lijekova, grupa_lijekova, podgrupa_lijekova, vrsta_lijekova, lijekovi

       WHERE abecedni_redoslijed_id = abecedni_redoslijed_id

       AND glavna_grupa_lijekova_id = glavna_grupa_lijekova_id

       AND grupa_lijekova_id = grupa_lijekova_id

       AND podgrupa_lijekova_id = podgrupa_lijekova_id

       AND vrsta_lijekova_id = vrsta_lijekova_id

       AND ".$searchtype." like '%".$searchterm ."%'";

 

  $result = $db->query($query);

 

  $num_results = $result->num_rows;

 

  echo "<p>Broj nadjenih lijekova: ".$num_results."</p>";

 

  for ($i=0; $i <$num_results; $i++) {

    $row = $result->fetch_assoc();

   echo "<p><strong>".($i+1).". Abecedni redoslijed lijekova: ";

   echo htmlspecialchars(stripslashes($row['abecedni_redoslijed']));

   echo "</strong><br />Glavna grupa lijekova: ";

   echo stripslashes($row['glavna_grupa_lijekova']);

   echo "</strong><br /> Grupa lijekova: ";

   echo stripslashes($row['grupa_lijekova']);

  echo "</br />Podgrupa lijekova: ";

   echo stripslashes($row['podgrupa_lijekova']);

  echo "</br />Vrsta lijeka: ";

   echo stripslashes($row['vrsta_lijekova']);

  echo "</br />Ime lijeka: ";

   echo stripslashes($row['ime_lijeka']);

  echo "</br />Djelovanje: ";

   echo stripslashes($row['djelovanje']);

  echo "</br />Indikacije: ";

   echo stripslashes($row['indikacije']);

  echo "</br />Doziranje i nacin primjene: ";

   echo stripslashes($row['doziranje_i_nacin_primjene']);

  echo "</br />Kontraindikacije: ";

   echo stripslashes($row['kontraindikacije']);

  echo "</br />Nezeljeni efekti: ";

   echo stripslashes($row['nezeljeni_efekti']);

  echo "</br />Posebna upozorenja: ";

   echo stripslashes($row['posebna_upozorenja']);

   echo "<br />Registrirani lijekovi: ";

   echo stripslashes($row['registrirani_lijekovi']);

   echo "</p>";

  }

 

  $result->free();

  $db->close();

 

?>

</body>

</html>

 

 

Unaprijed hvala  na pomoci i savjetu.

 

16 godina
neaktivan
offline
MySQL normalizacija baze podataka

Jednostavno ispisi da nisi nista nasao kad je broj rezultata 0 ($num_results) nije praksa da sql upiti vracaju greske ako nema rezultata.

LIKE %ni% ce ti matchati sve stringove koje sadrze "ni", posta zelis uvijek samo jedan rezultat to ti nece raditi dobro.

Mozes limitirati broj rezultata sa LIMIT, medutim ne rade se pretrage tako, pogotovo ako trazis po nazivu uvijek je dobra sansa da ces imati vise rezultata.

 

btw. slike su ti premale, nista se ne vidi.

All problems in computer science can be solved by another level of indirection
Poruka je uređivana zadnji put pet 4.1.2013 13:22 (drnde).
 
0 0 hvala 0
13 godina
neaktivan
offline
Re: MySQL normalizacija baze podataka

Hvala na odgovoru.

 

Sta je prijedlog koji bi pomogao pri pretrazi. Ovaj PHP kod je kod koji sam koristio kad je postojala samo jedna tabela u bazi. Na prijedlog sam napravio vise tabela međusobno povezanih sa foreign key-ovima. Tako da bude lakše popravljanje, tj ubacivanje novih lijekova. Sama aplikacija se nalazi u localhostu i sluzi samo kao pomoc meni.

 

Aplikacija treba da pretrazuje i izbacuje više rezultata a ne samo jedan. Jedan rezultat treba da bude VECINOM samo kada izaberem pretragu po nazivu lijeka. Aplikacija se sastoji od HTML koda koji  nakon unošenja naziva,grupe itd i odabira načina pretraživanja povlači PHP kod koji sam vec prije stavio.

 

HTML kod

 

<html>

<head>

  <title>Registar lijekova 1.0.1</title>

</head>

 

<body>

  <h1 align="center">Registar lijekova-pretraga</h1>

 

<form action="results.php" method="post">

   <div align="center">

    <p>Izaberite grupu pretrazivanja:<br />

    <select name="searchtype">

    <option value="abecedni_redoslijed">Abecedni redoslijed lijekova

     <option value="glavna_grupa_lijekova">Glavna grupa lijekova

      <option value="grupa_lijekova">Grupa lijekova

      <option value="podgrupa_lijekova">Podgrupa lijekova

      <option value="vrsta_lijekova">Vrsta lijeka

      <option value="ime_lijeka">Ime lijeka

      <option value="djelovanje">Djelovanje

      <option value="indikacije">Indikacije

      <option value="doziranje_i_nacin_primjene">Doziranje i nacin primjene

      <option value="kontraindikacije">Kontraindikacije

      <option value="nezeljeni_efekti">Nezeljeni efekti

      <option value="posebna_upozorenja">Posebna upozorenja

      <option value="registrirani_lijekovi">Registrirani lijekovi

    </select>

     </p>

    <p>&nbsp;</p>

    <p>Unesite termin za pretrazivanje:<br />

     <input name="searchterm" type="text" size="40">

     </p>

    <p><br />

     <input type="submit" name="submit" value="Pretraga">

      <label>

      <input type="reset" name="Izbrisi pretragu" id="button" value="Izbrisi pretragu">

      </label>

    </p>

  </div>

</form>

 

</body>

</html>

 

Hvala na savjetima.

16 godina
neaktivan
offline
MySQL normalizacija baze podataka

Problem je gotovo definitivno u tome sto koristis like %[nesto]%, uostalom ti nece sigurno raditi za sve tipove pretrage posto ako npr. trazis lijek s grupom 1 ce matchati i 31, 61, ... znaci sve brojeve koje sadrze 1.

Kad vec ubacujes searchtype i searchterm u string mozes napraviti vise razlicitih stringova za ovo i samo ih dodati na glavni upit.

 

http://pastebin.com/ghSEhMRb

All problems in computer science can be solved by another level of indirection
Poruka je uređivana zadnji put sub 5.1.2013 9:37 (drnde).
 
0 0 hvala 0
13 godina
neaktivan
offline
Re: MySQL normalizacija baze podataka

Hvala na pomoci. 

 

Imam problem sa dijelom stringa koji je napisan. Izbacuje mi gresku Trying to get property of non-object in line 66 kao i Call to a member function free() on a non-object in line 101. Sad vjerovatno negdje grijesim ili nisam dobro umetnuo kod. Kad u string ne ubacim abecedni redoslijed ili  neku drugu tabelu onda mi radi dobro ali ako pokusam pretragu sa poljem koje sam ubacio u string onda mi javlja gresku.

 

<html>

<head>

  <title>Registar lijekova 1.0.1</title>

</head>

<body>

<h1 align="center">Registar lijekova-rezultati pretrage</h1>

<?php

  // kreiranje imena varijable

  $searchtype=$_POST['searchtype'];

  $searchterm=trim($_POST['searchterm']);

  if (!$searchtype || !$searchterm) {

   echo 'Niste unijeli sve potrebne detalje.  Vratite se i pokusajte ponovo.';

   exit;

  }

  if (!get_magic_quotes_gpc()){

   $searchtype = addslashes($searchtype);

   $searchterm = addslashes($searchterm);

  }

 

  // konektovanje na bazu podataka

  @ $db = new mysqli('localhost', 'root', '', 'registar_lijekova');

  if (mysqli_connect_errno()) {

   echo 'Greska: Ne moze se konektovati na bazu podataka.  Molimo pokusajte kasnije.';

   exit;

  }

  // SQL upit za pretragu baze podataka

  $query = "SELECT abecedni_redoslijed, glavna_grupa_lijekova, grupa_lijekova, podgrupa_lijekova, vrsta_lijekova, ime_lijeka, djelovanje, indikacije, doziranje_i_nacin_primjene, kontraindikacije, nezeljeni_efekti, posebna_upozorenja, registrirani_lijekovi

       FROM abecedni_redoslijed, glavna_grupa_lijekova, grupa_lijekova, podgrupa_lijekova, vrsta_lijekova, lijekovi

       WHERE abecedni_redoslijed_id = abecedni_redoslijed_id

       AND glavna_grupa_lijekova_id = glavna_grupa_lijekova_id

       AND grupa_lijekova_id = grupa_lijekova_id

       AND podgrupa_lijekova_id = podgrupa_lijekova_id

       AND vrsta_lijekova_id = vrsta_lijekova_id

       AND ".$searchtype." like '%".$searchterm ."%'" ;

  $searchstring = "";

 switch($searchtype){

 case 'abecedni_redoslijed':

 case 'glavna_grupa_lijekova':

 case 'grupa_lijekova':

 case 'podgrupa_lijekova':

 case 'vrsta_lijekova':

 case 'vrsta_lijekova':

$searchstring = "AND $searchtype = $searchterm";

 break;

 case 'ime_lijeka':

 case 'djelovanje':

 case 'indikacije':

 case 'doziranje_i_nacin_primjene':

 case 'kontraindikacije':

 case 'nezeljeni_efekti':

 case 'posebna_upozorenja':

 case 'registrirani_lijekovi':

  $searchstring = "AND $searchtype LIKE %$searchterm%";

}

$query .= $searchstring;

$result = $db->query($query);

$num_results = $result->num_rows;

  echo "<p>Broj nadjenih lijekova: ".$num_results."</p>";

 

  for ($i=0; $i <$num_results; $i++) {

    $row = $result->fetch_assoc();

   echo "<p><strong>".($i+1).". Abecedni redoslijed lijekova: ";

   echo htmlspecialchars(stripslashes($row['abecedni_redoslijed']));

   echo "</strong><br />Glavna grupa lijekova: ";

   echo stripslashes($row['glavna_grupa_lijekova']);

   echo "</strong><br /> Grupa lijekova: ";

   echo stripslashes($row['grupa_lijekova']);

  echo "</br />Podgrupa lijekova: ";

   echo stripslashes($row['podgrupa_lijekova']);

  echo "</br />Vrsta lijeka: ";

   echo stripslashes($row['vrsta_lijekova']);

  echo "</br />Ime lijeka: ";

   echo stripslashes($row['ime_lijeka']);

  echo "</br />Djelovanje: ";

   echo stripslashes($row['djelovanje']);

  echo "</br />Indikacije: ";

   echo stripslashes($row['indikacije']);

  echo "</br />Doziranje i nacin primjene: ";

   echo stripslashes($row['doziranje_i_nacin_primjene']);

  echo "</br />Kontraindikacije: ";

   echo stripslashes($row['kontraindikacije']);

  echo "</br />Nezeljeni efekti: ";

   echo stripslashes($row['nezeljeni_efekti']);

  echo "</br />Posebna upozorenja: ";

   echo stripslashes($row['posebna_upozorenja']);

   echo "<br />Registrirani lijekovi: ";

   echo stripslashes($row['registrirani_lijekovi']);

   echo "</p>";

  }

  $result->free();

  $db->close();

?>

</body>

</html>

 

Jos jednom hvala na pomoći.

 

 

16 godina
neaktivan
offline
MySQL normalizacija baze podataka

Nije prosao upit pa ti je $result FALSE, vjerovatno zato sto nisi stavio navodnike oko vrijednosti u ovom kodu sto si preuzeo od mene.

 

Mozda ovako radi, medutim nisam isprobavao.

http://pastebin.com/1YwFcTJX

 

ps. malo sam ti smanjio broj "echo-a", nisam se mogao suzdrzati Osmijeh

All problems in computer science can be solved by another level of indirection
Poruka je uređivana zadnji put pon 7.1.2013 16:14 (drnde).
 
1 0 hvala 0
13 godina
neaktivan
offline
Re: MySQL normalizacija baze podataka

Nece pa nece. Sada mi izbacuje sql error.

 

Hvala na upornoj pomoci.

Poruka je uređivana zadnji put pon 7.1.2013 17:57 (Myro1).
16 godina
neaktivan
offline
Re: MySQL normalizacija baze podataka
Myro1 kaže...

Nece pa nece. Sada mi izbauje sql error.

 

Hvala na upornoj pomoci.

To sam ja stavio da ispise ako pukne Namigiva.

 

Daj samo ispisi $query string (mozes i sa echo) pa ga pejstaj tu ili na pastebin.com, pa ti vidim sta ne valja.

Ispisi ga taman prije linije:

 

 

if($result===false){

 die ("Sql error");

}

 

 

Ili cak ga mozes staviti kao die($query) umjesto "SQL error".

All problems in computer science can be solved by another level of indirection
Poruka je uređivana zadnji put pon 7.1.2013 18:01 (drnde).
13 godina
neaktivan
offline
Re: MySQL normalizacija baze podataka

 

 Evo ovo je cijeli query do sql error-a. 

 

$query = "SELECT abecedni_redoslijed, glavna_grupa_lijekova, grupa_lijekova, podgrupa_lijekova, vrsta_lijekova, ime_lijeka, djelovanje, indikacije, doziranje_i_nacin_primjene, kontraindikacije, nezeljeni_efekti, posebna_upozorenja, registrirani_lijekovi

    FROM abecedni_redoslijed, glavna_grupa_lijekova, grupa_lijekova, podgrupa_lijekova, vrsta_lijekova, lijekovi

    WHERE abecedni_redoslijed_id = abecedni_redoslijed_id

    AND glavna_grupa_lijekova_id = glavna_grupa_lijekova_id

    AND grupa_lijekova_id = grupa_lijekova_id

    AND podgrupa_lijekova_id = podgrupa_lijekova_id

    AND vrsta_lijekova_id = vrsta_lijekova_id";

 

 $searchstring = "";

 switch($searchtype){

 case 'abecedni_redoslijed':

 case 'glavna_grupa_lijekova':

 case 'grupa_lijekova':

 case 'podgrupa_lijekova':

 case 'vrsta_lijekova':

 case 'vrsta_lijekova':

   $searchstring = "AND $searchtype = '$searchterm'";

   break;

 case 'ime_lijeka':

 case 'djelovanje':

 case 'indikacije':

 case 'doziranje_i_nacin_primjene':

 case 'kontraindikacije':

 case 'nezeljeni_efekti':

 case 'posebna_upozorenja':

 case 'registrirani_lijekovi':

   $searchstring = "AND $searchtype LIKE '%$searchterm%'";

   break;

}

$query .= $searchstring;

$result = $db->query($query);

if($result===false){

 die ("Sql error");

}

 

 

Hvala

 

P.S

 

Sada vidim 2 puta je ponovljeno vrsta_lijekova ali to nije razlog pucanja.

Poruka je uređivana zadnji put pon 7.1.2013 22:58 (Myro1).
16 godina
neaktivan
offline
MySQL normalizacija baze podataka

Mislim sadrzaj stringa $query, sto dobijes kad ispises echo $query;

All problems in computer science can be solved by another level of indirection
 
0 0 hvala 0
13 godina
neaktivan
offline
Re: MySQL normalizacija baze podataka

 

Ako sam dobro uradio i ispisao echo $query;  prije 

 

if($result===false){

 die ("Sql error");

}

 

izbaci mi

 

SELECT abecedni_redoslijed, glavna_grupa_lijekova, grupa_lijekova, podgrupa_lijekova, vrsta_lijekova, ime_lijeka, djelovanje, indikacije, doziranje_i_nacin_primjene, kontraindikacije, nezeljeni_efekti, posebna_upozorenja, registrirani_lijekovi FROM abecedni_redoslijed, glavna_grupa_lijekova, grupa_lijekova, podgrupa_lijekova, vrsta_lijekova, lijekovi WHERE abecedni_redoslijed_id = abecedni_redoslijed_id AND glavna_grupa_lijekova_id = glavna_grupa_lijekova_id AND grupa_lijekova_id = grupa_lijekova_id AND podgrupa_lijekova_id = podgrupa_lijekova_id AND vrsta_lijekova_id = vrsta_lijekova_idAND abecedni_redoslijed = 'A'Sql error

 

 

ali ocito izbacuje zbog echo-a. Nisam dobro nesto uradio.

 

Poruka je uređivana zadnji put uto 8.1.2013 0:02 (Myro1).
16 godina
neaktivan
offline
MySQL normalizacija baze podataka

Fali razmak prije AND unutar $searchstring, samo ubaci razmak na pocetak.

All problems in computer science can be solved by another level of indirection
 
0 0 hvala 0
13 godina
neaktivan
offline
Re: MySQL normalizacija baze podataka

HVALA

 

PRORADILO ali problem i dalje postoji.

 

Ako krenem da pretrazujem sam result.php mi vrača kombinaciju podataka iz baze.

 

Npr. za abecedni redoslijed imam slova A,B,C i D u bazi. Ako ja potrazim po slovu A izbaci mi rezultat  ovaj.

 

Broj nadjenih lijekova: 6

 

1Abecedni redoslijed lijekova: A

Glavna grupa lijekova: A03B Alkaloidi beladone i derivati, monokomponentni preparati

Grupa lijekova: nema

Podgrupa lijekova: A03BB Polusintetski alkaloidi beladone, kvaternerna amonijum jedinjenja

Vrsta lijeka: paracetamol

Ime lijeka: furosemid

Djelovanje: nema

Indikacije: nema

Doziranje i nacin primjene: malo promuckati i popiti

Kontraindikacije: nema

Nezeljeni efekti: nauzeja

Posebna upozorenja: nema

Registrirani lijekovi: nema

 

2Abecedni redoslijed lijekova: A

Glavna grupa lijekova: metabolicki lijekovi

Grupa lijekova: nema

Podgrupa lijekova: A03BB Polusintetski alkaloidi beladone, kvaternerna amonijum jedinjenja

Vrsta lijeka: paracetamol

Ime lijeka: furosemid

Djelovanje: nema

Indikacije: nema

Doziranje i nacin primjene: malo promuckati i popiti

Kontraindikacije: nema

Nezeljeni efekti: nauzeja

Posebna upozorenja: nema

Registrirani lijekovi: nema

 

3Abecedni redoslijed lijekova: A

Glavna grupa lijekova: A03B Alkaloidi beladone i derivati, monokomponentni preparati

Grupa lijekova: nema

Podgrupa lijekova: A03BB Polusintetski alkaloidi beladone, kvaternerna amonijum jedinjenja

Vrsta lijeka: paracetamol

Ime lijeka: nikotin

Djelovanje: B receptori

Indikacije: nema

Doziranje i nacin primjene: nema

Kontraindikacije: nema

Nezeljeni efekti: povracanje

Posebna upozorenja: nema

Registrirani lijekovi: nema

 

4Abecedni redoslijed lijekova: A

Glavna grupa lijekova: metabolicki lijekovi

Grupa lijekova: nema

Podgrupa lijekova: A03BB Polusintetski alkaloidi beladone, kvaternerna amonijum jedinjenja

Vrsta lijeka: paracetamol

Ime lijeka: nikotin

Djelovanje: B receptori

Indikacije: nema

Doziranje i nacin primjene: nema

Kontraindikacije: nema

Nezeljeni efekti: povracanje

Posebna upozorenja: nema

Registrirani lijekovi: nema

 

5Abecedni redoslijed lijekova: A

Glavna grupa lijekova: A03B Alkaloidi beladone i derivati, monokomponentni preparati

Grupa lijekova: nema

Podgrupa lijekova: A03BB Polusintetski alkaloidi beladone, kvaternerna amonijum jedinjenja

Vrsta lijeka: paracetamol

Ime lijeka: aspirin

Djelovanje: nema

Indikacije: mucnina

Doziranje i nacin primjene: 0,1ml u 500ml vode

Kontraindikacije: nema

Nezeljeni efekti: vrtoglavica

Posebna upozorenja: nema

Registrirani lijekovi: nema

 

6Abecedni redoslijed lijekova: A

Glavna grupa lijekova: metabolicki lijekovi

Grupa lijekova: nema

Podgrupa lijekova: A03BB Polusintetski alkaloidi beladone, kvaternerna amonijum jedinjenja

Vrsta lijeka: paracetamol

Ime lijeka: aspirin

Djelovanje: nema

Indikacije: mucnina

Doziranje i nacin primjene: 0,1ml u 500ml vode

Kontraindikacije: nema

Nezeljeni efekti: vrtoglavica

Posebna upozorenja: nema

Registrirani lijekovi: nema

 

U bazi mi  od ukupno 3  probna lijeka koja se nalaze ni jedan nije pod slovom A. To znaci da bi sada trebalo da izbaci da nema nadjenih lijekova. Ali result.php sam vrši odabir unutar tabele lijekovi.

 

Ako unesem pretragu po imenu lijeka npr. furosemid koji je u bazi 1 od ukupno 3 lijeka u tabeli lijekovi izbaci mi slijedeče.

 

 

Broj nadjenih lijekova: 8

 

1Abecedni redoslijed lijekova: A

Glavna grupa lijekova: A03B Alkaloidi beladone i derivati, monokomponentni preparati

Grupa lijekova: nema

Podgrupa lijekova: A03BB Polusintetski alkaloidi beladone, kvaternerna amonijum jedinjenja

Vrsta lijeka: paracetamol

Ime lijeka: furosemid

Djelovanje: nema

Indikacije: nema

Doziranje i nacin primjene: malo promuckati i popiti

Kontraindikacije: nema

Nezeljeni efekti: nauzeja

Posebna upozorenja: nema

Registrirani lijekovi: nema

 

2Abecedni redoslijed lijekova: A

Glavna grupa lijekova: metabolicki lijekovi

Grupa lijekova: nema

Podgrupa lijekova: A03BB Polusintetski alkaloidi beladone, kvaternerna amonijum jedinjenja

Vrsta lijeka: paracetamol

Ime lijeka: furosemid

Djelovanje: nema

Indikacije: nema

Doziranje i nacin primjene: malo promuckati i popiti

Kontraindikacije: nema

Nezeljeni efekti: nauzeja

Posebna upozorenja: nema

Registrirani lijekovi: nema

 

3Abecedni redoslijed lijekova: B

Glavna grupa lijekova: A03B Alkaloidi beladone i derivati, monokomponentni preparati

Grupa lijekova: nema

Podgrupa lijekova: A03BB Polusintetski alkaloidi beladone, kvaternerna amonijum jedinjenja

Vrsta lijeka: paracetamol

Ime lijeka: furosemid

Djelovanje: nema

Indikacije: nema

Doziranje i nacin primjene: malo promuckati i popiti

Kontraindikacije: nema

Nezeljeni efekti: nauzeja

Posebna upozorenja: nema

Registrirani lijekovi: nema

 

4Abecedni redoslijed lijekova: B

Glavna grupa lijekova: metabolicki lijekovi

Grupa lijekova: nema

Podgrupa lijekova: A03BB Polusintetski alkaloidi beladone, kvaternerna amonijum jedinjenja

Vrsta lijeka: paracetamol

Ime lijeka: furosemid

Djelovanje: nema

Indikacije: nema

Doziranje i nacin primjene: malo promuckati i popiti

Kontraindikacije: nema

Nezeljeni efekti: nauzeja

Posebna upozorenja: nema

Registrirani lijekovi: nema

 

5Abecedni redoslijed lijekova: C

Glavna grupa lijekova: A03B Alkaloidi beladone i derivati, monokomponentni preparati

Grupa lijekova: nema

Podgrupa lijekova: A03BB Polusintetski alkaloidi beladone, kvaternerna amonijum jedinjenja

Vrsta lijeka: paracetamol

Ime lijeka: furosemid

Djelovanje: nema

Indikacije: nema

Doziranje i nacin primjene: malo promuckati i popiti

Kontraindikacije: nema

Nezeljeni efekti: nauzeja

Posebna upozorenja: nema

Registrirani lijekovi: nema

 

6Abecedni redoslijed lijekova: C

Glavna grupa lijekova: metabolicki lijekovi

Grupa lijekova: nema

Podgrupa lijekova: A03BB Polusintetski alkaloidi beladone, kvaternerna amonijum jedinjenja

Vrsta lijeka: paracetamol

Ime lijeka: furosemid

Djelovanje: nema

Indikacije: nema

Doziranje i nacin primjene: malo promuckati i popiti

Kontraindikacije: nema

Nezeljeni efekti: nauzeja

Posebna upozorenja: nema

Registrirani lijekovi: nema

 

7Abecedni redoslijed lijekova: D

Glavna grupa lijekova: A03B Alkaloidi beladone i derivati, monokomponentni preparati

Grupa lijekova: nema

Podgrupa lijekova: A03BB Polusintetski alkaloidi beladone, kvaternerna amonijum jedinjenja

Vrsta lijeka: paracetamol

Ime lijeka: furosemid

Djelovanje: nema

Indikacije: nema

Doziranje i nacin primjene: malo promuckati i popiti

Kontraindikacije: nema

Nezeljeni efekti: nauzeja

Posebna upozorenja: nema

Registrirani lijekovi: nema

 

8Abecedni redoslijed lijekova: D

Glavna grupa lijekova: metabolicki lijekovi

Grupa lijekova: nema

Podgrupa lijekova: A03BB Polusintetski alkaloidi beladone, kvaternerna amonijum jedinjenja

Vrsta lijeka: paracetamol

Ime lijeka: furosemid

Djelovanje: nema

Indikacije: nema

Doziranje i nacin primjene: malo promuckati i popiti

Kontraindikacije: nema

Nezeljeni efekti: nauzeja

Posebna upozorenja: nema

Registrirani lijekovi: nema

 

Sto znaci da opet nasumicno izabire  i vrsi mix svih podataka bez obzira sto vecina podataka uopste ne pripada tom lijeku. Dok sam imao jednu tabelu i unesem ime lijeka izbaci mi iz tabele podatke samo o tom lijeku, a rezultat je 1 pronadjeni lijek.

 

Ovo je tabela lijekovi iz koje result.php povlaci podatke. U njoj se nalaze 3 lijeka a sam result izbacuje mi i po 24 rezultata tj. nadjena lijeka.

 

CREATE TABLE IF NOT EXISTS `lijekovi` (

  `ID` int(11) NOT NULL AUTO_INCREMENT,

  `abecedni_redoslijed_id` int(11) NOT NULL,

  `glavna_grupa_lijekova_id` int(11) NOT NULL,

  `grupa_lijekova_id` int(11) NOT NULL,

  `podgrupa_lijekova_id` int(11) NOT NULL,

  `vrsta_lijekova_id` int(11) NOT NULL,

  `ime_lijeka` varchar(255) NOT NULL,

  `djelovanje` text NOT NULL,

  `indikacije` text NOT NULL,

  `doziranje_i_nacin_primjene` text NOT NULL,

  `kontraindikacije` text NOT NULL,

  `nezeljeni_efekti` text NOT NULL,

  `posebna_upozorenja` text NOT NULL,

  `registrirani_lijekovi` text NOT NULL,

  PRIMARY KEY (`ID`),

  KEY `abecedni_redoslijed` (`abecedni_redoslijed_id`),

  KEY `glavna_grupa_lijekova` (`glavna_grupa_lijekova_id`),

  KEY `grupa_lijekova` (`grupa_lijekova_id`),

  KEY `podgrupa_lijekova` (`podgrupa_lijekova_id`),

  KEY `vrsta_lijekova` (`vrsta_lijekova_id`)

) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ;

 

 

INSERT INTO `lijekovi` (`ID`, `abecedni_redoslijed_id`, `glavna_grupa_lijekova_id`, `grupa_lijekova_id`, `podgrupa_lijekova_id`, `vrsta_lijekova_id`, `ime_lijeka`, `djelovanje`, `indikacije`, `doziranje_i_nacin_primjene`, `kontraindikacije`, `nezeljeni_efekti`, `posebna_upozorenja`, `registrirani_lijekovi`) VALUES

(1, 3, 1, 1, 1, 1, 'furosemid', 'nema', 'nema', 'malo promuckati i popiti', 'nema', 'nauzeja', 'nema', 'nema'),

(2, 2, 1, 1, 1, 1, 'nikotin', 'B receptori', 'nema', 'nema', 'nema', 'povracanje', 'nema', 'nema'),

(3, 4, 1, 1, 1, 1, 'aspirin', 'nema', 'mucnina', '0,1ml u 500ml vode', 'nema', 'vrtoglavica', 'nema', 'nema');

 

 

Prvi problem mi je bio da mi povuce iz odvojenih tabela podatke i da ih prirdruzi tabeli lijekovi, a drugi problem je ovaj sada. Stvarno nisam pametan kako da ovo rijesim.Nadam se da sam dobro objasnio problem.

 

Jos jednom hvala na pomoci.

16 godina
neaktivan
offline
MySQL normalizacija baze podataka

Neznam, daj eksport citave baze sa podacima da mogu pokrenuti upit, uploadaj file negdje ili pejstaj na pastebin.com, necitko je ako postas tu na forumu.

All problems in computer science can be solved by another level of indirection
 
0 0 hvala 0
13 godina
neaktivan
offline
Re: MySQL normalizacija baze podataka

Evo cijela baza sa HTML i PHP fajlom.

 

http://www.2shared.com/file/UtFo0tO8/registar_lijekova.html

 

Hvala

16 godina
neaktivan
offline
MySQL normalizacija baze podataka

Sad sam si uzeo malo vremena da pogledam sto si zapravo radio, upit ti ne valja kod uvjeta, nije isto, abecedni_redoslijed.id i abecedni_redoslided_id,

a vrijednost koju usporedujes samu sa sobom ce uvijek biti jednaka, zato ti je uvijek vracao sve lijekove.

Ovako radi: http://pastebin.com/Pc9jX6wb

 

Ubuduce mozes probati pokrenuti upite direktno nad bazom umjesto iz php-a, probaj npr. koristeci mysql workbench, javit ce ti gdje si fulao ako ima gresaka, i ispravljas upit dok ne valja.

http://www.mysql.com/products/workbench/

 

Sretno

All problems in computer science can be solved by another level of indirection
Poruka je uređivana zadnji put pet 11.1.2013 0:11 (drnde).
 
0 0 hvala 0
13 godina
neaktivan
offline
Re: MySQL normalizacija baze podataka

Puno hvala na pomoci. 

 

Sada radi. Jos moram vidjeti zasto mi ne izbacuje sve lijekove ako pokrenem pretragu po imenu lijeka. Nalazi samo nikotin ostala 2 ne.

 

Jos jednom hvala.

Nova poruka
E-mail:
Lozinka:
 
vrh stranice