Topic: php ir mysql paieska

Sveiki.

Turiu lentele kurioje yra daleiskim 3 stulpeliai

| miestas | tipas | aprasymas |

paieska vygdau is triju kintamuju.
Pirmi du kintamieji miestas ir tipas yra svarbiausi, taigi
Galiu daryti paieska su daug if daleiskim

paleidziu cikla  ir tikrinu
jei miestas ir tipas ivesti
     tada antras ciklas
           kuris tikrina ar is gautu rezultatu atitinka ir aprasymas.
           jei aprasymas atitinka tada
           echo miestas tipas aprasymas.

antra ifu ir ciklu kombinacija :)
jeigu miestas ivestas o !tipas neivestas
vel leidziu panase ciklu ir ifu kombinacija

3 if ir ciklu kombinacija
jeigu !miesta neivestas o tipas == kazkam
  ~ir vel kazka darau~

4 if ir ciklu kombinacija
Jei aprasymas ivestas o !miestas ir !tipas ne

Nu jei butu tik 3 kintamieji tai ma ji perkunai nesukciau cia jums galvos :) bet veliau ju gali buti ir daugiau. 5 ir 6 :) tai ka tada. x5 lapai kodo?

Re: php ir mysql paieska

x5 lapai kodo? <- cia visas klausimas?

3 (edited by xeranas 2011-01-30 11:03:54)

Re: php ir mysql paieska

Turbūt nelabai supratau ko klausei, bet mysql'e rezultatams filtruoti yra naudojamas "WHERE" jei reikia pagal kelis laukus filtruoti naudoji "AND".. Nereikia 5x kodo.. Ir kam tie skirtingi ciklai jei skirsis tik mysql užklausą?

No warning? No action? I hate this situation!

Re: php ir mysql paieska

AND gali buti nadinga einu paskaitysiu apie ji

5 (edited by qutwala 2011-01-30 16:01:26)

Re: php ir mysql paieska

Che, aš irgi prie paieškos dabar dirbu. :D
1) $_POST duomenys.:
Yra:

$kazkas = $_POST['kazkas'];
$kazkas2 = $_POST['kazkas2'];
$kazkas3 = $_POST['kazkas3'];

Prafiltravus viską dėjau į vieną masyvą:

$query[] .= prafiltruotas($kazkas);
$query[] .= prafiltruotas($kazkas2);
$query[] .= prafiltruotas($kazkas3);

Toliau tikrinimas ar kas nors iš vis suvedė duomenis, jei taip vykdome mysql užklausą jei ne...taip ne. :)

$TRUE = TRUE; // TRUE
if (current($is_empty)) { // suvesti duomenys - TRUE
foreach ($query AS $value) { 
$and[] = ' AND '; //AND masyvas deti i uzklausa
$query__[] = $value; // $query masyvo reiksmes
}
$count = count($and) - 1; // count'as turi būti visuomet mažesnis vienetu, kad užklausa nesibaigtų "AND" (sintaksės klaida)
if(isset($and[$count])) { // elementarus tikrinimas
$and[$count] = ' '; // paskutinį AND prilyginam tuščiam string tipui, nes jeigu darysi "unset" tuomet viskas griūs, prarasi vieną reikšmę iš $_POST masyvo.
}
while ($TRUE){ // Kai kintamasis TRUE yra TRUE
$select[] .= current($query__) . current($and); //rikiuojame M1 C1 M2, t.y. : $_POST AND $_POST..
if (!next($query__) || !next ($and)) //tikrinimas ar bėra masyve reikšmių
$TRUE = false; // jeigu tikrinimas FALSE stabdome ciklą
}
$select = 'SELECT * FROM lentele WHERE '.implode('', $select); // masyvą verčiame į STRING
}else{
//error_report i sablona, kad paieskos uzklausa tuscia galima ir paprasciau su siuo: if(!current($query)) { //klaida, kad tuscia uzklausa} //vykdome toliau koda
}

Visa to rezultatas pagal mano POST masyvą:

SELECT * FROM lentele WHERE Gender LIKE '%Male%' AND Height >= '%165%' OR Height <= '%175%' AND Hair_Lenght LIKE '%Short%' AND Hair_Color LIKE '%Black%'

The end. :)

P.S. žinoma, būtų faina jeigu mūsų forumo kolegos duotų kažkokių patarimų, nes manau, kad galima ir optimaliau ar ne?. :)

Re: php ir mysql paieska

array(); visada buvo tamsus miskas. Jo veikimo principas ir panadojimas.

Re: php ir mysql paieska

Tokiu atveju nevargčiau su bandymais kažką iš kažko išvartyti, nes visi $_POST, $_GET ir ... taip pat yra masyvai, jau nekalbant apie mysql resursus. :)
Nesuprasdamas jų visur matysi tik tamsų mišką. :)
O kas konkrečiai tau neaišku juose? :)

Re: php ir mysql paieska

kiek įdėjai pastangų, kad nebūtų miško?

Kiek maigyklių sudėvėjai ?

9 (edited by Donatas 2011-01-30 19:38:09)

Re: php ir mysql paieska

na gerai bandau aiskintis qutwala parasyta skriptuka, jeigu ka nupezesiu mazu kas nors pataisys ir paaiskins kame kampas.
Pirmame stulpeli visus post duomenis paverciam i kintamuosius
antram sukurem masyva $query[0] => $kazkas, $query[1] => $kazkas2, $query[2] => $kazkas3

tuomet kintamaji $TRUE uzsetinu teigemai reiksmiai.

$TRUE = TRUE; // TRUE

su $is_empty neaisku cia kodo truksta bet kiek suprantu tikrina ar masyve dabartinis kintamasis yra uzsetintas

if (current($is_empty)) {

cia kiekviena $query reiksme is masyvo prilyginama $value reiksmei nu pvz query[1]=value[1]

foreach ($query AS $value) {

uzsetina nauja masyva su reiksme ' AND ' kad veliau vygdant duomenu bazes uzklausa kiekviena paieskos dali atskirtu zodziu AND.
ir jei gerai suprantu kaip tik priskire $value reiksme taip $and[] masyvas padideja vienu AND

$and[] = ' AND '; //AND masyvas deti i uzklausa

cia sito nelabaisuprantu kam tie '__'

$query__[] = $value;

suskiciuoja kiek is viso and[] turi uzsetintu reiksmiu atima 1 kad neperdaug AND pridetu. Siuo atveju turim 3 reiksmes tai padaro 2

$count = count($and) - 1;

patikrinam kiek supratau ar uzsetinta reiksme and[2]?

if(isset($and[$count])) {

ir ta paskutine and[] reiksme pakeicia vietoje AND zodzio ' ' tarpuka

$and[$count] = ' ';

paleidziame cikla kol $TRUE nebus False tol ciklas suksis ratu.

while ($TRUE){

paleidziam nauja masyva $select kur sujungemiame $query__ ir $and i viena

$select[] .= current($query__) . current($and);

tikrina jei bent vieno masyvo pasibaigs reiksmes tada $TRUE nustatys false ir ciklas bus nutrauktas

if (!next($query__) || !next ($and))
$TRUE = false; // jeigu tikrinimas FALSE stabdome ciklą

o implode dar nezinau ka daro reikes paskaityt bet logiskai mastant  sudes i selecta visas reiksmes

$select = 'SELECT * FROM lentele WHERE '.implode('', $select);

tik cia klaida ar as kazko nezinau pas qutwala

while ($TRUE){ // Kai kintamasis TRUE yra TRUE
$select[] .= current($query__) . current($and); //rikiuojame M1 C1 M2, t.y. : $_POST AND $_POST..
if (!next($query__) || !next ($and)) //tikrinimas ar bėra masyve reikšmių
$TRUE = false; // jeigu tikrinimas FALSE stabdome ciklą
}
$select = 'SELECT * FROM lentele WHERE '.implode('', $select); // masyvą verčiame į STRING
}else{
//error_report i sablona, kad paieskos uzklausa tuscia galima ir paprasciau su siuo: if(!current($query)) { //klaida, kad tuscia uzklausa} //vykdome toliau koda
}

while { atsidaro
if (kazkas) {<-- neatsidaro
$TRUE = false;
}<-- uzdaro tai cia uzdaro ka while ?
toliau kodas

na sedejau ir logiskai masciau ir stai ka ismasciau :) mazu po biski pradesiu suprast masyvu nauda ir ju panaudojima...

Re: php ir mysql paieska

Na taip, čia kadangi nuo savo kodo iškirpta tai nepataisiau. Tas $is_empty turėtų būti visas jau prafiltruotas $_POST masyvas, tai šiuo atveju čia turėtų būt $query. :)
šaunu, kad gaudais. :)
$query__[]  - naujas tiesiog kintamasis. žinoma viską galima kišti per vieną, bet čia paskubomis viską rašiau principe, kad viskas veiktų, o tik vėliau optimizuoju.
Tas tikrinimas tiesiog, kad nemestų klaidos, o  and[2] priklauso nuo pačio $count, jei $count = 5; tai and[4] kurį patikrina ar toks iš vis yra masyve. Tiesiog, kad nebūtų offset'o.
O implode tiesiog iš masyvo padaro STRING tipą, kadangi užklausai reikia STRING tipo tai verčiame į string. Plačiau gali paskaityt čia: http://www.w3schools.com/php/func_string_implode.asp

Struktūra:

$TRUE = TRUE; 
if (current($is_empty))     { 
foreach ($query AS $value) { 

}

}
while ($TRUE){ 

        }
    }else{

}

Per daug vienu skliaustu papaišiau. :))
šiaip patarčiau naudot Notepad++ labai geras daiktas, matai kur kas baigias. :)

šaunu, kažką pradedi suprast ir nežiūri į viską aklai bei neklausi "kodėl" neveikia, o pats stengies nagrinėtis. :)

11 (edited by Donatas 2011-01-30 20:14:01)

Re: php ir mysql paieska

Tokiu atveju nevargčiau su bandymais kažką iš kažko išvartyti, nes visi $_POST, $_GET ir ... taip pat yra masyvai, jau nekalbant apie mysql resursus. :)
Nesuprasdamas jų visur matysi tik tamsų mišką. :)
O kas konkrečiai tau neaišku juose? :)

kaip veikia post/get ar mysql aisku tik va array panaudojima ir pritaikyma praktiskai pirma kart pamaciau.
Man kitaip mokintis sunku manual galiu skaityt kad ir 10 kart kol praktiskai nepamatau veikimo budo tol pats kazko nesukursiu.
Dar jau turiu praktini pavyzdi daugmas issiaiskinau veikimo principa galiu koreguoti pagal save pradet:)

kiek įdėjai pastangų, kad nebūtų miško?

Idejau nemazai ir dar dedu :)

12 (edited by qutwala 2011-01-30 20:18:50)

Re: php ir mysql paieska

Donatas wrote:

Tokiu atveju nevargčiau su bandymais kažką iš kažko išvartyti, nes visi $_POST, $_GET ir ... taip pat yra masyvai, jau nekalbant apie mysql resursus. :)
Nesuprasdamas jų visur matysi tik tamsų mišką. :)
O kas konkrečiai tau neaišku juose? :)

kaip veikia post/get ar mysql aisku tik va array panaudojima ir pritaikyma praktiskai pirma kart pamaciau.
Man kitaip mokintis sunku manual galiu skaityt kad ir 10 kart kol praktiskai nepamatau veikimo budo tol pats kazko nesukursiu.

kiek įdėjai pastangų, kad nebūtų miško?

Idejau nemazai ir dar dedu :)

Praktika - geriausias mokytojas jeigu šioje žinoma remiesi ir gauta teorija. O skaitydamas vien sausą teoriją nieko iš to neišgausi doro, nes tuoj atsiras visokių fint'ų apie kuriuos manual'e ne bus užsiimta. Tad reiktų šiuos abu dalykus derinti.:)
Kitu atveju tai tik pilstymas iš tuščio į kiaurą, savo bei kitų laiko gaišimas.
Su masyvas daug tų pavyzdžių yra, tik čia į temą kažkaip pataikiau ir tiek.

O su mysql viskas aišku, nes jau gauni STRING tipą ir nereikia daugiau sukti galvos kai tiesiogiai išvedinėji duomenis. :)

Re: php ir mysql paieska

o ne lengviau

// irasom kokiu formos lauku mums reikes
$fields = array ('Pavadinimas', 'tipas', 'miestas')
//Cia laikinai laykysim salygas
$conditions = array ();

foreach ($fields as $field) {
   //patikrinam ar toks kintamasis paduotas, vei yra ilgesinis nei 2 ženklai
   if (is_set($_POST[$field]) AND strlen(trim($_POST[$field]))>1){
      // Pridedam papildomą salygą, tik prima išvalom
      $conditions[] = " `$field` = '".ISVALOM($_POST[$field])."' ";
   }
}

$sql = "SELECT * FROM abc WHERE ".implode ("AND", $conditions);

o su current() ir pan funckiju naudojimu, kažkokių ne tų pavyzdžių prisižiūrėjot.

Be to rankiniu būdu skripte daugiau nei vieną kartą naudoti labai retai yra teisingas sprendimas.

o čia
$TRUE = false; // jeigu tikrinimas FALSE stabdome ciklą
apskritai logikos nėra. Teisybė == melas :D:D:D

14 (edited by Donatas 2011-01-30 21:43:11)

Re: php ir mysql paieska

Lukas wrote:

o ne lengviau

 $conditions[] = " `$field` = '".ISVALOM($_POST[$field])."' ";

Tos vietos kur isvalom tai nesupratau ka ir kuom valom ir del ko :)
cia kaip ir panaudojam funkcija isvalom kuri patikrina ar ivestas textas nera mum kenksmingas?

Re: php ir mysql paieska

na Qutvala ir tau isejo i nauda parodzius savo paieskos skripta cia Luko pavyzdys tikrai labiau optimizuotas

16 (edited by qutwala 2011-01-30 22:36:21)

Re: php ir mysql paieska

Na aš tikrai nesidedu žiniuoniu ar panašiai, tuolab neiteigiau, kad mano variantas yra pats geriausias. :)
Kaip tik šaunu, kad yra kas pataiso, pakritikuoja ir pakomentuoja.
Gyveni ir mokais, dėkui Lukai. :)

P.S. ten kur jeigu f-ja FALSE tai biškį nusišnekėjau. :D
Ne editor'iuje rašiau komentarus tai matyt ir privėliau. :)


Donatas, taip.

Re: php ir mysql paieska

if ($miestas !== '0' || $sktipas !== '0' || $_POST[aprasymas]) {
        $fields = array ('sktipas', 'miestas', 'aprasymas');
        $conditions = array ();

        foreach ($fields as $field) {
               if ( isset($_POST[$field]) && strlen(trim($_POST[$field]))>1){
              $conditions[] = " $field LIKE '%".$_POST[$field]."%' ";
               }
        }
        $sql = "SELECT * FROM $mdbced4 WHERE ".implode ("AND", $conditions);
                
        $query = mysql_query($sql) or die (mysql_error());    
        $num = mysql_num_rows($query) or die (mysql_error());

        for ($i=0; $i<$num; $i++) {
          $eile = mysql_fetch_array($query) or die (mysql_error());
        
        echo $eile[aprasymas];
}

Na stai kaip ir veikia paieska, bet tik ivedu kazka tai ko nera duomenu bazeja, kai $num = 0 puslapis tarsi pastringa net nebaige atvaizduoti viso likusio tinklalapio dizaino.  Klaidos nemeta jokios. Kodel taip?
Jei atsakymu yra is duomenu bazes viskas chiki o jei nera stringa.

Re: php ir mysql paieska

Donatas wrote:

Na stai kaip ir veikia paieska, bet tik ivedu kazka tai ko nera duomenu bazeja, kai $num = 0 puslapis tarsi pastringa net nebaige atvaizduoti viso likusio tinklalapio dizaino.  Klaidos nemeta jokios. Kodel taip?
Jei atsakymu yra is duomenu bazes viskas chiki o jei nera stringa.

Na turėtum atidžiau pastudijuoti, kaip veikia šita eilutė:

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

Re: php ir mysql paieska

minde wrote:
Donatas wrote:

Na stai kaip ir veikia paieska, bet tik ivedu kazka tai ko nera duomenu bazeja, kai $num = 0 puslapis tarsi pastringa net nebaige atvaizduoti viso likusio tinklalapio dizaino.  Klaidos nemeta jokios. Kodel taip?
Jei atsakymu yra is duomenu bazes viskas chiki o jei nera stringa.

Na turėtum atidžiau pastudijuoti, kaip veikia šita eilutė:

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

Ka tas for ciklas daro as zinau nera ka jame studijuoti.
Net jei ta for cikla isimu, o vietoje jo po '
$num = mysql_num_rows($query) or die (mysql_error());
ivedu eilute
echo '1111111111';
Serveris neatvaizduoja nei klaidos nei 111111111

20 (edited by Donatas 2011-01-31 12:49:49)

Re: php ir mysql paieska

<?php
echo'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb';
$mhost   = "localhost";
$muser   = "********";
$mpass   = "********"; 
$mdb     = "********";
$mdbced4 = "straipsniai";

        
            $db = mysql_connect("$mhost","$muser","$mpass") or die (mysql_error()); 
            mysql_query("SET NAMES 'utf8'") or die(mysql_error());
            mysql_select_db($mdb, $db) or die (mysql_error());


$srch="%rublis%";
$query = mysql_query("SELECT * FROM $mdbced4 WHERE sktipas LIKE '$srch' ") or die (mysql_error());
$num = mysql_num_rows($query) or die (mysql_error());
echo 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa';
?>

rublis zodzio duomenu bazeja nera, raides bbbbbb atvaizduoja o aaaaaa nea :) kame kampkas visas sitas reikalas talpinamas i nauja faila.