- Milyen notebookot vegyek?
- Mini-ITX
- Plazma TV topic
- nVidia GeForce GTX 1660 / GTX 1660 Super / GTX 1660Ti (TU116)
- Milyen házat vegyek?
- NVIDIA GeForce RTX 3060 Ti / 3070 / 3070 Ti (GA104)
- Kormányok / autós szimulátorok topicja
- AMD K6-III, és minden ami RETRO - Oldschool tuning
- Milyen monitort vegyek?
- VR topik (Oculus Rift, stb.)
Hirdetés
-
Az olcsóbb szegmens felé fordul az Apple virtuális szemüvegével
ph A Vision Pro még többet tudó, még drágább Pro 2 utóda helyett inkább valami olcsóbb variánst tervez piacra dobni az Apple.
-
Crash Bandicoot N-Sane Trilogy - Túl a 20 millión
gp A készítők a minap bejelentették, hogy egy fontos eladási mérföldkövet léptek át.
-
Kihajtható támasszal és nyolc hangszóróval szerelt tablet a Lenovótól
ma Bemutatkozott a Lenovo Tab Plus, egy különleges szórakoztatórendszerrel ellátott táblagép.
Új hozzászólás Aktív témák
-
urandom0
senior tag
válasz lanszelot #21593 üzenetére
Meglepődnék, ha működne. A komolyabb szolgáltatók, amik elvárják a normálisan kitöltött DKIM, DMARC és SPF rekordokat, úgy fogják visszadobni az e-mailed, hogy max egy pár soros debug hibaüzenetet fogsz kapni. A Gmail-es, Outlookos és hasonló, normális szolgáltatókat használó ismerőseid sosem fogják megkapni az üzeneteid.
-
urandom0
senior tag
válasz lanszelot #21609 üzenetére
Nem működik másként, csak kicsit rosszul mutatja.
Első körben ugye bepipálta mind a négyet, elküldte, oké.
Következő körben nem volt bepipálva semmi, mégis kiírta, hogy pizza.
Következő körben azt, hogy hamburger, és így tovább... miért?Azért, mert valójában nem 'Küldés' gombra kattintott, hanem csak refreshelt. Mi történik akkor, ha refreshel? Hát az, hogy a böngésző újra küldi a POST-ot, benne a négy bepipált mező értékével.
Próbáld ki te is, bepipálod mind a négyet, küldésre kattinttassz, majd nyomsz egy Ctrl-R-t.
A böngésző figyelmeztet, hogy újra fogja küldeni a kérést. A videóban viszont a VS code ezt elintézi a háttérben, és nincs figyelmeztetés, de a POST kérés (benne a négy bepipált mező értékével) újra elmegy, ugyanúgy, mint ha kézzel refresheltél volna.[ Szerkesztve ]
-
urandom0
senior tag
válasz lanszelot #21615 üzenetére
De neki miért működik úgy?
Miért, neki működik úgy? Te látsz olyan időpillanatot a videón, amikor kitöltetlen adatokkal küldi el a formot? Mert én nem.
header()
függvény hívása előtt nem lehet olyan függvény, ami olyan kimentet ad, ami nem HTTP fejléc. Ebbe beleértendő a dokumentumban lévő HTML kód is.
Tehát a kód, amit #21613-ba bemásoltál, nem fog működni. Ott pontosan azért hivatkozik a 4-es sorra, mert ott kimenet van, és onnantól fogva, hogy a header() előtt kimenet van, a header() nem fog működni.
Vagy javítsatok ki, ha tévednék, de szerintem lehetetlen, hogy működjön az a kód.Itt a logoutnál mi történik pontosan? Kiírja a username-t és a passwordöt, és utána mi történik?
szerk: amúgy annak mi értelme, hogy kiírja a username-t és a passwordöt, és azonnal átirányít?
[ Szerkesztve ]
-
urandom0
senior tag
válasz lanszelot #21622 üzenetére
amúgy annak mi értelme, hogy kiírja a username-t és a passwordöt, és azonnal átirányít?
Ez a kérdésem hülyeség volt, utólag már láttam, mindegy...
Nincs fent valahol az egész tutorial, Githubon vagy bárhol?
Én nem hiszem el, hogy be lenne kapcsolva nála az output buffering. Egy tutorial videóban nagyon nem kéne ezt bekapcsolgatni, lévén megváltoztatja a kód működését, s tanuló meg csak néz, ha neki nem működik az, ami a videóban igen.
-
urandom0
senior tag
válasz lanszelot #21627 üzenetére
Mi az hogy kimenet?
Ha készítesz egy HTML dokumentumot, ami abban van, az a kimenet. Ha statikus HTML van benne, akkor az, ha PHP kód, akkor a PHP által generált végeredmény.
Plusz a HTTP fejlécek.Hova megy ki?
Abba az irányba, ahonnan a HTTP kérés jött. Általában egy böngészőtől jön a HTTP lekérés, tehát amit te a böngészőben látsz, az a kimenet.
Mi küldi ki?
A webszerver (ami a te esetedben az Apache).
[ Szerkesztve ]
-
urandom0
senior tag
válasz lanszelot #21632 üzenetére
Hello
Abban tárolod az adatokat, amiben akarod. Ha közvetlenül valamilyen fájlban szeretnéd tárolni őket, azt úgy hívják, flat file database. Erre számos megoldás van, a JSON fájl is egy a sok közül, de van XML alapú, van CSV alapú, van bináris (Berkeley DB), stb.
Én viszont a jó öreg SQL híve vagyok, mert ez ACID-képes, mert könnyű benne keresni, könnyű rendezni, könnyen lehet szelektálni, stb., és mert mindenféle varázslás nélkül, natívan támogatja a PHP.
Az adatvesztés ellen pedig szintén a jó öreg napi szintű mentést javaslom. Nem kell nagy dologra gondolni, akár PHP-ban is írhatsz egy scriptet, ami vagy cronnal időzítve, vagy akár kézzel indítva, naponta lementegeti az adatbázis tartalmát.
-
urandom0
senior tag
válasz lanszelot #21636 üzenetére
Azért azt nem hiszem, hogy PHP-s SQL videotutorialból ne lenne annyi, mint égen a csillag
Ha csak annyit be Youtube-ra, hogy "php sql", akkor is kidob jópárat...A XAMPP miért kizárt? Kezdő szinten szerintem teljesen jó, még egyetemeken is használják. A XAMPP feluete ugye így néz ki: https://phpgurukul.com/wp-content/uploads/2023/02/xampp-control-panel-1.png
Ha zöld a MySQL, akkor fut, és onnantól már csak csatlakozni kell hozzá. Ez egy parancs PHP-ban:
$mysqli = mysqli_connect('localhost', 'my_user', 'my_password', 'my_db');
És utána lehet query-t indítani:
$result = $mysqli->query("SELECT Name, CountryCode FROM City ORDER BY ID LIMIT 3");
És utána ki lehet szedni a végeredményt:
$rows = $result->fetch_all(MYSQLI_ASSOC);
Ha ez megvan, akkor már van egy működő lekérdezésed (persze, az adatokat előtte fel kell vinni, de arra is lehet írni lekérdezést, illetve ott a Workbench, HeidiSQL, PhpMyAdmin, stb.).
Az más kérdés, hogy ez így messze nem tökéletes, mert több sebből is vérzik. De az alapjai akkor is ezek.
Aztán persze meg kell ismerni legalább alapszinten az SQL-t, és el kell gondolkodni azon, hogy inkább prepared statement-eket használjunk, mysqli helyett esetleg PDO-t, aztán lehet tovább menni ha akarsz, valamilyen ORM irányába (Doctrine, Eloquent), stb.Ha csak hobbi szinten érdekel, akkor szerintem olyan mélyen nem kell belemenni, inkább arra kell figyelni, hogy a karakterkódolást mindig állítsd be, és a biztonságra kell törekedni (escapelés, stb.).
-
urandom0
senior tag
válasz lanszelot #21639 üzenetére
Én egyet se találok. Mindegyik annyi, hogy username, pasword, registration. És itt megáll.
Ha ezeket megcsinálod, és megérted a logikáját, akkor már bonyolultabb táblákat is össze tudsz rakni.
A W3C SQL tutorialja egész jó, és nem hiszem, hogy abban el fogsz veszni. És bőven benne van minden, ami neked kell.
De ha neked ez a JSON jobban fekszik, akkor nézhetsz valamilyen NoSQL tutorialt PHP-hoz, csak abból fele annyit nem fogsz találni, mint MySQL-ből.
Azt aláírom, hogy ilyen jellegű receptek tárolásához nem az SQL a legalkalmasabb választás, de meg lehet benne csinálni. -
urandom0
senior tag
válasz lanszelot #21641 üzenetére
De, kiderül, csak kissé felületesen állsz hozzá. Ha átrágod magad a tutorialon, kipróbálod a benne leírtakat, eljutsz legalább a join-ig, akkor már lesz elképzelésed róla, hogy kell felépíteni egy receptes appot.
Egyébként nem lehet több mélységű táblát csinálni.Most így hirtelen azt mondanám, kell egy tábla az összetevőknek, ebben lennének olyanok, mint a tojás, a tej, a vaj, stb. Kell egy tábla az mennyiségi egységeknek (db, dkg, ek, dl, stb.), egy tábla az olyan entitásoknak, mint a tészta, öntet, díszités, stb., és egy a recepteknek.
A receptek táblában id alapján lehetne hivatkoznni a tésztára, öntetre, díszítésre, ugye ezek lennének egy külön táblában, és azokhoz lennének hivatkozva az összetevők. Az összetevőknél a mennyiség számértékként szerepelhetne (vagy szövegesen, mert előfordulhat olyan, hogy "annyit cukrot tegyünk bele, amíg elég édes nem lesz", és akkor ez már nem egy egzakt mennyiség, amit lehet számszerűsíteni, hanem ez szöveg), a mennyiségi egység pedig hivatkozva a mennyiségi egység táblából. Az elkészítés, előkészítés pedig a receptek tábla egy-egy szöveges mezője.Nehéz jól összerakni egy ilyet, és ezért is írtam, hogy nem az SQL a legalkalmasabb erre.
Illetve ennél, amit leírtam, lehet egyszerűbben is, pl. a mennyiség egységek nem külön táblából, hanem "1dkg cukor" aztán kész. -
urandom0
senior tag
válasz lanszelot #21643 üzenetére
De, használható. Miből szűrted le, hogy nem használható? Én csak azt írtam, hogy nem a legalkalmasabb, meg hogy elég bonyolult.
Maradhatsz a JSON-nál, erre a célra végső soron az is megfelel. Csak tisztában kell lenni a hátrányaival.
A keresés, szűrés mennyire hatékony JSON esetében? Hogy oldod meg egyáltalán, berántod az egészet a memóriába, és átalakítod valamilyen PHP-s formátumra (egymásba ágyazott asszociatív tömbök)? Ha nagyra nő a fájlod, nem fogsz-e belefutni a PHP-nak kiosztott memória- vagy futásidő korlátba (amin ugye nem tudsz változtatni, mivel nem saját szerverről fut az app)? Vagy ha esetleg ketten akarnátok egy időben használni az appot, akkor valamilyen mandatory lock megoldás kell, hogy ne akarjatok egy időben menteni.
Vagy ha leáll a szerver épp akkor, amikor mented a JSON fájlod, akkor mi történik? Marad a lemezen egy csonkolt, hibás JSON fájl...?
Tudod-e biztosítani, vagy egyáltalán kell-e biztosítani a szigorú típusosságot, hogy pl. szám mezőbe ne kerüljön szöveg? Aztán meg csodálkozás van, ha össze akarod adni az 1-et és az "1"-et, és nem az jön ki, hogy 2 dl tej kell a sütibe, hanem 11 dl[ Szerkesztve ]
-
urandom0
senior tag
válasz lanszelot #21651 üzenetére
De miért Youtube-on meg random oldalakon nézelődsz? Ott a php.net hivatalos doksija. Nézd meg, hogy mit ír!
Windows users must enable php_sqlite3.dll in order to use this extension. This DLL is included with Windows distributions of PHP.
Azaz, nem kell letölteni semmit sehonnan sem.
Én most kipróbáltam, két dolgot kellett csak átírnom a php.ini-ben. Azextension=sqlite3
sor elől kivettem a pontosvesszőt (látom, ezt te is megcsináltad), utána ráprobáltam, de kiírta, hogy nem találja a megadott modult (és hogy ő a C:\php\ext\sqlite mappában kereste). Utána megpróbáltam átírni azsqlite3.extension_dir
beállítást átírni, de ez sem segített, továbbra is azt írta ki, hogy a megadott modul nem található.
Aztán megnéztem, hogy a php_sqlite3.dll, amit a hivatalos dokumentáció ír, hol van. Ez nálam aD:\php8.3.2\ext
mappában van.
Aztán rákerestem a php.ini-ben arra, hogy "extension", és találtam egy ilyen beállítást, hogy extension_dir. Ide beírtam, hogy "D:\php8.3.2\ext", és onnantól fogva megy az SQLite, ennyi.Te is írd át a php.ini-ben az extension_dir változódat arra a mappára, ahol vannak az extensionök, és menni fog.
Tanulj meg kicsit célirányosabban keresni, és először mindig a hivatalos dokumentációt nézegesd, ne Youtube-ról meg random oldalakról szedd az infót![ Szerkesztve ]
-
urandom0
senior tag
válasz lanszelot #21659 üzenetére
extension_dir = "ext"
Az ext helyére írd be azt a mappát, ahol a php_sqlite3.dll fájl van. Valószínűleg nálad a c:\php\ext lesz az. És vedd ki a sor elejéről a pontosvesszőt.
És a ;extension=sqlite3 sor előtt se legyen pontosvessző.sqlite elérési útja : C\:sqlite
Ha töltöttél le bármilyen SQLite-ot, azt nyugodtan töröld ki. A PHP tartalmazza az SQLite-hoz szükséges mindent, nem kell semmit sem külön letölteni.
-
urandom0
senior tag
válasz lanszelot #21660 üzenetére
Azt hittem többet tud a php, illetve az sql.
Nem akarok kötözködni, tényleg, de szerintem itt te vagy az, aki nem tud eleget, és csak neked vannak hiányosságaid.
Tehát kellene a json, de ahhoz meg kellene a python(nem nehéz, de jó pár hetembe kerülne).
Miért kellene a Python?? Dehogy kell, PHP-vel lehet kezelni a JSON-t.
No meg a php hülyeségei ellen a JS. Ok, azt tudom, de ez így már túl nagy.
Nem, nem a PHP hülyeségei ellen kellen a JS. A JS leginkább csak akkor kell neked, ha a megjelenést (a frontendet) kicsit dinamikusabbá, pörgősebbé akarod tenni.
Sql miatt fog elvérezni ez a project.
Én úgy érzem, hogy te túl gyorsan akarsz haladni. Még csak most tanulod a PHP-t, az alapokkal sem igazán vagy tisztában, de már profi receptgyűjteményt akarsz csinálni. Kicsit lassíts. Szerintem még nem is látod át igazán, hogy mi a szerver oldal, mi a kliens oldal, ki kivel van, mi hova megy, stb.
Csinálj egyszerűbb projekteket. Írj mondjuk egy néhány mezőből álló formot, ami nem csinál mást, mint bekéri pár adatot a felhasználótól, és elmenti őket adatbázisba, vagy ha az még nem megy, akkor fájlba.
Utána tegyél bele sessiont, használd a $_SESSION tömböt adatok tárolására.
Aztán utána lehet olyat, hogy adatbázisból írsz ki dolgokat mezőkbe, a felhasználó megváltoztathatja, és te visszatöltöd az adatbázisba. Ebből ki lehet alakítani egy profilkezelést mondjuk.
Aztán írhatsz olyan felületet, ahol lehet hozzászólást írni. Azt elmented adatbázisba, és megjeleníted... vagy valami ilyesmit. Lépésről lépésre, lassan haladj, tapasztald ki, mi hogyan működik. -
urandom0
senior tag
válasz lanszelot #21665 üzenetére
Php -vel nem lehet új file-t létrehozni.
Na, ilyen butaságot ne állítsunk már kérem, mert mentem a kardomba dőlök!
Lehet fájlt létrehozni az fopen() függvénnyel. Lehet fájlt létrehozni a file_put_contents() függvénnyel. Lehet fájlt létrehozni a touch() függvénnyel. Lehet fájlt létrehozni az SplFileObject osztállyal. Lehet fájlt létrehozni a tempnam() függvénnyel. Lehet fájlt létrehozni a fputcsv() függvénnyel. Nem akarom tovább sorolni...Ez a kód miért fut rosszul?
Nem fut rosszul, pontosan azt csinálja, amit beírtál neki. Csak nem azt írtad be, amit szerettél volna.
Honnan jön a $data változó? Mi van benne pontosan? Látom, van ott egy kikomentezettprint_r($data);
, az mit ír ki?Azt hittem onnantól él az ini. Ezt írta a php dokumentum.
Ezt jól hitted, ez így is van. Akkor valami más probléma van nálad. Nem akarsz tényleg XAMPP-ot használni? Az pont ilyen célokra való, mint amire neked kell.
[ Szerkesztve ]
-
urandom0
senior tag
válasz lanszelot #21668 üzenetére
Kezdődik azzal hogy biztonsági rést nyit. Ki is írja telepítésnél.
Hát én most feltelepítettem a XAMPP-ot, de ilyen kiírást nem láttam.
Az igaz, hogy ha olyan programot futtatsz a gépeden, ami portot nyit és hallgatózik rajta, akkor az biztonsági rést is jelenthet. De ez ugyanúgy igaz arra az Apache-ra, amit te telepítettél és te futtatsz, mint a XAMPP-ra.
Egyébként ha tűzfalon beállítod, hogy külső hálózatot ne tudjon elérni a program, akkor nem jelent veszélyt.a kikomentezett semmit
Semmit nem ír ki? Akkor valószínűleg nincs a $data változóban semmi, vagy talán nem is létezik. Hogy olvasod be a JSON fájlt?
A c:\php mappád tartalmát le tudod screenshotolni? Illetve az Apache konfigurácós fájlának tartalmát is feltölthetnéd valahova. Vagy írd le, honnan töltötted le és hogy telepítetted.
-
urandom0
senior tag
válasz lanszelot #21670 üzenetére
Ki van kommentelve, hogy írhatna ki bármit? Az csak komment.
Nyilván úgy értettem, hogy mit ír ki, ha nincs kikommentelve?
A $data változó tartalma érdekelne, hogy PONTOSAN milyen a felépítése, hogy néz ki.A print_r mellett egyébként vannak olyan függvények, mint a var_dump(), a var_export() és a var_representation(), ezekkel ki lehet egy-egy változó tartalmát.
-
urandom0
senior tag
válasz lanszelot #21665 üzenetére
Na nézzük meg, mi a baj ezzel a kóddal:
<h1>Hozzávalók</h1>
<table class="tablazat">
<thead>
<th>Tészta</th>
</thead>
<tbody>
<?php
//print_r($data);
print_r($data[0]->hozzávalók->tészta[0]->hozzávaló);
?>
</tbody>Ha ilyen van, hogy nem az jelenik, aminek szerinted meg kellene jelennie, akkor nyomd meg az F12-es billentyűt a böngészőben, és a vizsgálóval nézd meg, milyen HTML oldalt generál a böngésző abból, amit te beírtál.
Te valami ilyesmit szerettél volna megjeleníteni:
<h1>Hozzávalók</h1>
<table class="tablazat">
<thead>
<tr>
<th>Tészta</th>
</tr>
</thead>
<tbody>
<tr>
<td>
Tojás
</td>
</tr>
</tbody>
</table>Ehhez képest a kódodból ezt generálta a böngésző:
Látod a különbséget a két kód között?
Te simán beleraktad a <tbody>-ba a PHP-t, miközben ez tilos. A <tbody> elem csak és kizárólag <tr> elemet tartalmazhat. (Permitted content: Zero or more <tr> elements.).Ha nem így csinálod, a böngésző simán kidobja a táblázatból a PHP kimenetét, és így teljesen máshogy jelenik meg, mint ahogy te elképzelted.
Egyébként a <thead>-be is kötelező a <tr>, de a böngésző ezt kijavította, a Tészta ezért nem csúszott el.Tehát a HTML kódod helyesen:
<h1>Hozzávalók</h1>
<table class="tablazat">
<thead>
<tr>
<th>Tészta</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<?php
print_r($data[0]->hozzávalók->tészta[0]->hozzávaló);
?>
</td>
</tr>
</tbody>
</table>Ezért kell a JS , azzal nincs ilyen gond.
A PHP-vel sincsen semmi gond, a gond azzal van, hogy csak felületesen ismered a HTML-t, és nem jársz utána, nem keresel utána. A PHP-vel szintén ugyanez a helyzet, csak nagyon felületesen ismered, és ráfogod, hogy sok hibája van, de valójában a te tudásod hiányos.
-
urandom0
senior tag
válasz lanszelot #21679 üzenetére
Valaszoltam is rá, hogy azt már előtte átnéztem, de semmit sem er, mert nem php.
Persze, hogy nem PHP, hanem SQL, mert neked a törlést és a módosítást SQL-ben kell megírnod. Ahhoz pedig, hogy az SQL-t PHP alól tudd kezelni, ez a quickstart, amit linkeltél, pont jó is.
Azért osztottam meg az előző linket, ha barki keresné az sql php -t akkor az nagyon jó. Viszont ezzel ki is fújt.
Nincs benne a törlés, módosítás stbHa a W3C-s tutorialt legalább végigolvastad volna, akkor már megtaláltad volna a törlést és a módosítást, ugyanis abban mindkettő benne van
Ne várd azt, hogy valaki a szádba rakja a kész megoldásokat, a programozás nem erről szól. Ha programozol, akkor nagyon sok dokumentációt kell olvasni, tudni kell célirányosan keresni, észre kell venni az összefüggéseket, át kell látni az általad használt technológiákat, ismerni kell a lehetőségeiket, korlátaikat...
Egyébként miért nem használod valamelyik AI-t? ChatGPT, Copilot, Gemini, vagy a groq.com-on a Llama, nyugodtan lehet kérdezni tőlük!
-
urandom0
senior tag
válasz lanszelot #21686 üzenetére
Ember, az általad megtalált quickstart 8. sorában ott van a megoldás arra, amin most értetlenkedsz:
$db = new SQLite3('analytics.sqlite', SQLITE3_OPEN_CREATE | SQLITE3_OPEN_READWRITE);
Oda van írva fölé, hogy mit csinál ez a sor:
// Create a new database, if the file doesn't exist and open it for reading/writing.Erre te beírod két php tag közé a SQL kódot....
Ugyanott van egy példa tábla létrehozására is:
$db->query('CREATE TABLE IF NOT EXISTS "visits" (
"id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
"user_id" INTEGER,
"url" VARCHAR,
"time" DATETIME
)');Most ez alapján komolyan nem tudsz önállóan odáig eljutni, hogy módosíts és törölj adatokat?
Ott van minden az általad "semmire se jó"-nak nevezett W3C-s tutorialban, ott van UPDATE, és ott van a DELETE... -
urandom0
senior tag
válasz lanszelot #21688 üzenetére
Erre írtam, hogy az nem működik php-ban.
Jajj istenem, dehogynem működik, csak nem látod át!
Hiszen ti írtátok. Ti állítottátok, hogy így kell.
Aki ezt írta, nem egészen erre gondolt, itt félreértés történt.
Azt is elmondtam, hogy amit találtam, az jó, de kevés.
Nincs benne se módosítás, se törlés.Azért írod ezt, mert nem látod át ennek az egésznek a felépítését, elmagyarázni meg nagyon nehéz.
Ennyit bökdöstök, de ezalatt be tudtatok volna dobni egy linket, hogy tessék ez a php sqlite tutorial, itt szépen el van magyarázva úgy hogy a kezdők is megértik.
De hát találtál te tutorialt, az alapján, meg a W3C-s tutorial alapján azért már tudni kellene megcsinálni.
Nade linkelek neked tutorialt, tessék:
https://brainbell.com/php/sqlite.html
https://riptutorial.com/php/example/27461/sqlite3-quickstart-tutorial
https://www.scriptol.com/sql/sqlite-getting-started.phpDe azt sem tudom, hogy igazából mi nem megy, mert nagyon ritkán írsz konkrétumot, így nehéz segíteni.
-
urandom0
senior tag
válasz urandom0 #21690 üzenetére
Egyébként még mindig azt gondolom, hogy túl gyorsan akarsz haladni, de ez nem így megy. Egészen a múlt hétig nem voltál tisztában olyan alapfogalmakkal, hogy mi a PHP kimenete, de közben receptes appot írsz.....
Nade mindegy is, hagyjuk. Próbálok segíteni.Szóval, van a webszerver, ami nálad Apache (de lehetne nginx, lighthttpd, caddy, stb., sok van). Annak van egy modulja, a PHP, ami a PHP kódot végrehajtja, és elkészíti a PHP kimenetet, amit visszaad az Apache-nek, majd az Apache ezt berakja a HTML dokumentum megfelelő helyére, és kiküldi a kliensnek (a böngésződnek).
És van egy különálló adatbázis program, a te esetedben az SQLite3, amit SQL nyelven lehet kezelni.Csakhogy a PHP-t és az SQLite3 adatbázis programot valahogy össze kell, hogy együtt tudjanak dolgozni, és hogy tudd a PHP-ból az SQL-t használni. Erre valók a PHP SQLite3 függvényei (pontosabban osztálya).
Eddig gondolom minden világos.Nézzük ezt a tutorialt: https://brainbell.com/php/sqlite.html
Kezdjük onnan, hogy "Create or Open SQLite Database".<?php
$db = new SQLite3('brainbell_db.sqlite');
echo 'Connected to the database.';
$db->close();Ez a három sor mit csinál?
Készít egy új SQLite3 objektumot, amit visszaad a $db változóba. Az objektum konstruktorának egyetlen paramétert ad át, azt, hogy "brainbell_db.sqlite", ez lesz az új adatbázisfájlunk neve. Az SQLite3 osztály ennek megfelelően elkészíti az adatbázist.
Utána jön egy echo, amelyben kiírja, hogy 'Connected to the database.', végül az utolsó sor lezárja az adatbáziskapcsolatot.Namost itt jó lenne tudni, hogy miért kell lezárni a kapcsolatot, egyáltalán mi ez a kapcsolat, mi az osztály, mi az objektum, mi a metódus, mi a konstruktor, stb. Erről most csak annyit írok, hogy a kapcsolat azért kell, mert az adatbáziskezelő program (adatbázisszervernek vagy angol rövidítéssel RMDBS-nek szokás hívni) egy, a PHP-tól különálló program, amihez valahogy kapcsolódnunk kell. A végén pedig azért kell lezárni, hogy a kapcsolathoz lefoglalt erőforrások fel tudjanak szabadulni.
Menjünk tovább.
Creating a Table in SQLite DB
<?php
try {
$db = new SQLite3('brainbell.db');
$db->query('CREATE TABLE IF NOT EXISTS user_table
(name, email, UNIQUE (email))');
echo 'Table Created';
$db->close();
}
catch (Exception $e) {
echo $e->getMessage();
}Nem feltételezem rólad, hogy a try..catch szintaktikával tisztában vagy
Pedig jó lenne. Na mindegy, nézzük a lényeget:$db->query('CREATE TABLE IF NOT EXISTS user_table (name, email, UNIQUE (email))');
Mit csinál ez a sor?
Meghívja az imént létrehozott $db objektumunk query metódusát, és átad neki egy stringet, ami egy SQL lekérdezést tartalmaz. Ha ezt meg tudod csinálni, akkor gyakorlatilag mindent meg tudsz csinálni (még ha nem is tökéletesen).Nézzük meg ezt az SQL lekérdezést, vajon mit csinálhat?
CREATE TABLE IF NOT EXISTS user_table (name, email, UNIQUE (email))
Ez arra utasítja az RMDBS-t, hogy hozzon létre egy táblát (ha még nem létezik) user_table néven, aminek legyen kettő mezője, name és email. Az email mezőt egyedi kulcsnak (unique key) állítja be, ami azt jelenti, hogy nem lehet két azonos e-mail című rekord a táblában (ez logikus is, hiszen két felhasználónak nem lehet azonos e-mail címe). Ezt az SQLite szépen le fogja kezelni, hibát fog dobni, ha két ugyanolyan e-mail címet akarsz bevinni.
Innen nem megyünk tovább, hanem szépen megnyitjuk a W3C SQL tutorialját, mert abban bizony benne van az, hogy kell adatokat módosítani ill. törölni.
Adatok módosítására az (egyik) módszer az SQL UPDATE eljárása: https://www.w3schools.com/sql/sql_update.asp
Adatok törlésére pedig a DELETE eljárás: https://www.w3schools.com/sql/sql_delete.aspHa valami nem tiszta, kérdezz.
[ Szerkesztve ]
-
urandom0
senior tag
válasz lanszelot #21693 üzenetére
De ezt írtam. hogy ezekkel semmire se megyek, mert php-ban máshogy kell.
Hogyhogy máshogy kell? Nem kell máshogy.
Itt ez a sor:
$db->query('CREATE TABLE IF NOT EXISTS user_table (name, email, UNIQUE (email))');
Egyszerűen csak be kell írni a két aposztróf közé az SQL lekérdezést, és kész.
vagy ettől is alapabb: data tipusok mekkora értéket tudnak max felvenni?
Beírod a Google-be, hogy "sqlite varchar maximum length", és meg fogod találni: https://www.sqlite.org/limits.html:
The maximum number of bytes in a string or BLOB in SQLite is defined by the preprocessor macro SQLITE_MAX_LENGTH. The default value of this macro is 1 billion (1 thousand million or 1,000,000,000). You can raise or lower this value at compile-time using a command-line option like this:
Sqlite php valami ahol megtudhatom, hogy lehet e "like" -t használni vagy az csak mysqli.
Megint csak: beírod Google-be, hogy sqlite like, és ott lesz az első oldalon: https://www.sqlite.org/lang_expr.html
The LIKE operator does a pattern matching comparison.
De egyébként marha egyszerű, kipróbálod, hogy lehet-e, és megtudod. Ha hiba van, úgyis kapsz visszajelzést.
És hogy rakjak idézőjelet, vagy se? És millió kérdésem van amit másként mutat az egyik mint a másik.
Hát igen, most megint előjön az, hogy nem ismered a nyelv szabályait, nem tudod, mikor kell idézőjel, a különféle idézőjelek miben különböznek, stb. De egyébként ha az egyik tutorial használ idézőjeleket, a másik nem, akkor valószínűleg mindkét megoldás helyes.
Pl a hiba kezelést te úgy írtad, de van ahol $db->enableExceptions(true);
És elolvastad, hogy mit csinál ez a függvény?
Ezt: "Controls whether the SQLite3 instance will throw exceptions or warnings on error."Szerintem ez számodra teljesen lényegtelen. Ha majd eljutsz odáig, hogy tudsz kivételeket kezelni, akkor már tudni fogod, hogy be akarod-e kapcsolni vagy sem.
Kellene egy rendes leírás,
Ennél rendesebbet nem fogsz találni.
-
urandom0
senior tag
válasz lanszelot #21699 üzenetére
2.
If-nél és try-nél is van scope.
try {
$id = $receptekData->lastInsertRowid();
// $id elérhető itt
} catch (Exception $e) {
// $id itt nem elérhető
}
// $id itt nem elérhetőDefiniáld az $id-t a try előtt:
$id = null; // Változó előzetes deklarálása
try {
$id = $receptekData->lastInsertRowid();
} catch (Exception $e) {
// Hibakezelés
}
// $id itt már elérhető lesz[ Szerkesztve ]
-
urandom0
senior tag
válasz lanszelot #21702 üzenetére
Annak, hogy
empty($_POST['toltelek_mertekegyseg'])
, igaznak kell lennie abban az esetben, ha value="".Tehát ha írsz valami ilyesmit:
if (empty($_POST['toltelek_mertekegyseg'])) {
echo 'ez igaz';
}Akkor ki kell írja, hogy ez igaz. Itt van a PHP igazságtáblázat, ebben látszik, hogy az üres string ("") empty-vel vizsgálva igazat ad vissza, tehát empty("") == true.
2. Mutasd a kódod, mit írtál pontosan!
-
urandom0
senior tag
válasz lanszelot #21706 üzenetére
Hol írják a VARCHAR-t 255-nek? Korábban belinkeltem neked az SQLite doksiját: https://www.sqlite.org/limits.html
Nem nézted meg... pedig ott van benne:Maximum length of a string or BLOB
The maximum number of bytes in a string or BLOB in SQLite is defined by the preprocessor macro SQLITE_MAX_LENGTH. The default value of this macro is 1 billion (1 thousand million or 1,000,000,000). -
urandom0
senior tag
válasz lanszelot #21707 üzenetére
Hosszú kódot fel tudsz tenni mondjuk Pastebin-re, és annak a linkjét be tudod ide rakni. Ha nem is kell feltétlenül az egész, legalább a hibás függvényt mutasd meg.
Ugyanis null az id érték mindenhol, nem az amit az if-en belül kap.
Tehát nem jön ki az érték.Az ilyen leírások alapján nem nagyon értjük, mint szeretnél pontosan, legalábbis én nem.
-
urandom0
senior tag
válasz lanszelot #21710 üzenetére
1. Én ezeket a sorokat előre tenném, ugyanígy try..catch blokkba, csak egy másikba:
//file create or open if exist
$receptekData = new SQLite3("receptekdb.sqlite", SQLITE3_OPEN_CREATE | SQLITE3_OPEN_READWRITE);
//error handling
$receptekData->enableExceptions(true);
$receptekData->query(
"CREATE TABLE IF NOT EXISTS 'receptek' (
id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
nev VARCHAR(100) NOT NULL
)"
);Mert ezek ugye kapcsolódnak az adatbázishoz, beállítják a kivételkezelést, és elkészítik a táblát, igazából ezeknek szerintem logikailag nincs közük ahhoz, amit te a feltételben vizsgálsz. Az egy másik történet.
Arról is nem is beszélve, hogy ha később szeretnél írni még egy INSERTET vagy bármit, akkor a $receptekData változódat, ami az SQLite kapcsolatot tárolja, nem fogod tudni elérni.2.
isset($_POST["submitNev"])
!empty($_POST["nev"])
A két feltételt én egybekötném ÉS-sel.
3. A lastInsertRowid-t én nem használnám. Egyetlen egyszer próbáltam használni PDO-nál MYSQL adatbázisnál (PDO::lastInsertId), akkor sem jött össze.
De ha használod, akkor olvasd el ezen az oldalon az első néhány commentet, ott azt írják, hogy ha tranzakciókat használsz (te pedig azokat használsz), akkor a COMMIT elé kell tenni a lastInsertRowid-t. Tehát próbáld meg így:$receptekData->exec('BEGIN');
$receptekData->query("INSERT INTO 'receptek' (nev) VALUES ('$nev')");
$id = $receptekData->lastInsertRowid(); //ennek az értéke nulla, pedig nem annyi
$receptekData->exec('COMMIT');"3.1.1 ott írják az sqlite oldalán a táblázatban."
Az csak egy example, egy példa
Az SQL és az SQLite saját SQL implementációja közti megfeleltetésekről.
De ott is írják, hogy "Note that numeric arguments in parentheses that following the type name (ex: "VARCHAR(255)") are ignored by SQLite - SQLite does not impose any length restrictions (other than the large global SQLITE_MAX_LENGTH limit) on the length of strings, BLOBs or numeric values."----------
Ha túl hosszú a kódod, szedd szét logikailag különálló fájlokra.
[ Szerkesztve ]
-
urandom0
senior tag
válasz lanszelot #21717 üzenetére
3. Első körben azt kéne megnézni, hogy bekerül-e egyáltalán az adatbázisba az adat. Nincs valami programod, DB Browser vagy valami, amivel meg tudod nyitni az SQLite fájlodat?
Egy SELECT * FROM receptek típusú lekérdezésnek is vissza kell adnia az összes adatot, ami a táblában van.
A hiba egyébként szerintem ott lesz, hogy nem fetcheled ki az adatokat a visszakapott változóból.
Mert pl. ez, amit korábban írtál, nem működik:
$receptekData->query("SELECT * FROM 'receptek'");
$id = $receptekData->lastInsertRowID();
echo ($id);Azért nem működik, mert a
lastInsertRowID()
a legutolsó INSERT-tel beszúrt adat Id-ját adja vissza (azt is csak addig, amíg él az adatbáziskapcsolat).
De ha SELECT-et használsz, akkor neked fetchelned kell a visszakapott adatokat, pl. a fetchArray() metódussal: https://www.php.net/manual/en/sqlite3result.fetcharray.phpOlyan mintha php alatt senki se kezelne sql-t.
Pedig nagyon sok PHP-s SQL tutorial van. De egyébként én MySQL-t ajánlottam neked, csak valaki áttérített SQLite-ra, de azt megnézted, hogy azon a tárhelyen, amin futtatni fogod az appod, lehet-e egyáltalán SQLite-ot használni? Mert a MySQL szinte mindenhol támogatott, SQLite-ban viszont egyáltalán nem vagyok biztos.
-
urandom0
senior tag
válasz lanszelot #21719 üzenetére
SELECT- el szeretném kikérni, csak nem sikerül.
Azt a php oldalt szoktam olvasni, de egy árva szavacskát se értek onnan.Én most nem tudom elmagyarázni, de ezt a példát ha megnézegeted, szerintem érteni fogod:
$db = new SQLite3('auth.sqlite');
$sql = "SELECT user_id, username, opt_status FROM tbl_user";
$result = $db->query($sql);
$row = array();
$i = 0;
while($res = $result->fetchArray(SQLITE3_ASSOC)){
if(!isset($res['user_id'])) continue;
$row[$i]['user_id'] = $res['user_id'];
$row[$i]['username'] = $res['username'];
$row[$i]['opt_status'] = $res['opt_status'];
$i++;
}
print_r($row);Sqlite: azt írtátok az 1 file és ezért könnyű biztonsági mentést csinálni.
Ez mondjuk igaz.
2 teljesen készt már eldobtam.
Akkor ez lesz a 3ik...Ha egyszer megírtad SQLite-hoz, onnantól nem nehéz átírni MySQL-hez. Nem kell eldobnod az egészet.
Akár a Copilot is átírja neked 2 perc alatt, ha szépen kéred...Fogalmam sincs támogatja e. Azt hittem ez alapból benne van a php-ban. Mert erről volt szó.
Igen, igen, csak ugye engedélyezni kell az .ini fájlban, és ha alapból nincs engedélyezve, akkor te azt nem tudod megcsinálni az ingyenes tárhelyen.
[ Szerkesztve ]
-
urandom0
senior tag
válasz lanszelot #21721 üzenetére
Öööö, szerintem ez így nem jó. Az implode a tömb elemeiből egy stringet képez. Ha pl. van egy ilyen tömböd, hogy [1, 2, 3, 4, 5], az implode ebből ezt csinálja: "12345".
Biztos, hogy erre van szükséged?
Kerüld a kevert nyelvű változónevek használatát! Ha lehet, maradj az angolnál, de ha mégis magyar nyelvű válltozókat szeretnék, akkor legyen minden magyar, tehát ne $tombLength hanem $tombHossz.
-
urandom0
senior tag
Én lekérdezném a MAX() id-t.
-
urandom0
senior tag
válasz lanszelot #21729 üzenetére
Az SQLite adatbázisban egy tábla létezésének ellenőrzéséhez használhatod a sqlite_master táblát, amely az adatbázis sémáját tartalmazza. A sqlite_master tábla tartalmazza az összes tábla, nézet, index és trigger információit. Az alábbiakban bemutatom, hogyan tudod PHP-ban leellenőrizni, hogy egy bizonyos tábla létezik-e.
1. Nyisd meg az adatbázist egy PDO objektum segítségével.
2. Futtass egy SQL lekérdezést a sqlite_master táblán.
3. Ellenőrizd, hogy a lekérdezés visszaad-e bármilyen eredményt.Íme egy példakód:
<?php
try {
// Kapcsolódás az adatbázishoz
$pdo = new PDO("sqlite:receptekdb.sqlite");
// A tábla neve, amit ellenőrizni szeretnél
$tableName = 'table_name';
// SQL lekérdezés a sqlite_master táblán
$stmt = $pdo->prepare("SELECT name FROM sqlite_master WHERE type='table' AND name=:table");
$stmt->bindParam(':table', $tableName);
$stmt->execute();
// Ellenőrzés, hogy van-e eredmény
if ($stmt->fetch()) {
echo "A(z) '$tableName' tábla létezik.";
} else {
echo "A(z) '$tableName' tábla nem létezik.";
}
} catch (PDOException $e) {
// Hibakezelés
echo "Hiba: " . $e->getMessage();
}
?>Ebben a kódban a következő dolgok történnek:
1. Létrehozol egy új PDO objektumot, hogy kapcsolódj az SQLite adatbázishoz.
2. A sqlite_master táblából lekérdezed, hogy létezik-e a keresett tábla.
3. A lekérdezés eredménye alapján eldöntöd, hogy a tábla létezik-e vagy sem.ChatGPT volt, nem én...
-
urandom0
senior tag
-
urandom0
senior tag
válasz lanszelot #21740 üzenetére
Amikor a formban a submit gombra kattintanak, akkor ne küldje el az formot, hanem fusson le egy Javascript, ami összegyűjti a formban megadott adatokat, és elküldi a szervernek (egy PHP fájlnak), majd miután visszakapta a választ, feldolgozza. Mondjuk, ha egy login formról van szó, és hibás a megadott jelszó, akkor a visszakapott válaszban valahogy jelezni kell, hogy rossz a jelszó, a Javascriptnek pedig a feldolgozás során ezt ki kell íratnia a felhasználónak.
-
urandom0
senior tag
válasz lanszelot #21742 üzenetére
Azt se tudtam hogy a php elküldi a formot valahova.
Azt hittem berakja az adatbázisban.Én is csak megerősíteni tudom, hogy nem a PHP küldi el, hanem a böngésző. De én ilyen apróságok miatt nem szoktam szólni,
Ajax-hoz nem kell Fetch. Van ajax vagy fetch (xmljttp -t nem tudom).
Szintén csak megerősíteni tudom azt, hogy az AJAX egy technika, hogy mivel valósítod meg, az egy másik kérdés. Megvalósíthatod XMLHTTPRequesttel vagy fetch() függvénnyel (de ha nagyon akarja az ember, WebSockettel is megoldható).
jQuery-t ismered, nem? Abban is van $.ajax(), $.post(), $.get() és hasonlók függvények, az is AJAX.Ezek szerint töröljem az összes php-t és js-el oldjam meg az egészet?
Tehát kezdjem ismét újra az egészet?Igazából a tanulást kéne előről kezdeni, mert még mindig azt mondom, az alapprobléma az, hogy egyszerűen nem látod át, hogy minek mi a szerepe. Próbáltam már korábban leírni itt, nem tudom, mennyire ment át, de igazából azt kéne átnézned, hogy hogyan működik ez az egész webes kommunikáció. Nagyjából itt kellene elkezdened: Client-Server Overview
Van benne egy ábra, azt is nézegesd meg alaposan.Készítettem én is neked egy ábrát, mert a cikkben lévőben nincs benne az adatbázis. Nem tökéletes, de a lényeg talán leolvasható: [kép]
Új hozzászólás Aktív témák
- Milyen okostelefont vegyek?
- Fotók bizonyítják, tényleg szárat növeszt a Galaxy Buds 3
- Kerékpárosok, bringások ide!
- Yettel topik
- bitpork: 2024 phautós tali ?
- Milyen notebookot vegyek?
- Robogó, kismotor
- Xiaomi 14 - párátlanul jó lehetne
- Békéscsaba és környéke adok-veszek-beszélgetek
- Samsung Galaxy Watch (Tizen és Wear OS) ingyenes számlapok, kupon kódok
- További aktív témák...
- Lenovo ThinkStation P720 Workstation: 2db Xeon proci + 128GB RAM + Quadro RTX4000 8GB + 512GB SSD
- Lenovo ThinkStation P720 Workstation: 2db Xeon proci + 64GB RAM + Quadro P4000 8GB + 512GB SSD + Win
- HP Pavilion x360 14-ek Convertible - ÚJ - 14" TOUCH notebook - i5-1235U, 16GB, 512SSD, Win11
- DJI AVATA Pro-View Combo drón (DJI goggles 2) - 2 akku, Motion Controller 2 - 1 év garancia
- LETISZTULT PC ÁTLAG FELADATOKRA - AMD R5 5600G - 16GB DDR4 RAM - 500GB NVME SSD