Keresés

Új hozzászólás Aktív témák

  • Sk8erPeter

    nagyúr

    válasz -=Flatline=- #2134 üzenetére

    Uhh, hát ez nagyon csúnya. Egyrészt randa spagettikód, másrészt a rendkívül elavult mysql_* függvényeket használod benne PHP-ben (hivatalosan is deprecated végre, helyette pl. MySQLi-t vagy PDO-t kell használni), harmadrészt az SQL Injectionre és más aljasságok lehetővé tételére mutattál be iskolapéldát.
    (Mondjuk session_start()-ot sem látok, de feltételezem, nem a teljes kódot mutattad meg.)

    $q = $_GET['term'];
    if($q=="") return;

    honnan akarsz visszatérni? Ezt itt nem egy függvénybe raktad - vagy a kódodban mindez egy függvényben szerepel? Egyébként meg kapsz az arcodba szépen egy PHP notice-t, ha a $_GET['term'] egyáltalán nincs beállítva, szóval annak meglétét ellenőrizni kellene.
    A query-t meg prepared statementtel kellene lefuttatni (pl. itt van rá példa: http://www.php.net/manual/en/pdostatement.bindparam.php, LIKE használatánál picit csúfabb, de akkor is jobb: [link], [link], [link], ), de legalábbis ha ragaszkodsz a gagyi, elavult megoldáshoz, akkor escape-elni kellene.

    if($row['location'] == ""){}else{ ... }
    ez is meglehetősen érdekesen néz ki...

    Ha kódot másolsz be, akkor azután jelöld ki, és kattints a "Programkód" gombra, azért van! :)

  • -=Flatline=-

    tag

    válasz -=Flatline=- #2133 üzenetére

    Addig baszogattatok (jó értelemben), míg inkább megcsináltam. Nem teljes még és nem a legelegánsabb, de megy :) Már csak az a kérdés, hogy tudom priorizálni azt, hogy mindig az aktuális session grp legyen a kiemelt ORDER BY és csak utána legyen a normál group szerinti rendezés? (Ergó az épp szerkesztendő anyag találatai kapjanak prioritást, utána jöhet a minden egyéb...) Plusz ugye itt még sehol sem a LINKDATA linkké formázott módon kerül vissza az adat, abban tuti kell majd a segítségetek, ha felébredtetek. Köszönöm :)

    mysql_connect ($db_host, $db_user, $db_pass) or die ('Could not connect to the database.');
    mysql_selectdb ($db_database) or die ('Could not select database.');
    $_SESSION['grp']=1; //teszt erejeig
    $q = $_GET['term'];
    if($q=="") return;
    $lolz = array();

    $query = "SELECT * FROM autocompletedb WHERE (`location` LIKE '{$q}%' OR `character` LIKE '{$q}%' OR `item` LIKE '{$q}%' OR `music` LIKE '{$q}%') && `group` = '{$_SESSION['grp']}' ORDER BY 'group' LIMIT 30";

    $resultset = mysql_query($query);
    $lolz = array();

    while( $row = mysql_fetch_assoc($resultset) ) {
    if($row['location'] == ""){}else{
    $lolz[] = $row['location'] . " - " . $row['groupname'];}

    if($row['character'] == ""){}else{
    $lolz[] = $row['character'] . " - " . $row['groupname'];}

    if($row['item'] == ""){}else{
    $lolz[] = $row['item'] . " - " . $row['groupname'];}

    if($row['music'] == ""){}else{
    $lolz[] = $row['music'] . " - " . $row['groupname'];}

    }

    echo json_encode($lolz);
    ?>

  • Sk8erPeter

    nagyúr

    válasz -=Flatline=- #2128 üzenetére

    "Az totál jogos kérdés, hogy miért jobb nekem, ha két közepes méretű adatbázis lesz betöltve, nem pedig egy nagy, de vezéreljenek mondjuk magasztos átláthatósági szempontok :)"
    Rossz megközelítés. Neked nem kell olvasgatnod az adatbázist, ne azt akard átlátni, legfeljebb a struktúráját alakítsd ki értelemszerűen. Jó esetben nem közvetlenül az adatbázisban fogsz kotorászni, hanem készítesz egy megfelelő UI-t arra, hogy szűrni lehessen az adatbázisban tárolt adatokra. Az tök más kérdés, hogy kezelhető legyen, az adatok megfelelően legyenek normalizálva, legyenek szétbontva logikusan a táblák, majd a lekérdezéskor legyenek jól összekapcsolva. A 78 ezer mező meg aztán végképp nem érv, hogy szétbontsd, az a mennyiség jól indexelt táblák és normálisan megírt lekérdezések esetén tényleg semmi egy mai átlagos adatbázismotornak, másodpercnek pici törtrésze alatt lehet ennyi adat közt keresni.

    "78ezer rekordos már így is ami van és 15 mezőt tartalmaznak. Húzós dolgozni vele, ezt kell az upgradekor szétbontanom és, ha már itt tartunk, próbálnám egyszerűsíteni a júzer dolgát."
    Hogy a júzernek mennyire van egyszerűsítve a dolga, ahhoz aztán abszolúte SEMMI köze annak, hogy az adattáblákba mennyi rekord van feltöltve, és a háttérben lévő adatbázis+táblák milyen struktúrájúak. :N Attól még lehet nagyon felhasználóbarát egy felület, hogy a háttérben lévő adatbázisszerkezet egy fostalicska, és fordítva is igaz lehet, ha rosszul csinálják.
    A 15 mezőn mondjuk érdemes lehet elgondolkodni, kell-e, hogy mindegyik azonos táblában legyen, vagy érdemes inkább szétbontani, majd lekérdezéskor összekapcsolni (normalizálás).

    Egyébként ha ilyen bonyolultan fogalmazod meg a kérdést, akkor elmehet sokaknak a kedve, stackoverflow-n sem sokan tolongtak, pedig azért ott szoktak lenni válaszok, szerintem a "Complex autocomplete query" sem túl jó címválasztás, nem érzem igazán komplexnek a feladatodat (bár így fél 3-kor nem sokat fogtam fel belőle, mert annyira cifráztad, különösebben nem is gondolkoztam rajta), mégis elrettentő lehet a cím; valamint egy szemléltető ábra, a form megmutatása, valami tök egyértelmű rávezetés olykor többet mond minden szónál.

  • Jim-Y

    veterán

    válasz -=Flatline=- #2128 üzenetére

    Csak szerinted sok az a 78K, én melóban örülök ha ilyennel kell dolgoznom, mert azon értelmes időben lefutnak a query-k :D Nekem a 70millió soros táblával volt bajom :P

    Na, így már jobban értem a problémát. Nos, én először valamilyen formában eltárolnám még kliens oldalon, hogy melyik filmet szerkeszti, majd a leendő query-be ezt feltételnek írnám (nyílván ha úgy áll a kapcsoló). Tegyük fel BögyösMaca karakterére keresne a cikk közben, elkezdi gépelni, hogy 'Bögy' majd megáll
    -3 karakter megvolt, vársz 2 másodpercet, hogy folytatja-e a gépelést, ha nem, akkor mehet az ajax, mégpedig úgy, hogy az ajax data mezőjében elküldöd a Bögy stringet, és, hogy épp mi az aktív film, pl:

    $.ajax({
    ..
    data: {
    phrase: "Bögy",
    active: "Titanic",
    amikellmég: "azmegyide"
    }
    ..
    });

    Ezt szerveroldalon feldolgozod, és csinálsz belőle egy hozzá passzoló query-t
    SELECT * FROM Filmek WHERE title = 'Titanic' AND (szereplő LIKE ' %Bögy%' OR másikszereplo LIKE '%Bögy%' stb...);

    Visszakapsz x sort mondjuk, azt feldolgozod szerveroldalon encodolod json-be, és visszaküldöd a kliensnek.
    Kliensoldalon egyrész listázod autocomplettel a találatokat valamilyen emészthető formában, hogy az író ki tudja választani, hogy melyik érdekli, melyiket akarja beszúrni, majd megnyomja a gombot.

    Ekkor te visszakeresed az ajax eredménytömbjében ugyanazt az elemet, csinálsz belőle egy linket és beszúrod a kívánt helyre.

    Ne haragudj, hogy nem írok konkrét dolgokat, de még mindig nem látom, hogy hol akadtál el a dologban :(

  • Jim-Y

    veterán

    válasz -=Flatline=- #2124 üzenetére

    Én már magát a feladatot nem értem, lehet én nem vagyok így este elég türelmes, de nem sikerült leszűrnöm, hogy tulajdonképpen hol is akadtál el az autocomplete-ban.

    Egy adatbázisban kereső autocomplete példa úgy néz ki, hogy:
    - van egy input text meződ, a felhasználó elkezd írni valamit, mondjuk 'cha', itt lekezeled, hogy hány karakter után, vagy milyen esemény hatására történjen keresés az adatbázisban, mondjuk 3 karater után keresel, tehát ha beírta a user, hogy cha akkor lesz egy ajaxod, ami az adatbázisban keres. Hogy egy táblában, vagy többen azt te döntöd el, és te írod meg.
    - lesz ugye egy ajaxod, ami visszadja a query eredményét, az esetedben mondjuk egy tömböt négy értékkel CharacterA, CharacterA, CharacterB, CharacterB (meg kell jegyeznem, már az sem tiszta, hogy itt miért szerepel 2x minden?! :D megvan, de én ezt alapból szűrném már szerveroldalon)
    - megvan a keresés eredménye, az inputmeződre rákötöd az autocomplete bővítményt, és megadod neki resource-nak a fenti tömböt.
    - meg mondjuk van egy gombod, ami miután behelyettesítetted az input fieldbe, hogy mondjuk CharacterA, indít egy újabb ajax kérést, de már ezt a 'CharacterA'-t küldöd a szervernek.

    Látszik, hogy elég sok helyen dolgozhatsz az adattal, először amikor kiszeded az input mező értékét, majd mielőtt az első ajaxnál elküldöd, hogy 'cha' a szervernek, majd az erre érkező választ is szerkesztheted ahogy akarod stb...

    Melyik lépésben akadtál el?

  • martonx

    veterán

    válasz -=Flatline=- #2124 üzenetére

    Ez igazán nem tűnik vészesnek. Viszont marhára nem érek rá megcsinálni neked :(
    Ha nagyon nem menne, vagy nagyon nem találnál senkit, akkor esetleg keress meg, legrosszabb esetben tudok javasolni mást magam helyett.

Új hozzászólás Aktív témák

Hirdetés