- One mobilszolgáltatások
- Milyen okostelefont vegyek?
- Amazfit Active 2 NFC - jó kör
- Fotók, videók mobillal
- Samsung Galaxy A36 5G - a középső testvér
- Samsung Galaxy Watch4 és Watch4 Classic - próbawearzió
- Apple iPhone 15 - a bevált módszer
- Android alkalmazások - szoftver kibeszélő topik
- Három Pixel 9 jött Magyarországra
- Xiaomi Mi 11 Ultra - Circus Maximus
Ú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.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
Nekem a 70millió soros táblával volt bajom
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?!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
- Filmvilág
- Villanyszerelés
- Autós topik
- Sugárhajtómű ihlette a Zalman CPU-hűtőjét, de nem az üzemzaj tekintetében
- Gaming notebook topik
- E-roller topik
- NTFS, exFAT, FAT32 – Melyiket válaszd és miért?
- The Crew sorozat
- RC modell földön, vízen, levegőben
- Motorolaj, hajtóműolaj, hűtőfolyadék, adalékok és szűrők topikja
- További aktív témák...
- Intel Core i7 6700K / GTX 1660TI / 16GB DDR4 RAM / 500 GB SSD konfig eladó
- Samsung Galaxy S23 128GB, Kártyafüggetlen, 1 Év Garanciával
- Samsung Galaxy A53 5G 128GB, Kártyafüggetlen, 1 Év Garanciával
- Megkímélt állapotú Xbox Series X 1TB eladó. Kitisztítva és újrapasztázva!
- Gamer PC - i5 13400F, GTX 1080ti és 16gb DDR5
- Bomba ár! HP ProBook 440 G10 - i5-1335U I 16GB I 256SSD I 14" FHD I Cam I W11 I Garancia!
- Apple iPhone 14 128GB , Kártyafüggetlen
- VÉGKIÁRUSÍTÁS - REFURBISHED - Lenovo ThinkPad 40A9 docking station
- DELL Universal Dock D6000 docking station (452-BCYH) (DisplayLink)
- BESZÁMÍTÁS! ASUS B450 R7 2700X 16GB DDR4 512GB SSD RTX 2060 Super 8GB Zalman i3 FSP 600W
Állásajánlatok
Cég: Promenade Publishing House Kft.
Város: Budapest
Cég: PCMENTOR SZERVIZ KFT.
Város: Budapest