Autor | Zpráva | ||
---|---|---|---|
Kleciss Profil |
#1 · Zasláno: 8. 1. 2020, 16:39:52
Zdravím, chtěl bych zapisovat data do souboru (.php) přesně do určité proměnné, ale nikde jsem nenarazil na způsob. Mohl by mi někdo poradit?
asi takto $prvni = "zapsaný text"; Děkuji |
||
Keeehi Profil |
#2 · Zasláno: 8. 1. 2020, 16:42:32
Kleciss:
To není dobrý nápad. Spíš nám popiš co chceš obecně dělat a my ti poradíme, jakým způsobem nejlépe na to. |
||
Kleciss Profil |
#3 · Zasláno: 8. 1. 2020, 16:52:56
Dávám dohromady kalendář, do kterého bych chtěl pomocí formuláře zapsat událost do určitého data. Většinou se jedná o soboty takže 4/5 možností kam data zapsat.
|
||
lionel messi Profil |
#4 · Zasláno: 8. 1. 2020, 20:53:21
Kleciss:
Vďaka za upresnenie problému. Áno, potrebuješ nejaké úložisko dát, ale určite nie tým spôsobom, ktorý si načrtol vyššie. V zásade máš dve možnosti: 1) Použiť na ukladanie súbor. Nie však .php ale obyčajný textový súbor (.txt). Pomocou PHP si doň dáta uložíš ako text, na výstupe zase pomocou PHP vytiahneš, vyparsuješ a vypíšeš. Taký súbor môže vyzerať povedzme takto: 2020-01-11 20:10:00~Zdeno Chára~Gól v zápase proti Nashvillu 2020-01-11 20:30:00~Zdeno Chára~Bitka s Jakovom Treninom 2020-01-18 11:30:00~Zdeno Chára~Odchod z nemocnice 2020-01-25 13:40:00~Zdeno Chára~Osadenie umelého chrupu u zubára Tá vlnovka (~) ti poslúži ako oddeľovač pri parsovaní – ľahko sa dostaneš k termínu, jeho autorovi aj udalosti. Ukladanie do súboru má výhody (nemusíš riešiť komunikáciu s databázou), ale aj nevýhody. Horšie sa robia pokročilejšie veci – (Koľko udalostí vložil Zdeno Chára? Koľko jeho udalostí pripadlo na deň, keď mal nejakú udalosť aj Jakov Trenin?), musíš riešiť, čo sa stane, ak k súboru pristupujú dvaja užívatelia naraz (tzv. atomicitu operácií). 2) Použiť databázu. Pre začiatočníka to zrejme bude dačo založené na jazyku SQL (typicky MySQL či MariaDB). Výhodou je ľahšia práca s dátami (ľahšie nájdenie odpovede na otázky zmienené v predošlom bode). Nevýhoda: Musíš sa naučiť jazyk databázy a oboznámiť sa s tým, ako databáza komunikuje s PHP. Osobne by som sa prikláňal k použitiu databázy (MySQL a extenzie mysqli v PHP). |
||
Kleciss Profil |
#5 · Zasláno: 8. 1. 2020, 21:00:29
Už se snažím použít druhou možnost a to databázi. Zkouším to takto ale nedaří se..
<HTML> <head> <meta charset="UTF-8"> <title> Přídání události </title> </head> <BODY> <?php if ($submit) { // zpracuj formulář $db = mysql_connect("localhost", "****", "****"); mysql_select_db("kalendar",$db); $sql="INSERT INTO leden (prvni, druhy, treti, ctvrty, paty) VALUES ('$prvni', '$druhy', '$treti', '$ctvrty', '$paty')"; $vysledek = mysql_query($sql); echo "Data byla úspěšně uložena do databáze.\n"; } else { // zobraz formulář ?> <FORM method="post" action="<?php echo $PHP_SELF?>"> První víkend: <input type="text" name="prvni"> Druhý víkend: <input type="text" name="druhy"> Třetí víkend: <input type="text" name="treti"> Čtvrtý víkend: <input type="text" name="ctvrty"> Páty víkend: <input type="text" name="paty"> <INPUT type="Submit" name="submit" value="Přidat událost"> </FORM> <?php } // end if ?> </BODY> </HTML> |
||
Tomášeek Profil |
Kleciss:
„Zkouším to takto ale nedaří se..“ Zaprvé určitě nepoužívej mysql_* funkce. Pokud jsou na hostingu dostupné, pryč odsud. Jsou to funkce z dávno nepodporovaných verzí PHP.
Zadruhé, proměnné $prvni , etc. neexistují. Zapni si výpis chybových hlášek a budeš moudřejší. Data jsou v $_POST/$_GET , pokud jsou z formuláře. Stejně tak $PHP_SELF by měla končit varováním, použij $_SERVER['PHP_SELF'] , nebo action vynech úplně.
Jinak syntakticky je ten SQL dotaz v pořádku. Tabulka určitě nebude leden (každý měsíc nebude mít svou tabulku). Přidej do tabulky sloupec typu date(time) , abys pak mohl snadno lednové záznamy vybrat.
Zdá se mi, že sis pro studium vybral hóóódně starý a špatný zdroj informací (tipuji tak 10+ let). Zkus najít lepší. |
||
Kleciss Profil |
#7 · Zasláno: 8. 1. 2020, 21:34:08
Vyzkoušel jsem jinou metodu, přihlášení do db v pohodě, ale do tabulek se nic nezapíše..
<!doctype html> <html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <meta name="description" content="$1"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title> Přídání události </title> </head> <link rel="stylesheet" type="text/css" href="style.css"> <?php include_once 'dbConfig.php'; ?> </head> <body> <?php if(isset($_POST['save'])){ $sql = "INSERT INTO leden (prvni, druhy, email) VALUES ('".$_POST["prvni"]."','".$_POST["druhy"]."','".$_POST["email"]."')"; } ?> <form method="post"> <label id="first"> První víkend</label><br/> <input type="text" name="prvni"><br/> <label id="first">Druhý víkend</label><br/> <input type="text" name="druhy"><br/> <button type="submit" name="save">save</button> <button type="submit" name="get">get</button> </form> </body> </html> <?php $mysqli = new mysqli("localhost", "****", "***", "****"); /* check connection */ if (mysqli_connect_errno()) { printf("Connect failed: %s\n", mysqli_connect_error()); exit(); } ?> |
||
lionel messi Profil |
Kleciss:
Takže: 1. V súbore dbConfig.php je zbytočné používať objektový prístup, keď vo zvyšku kódu pracuješ procedurálne. Upravil by som na: <?php $mysqli = mysqli_connect("localhost", "****", "***", "****"); /* check connection */ if (mysqli_connect_errno()) { printf("Connect failed: %s\n", mysqli_error($mysqli)); exit(); } ?> 2. Ty síce dotaz zostavíš, ale nikde ho nepošleš do databázy, na čo slúži funkcia mysqli_query: if(isset($_POST['save'])){ $sql = "INSERT INTO leden (prvni, druhy, email) VALUES ('".$_POST["prvni"]."','".$_POST["druhy"]."','".$_POST["email"]."')"; mysqli_query($mysqli, $sql); } 3. Prečítal by som si niečo o escapovaní (najmä o mysqli_real_escape_string), keďže vkladať neošetrené dáta od užívateľa do databázy nie je bezpečné (kvôli SQL Injection). |
||
Kleciss Profil |
#9 · Zasláno: 9. 1. 2020, 12:37:14
Již mám vše funkční, jen bych chtěl abych data v tabulce přepisoval a ne přidával další řádky do tabulky. Nemůžu to nikde najít, ví někdo jak to upravit?
<?php /* Attempt MySQL server connection. Assuming you are running MySQL server with default setting (user 'root' with no password) */ $link = mysqli_connect("localhost", "****", "****", "*****"); // Check connection if($link === false){ die("ERROR: Could not connect. " . mysqli_connect_error()); } // Escape user inputs for security $prvni = mysqli_real_escape_string($link, $_REQUEST['prvni']); $druhy = mysqli_real_escape_string($link, $_REQUEST['druhy']); $treti = mysqli_real_escape_string($link, $_REQUEST['treti']); $ctvrty = mysqli_real_escape_string($link, $_REQUEST['ctvrty']); $paty = mysqli_real_escape_string($link, $_REQUEST['paty']); // Attempt insert query execution $sql = "REPLACE leden (prvni, druhy, treti, ctvrty, paty) VALUES ('$prvni', '$druhy', '$treti', '$ctvrty', '$paty')"; if(mysqli_query($link, $sql)){ echo "Records added successfully. "; } else{ echo "ERROR: Could not able to execute $sql. " . mysqli_error($link); } // Close connection mysqli_close($link); ?> |
||
Tomášeek Profil |
#10 · Zasláno: 9. 1. 2020, 12:54:46
Kleciss:
„abych data v tabulce přepisoval“ UPDATE . dev.mysql.com nechť se stane tvým kamarádem :-)
Jinak data nijak nevaliduješ, uloží se ti i prázdný formulář. Pokud bude vyplněný, projde e-mail „abc“, třeba. |
||
Keeehi Profil |
Případně INSERT ON DUPLICATE KEY UPDATE
což dělá to, že pokud záznam neexistuje, tak ho vytvoří a pokud existuje, tak ho upraví. |
||
Kajman Profil |
Tomášeek, Keeehi:
Ale to by udělal i replace, ale asi tam má špatně unikátní klíč. Kleciss: Název tabulky i název sloupců je podivný. Jaká data chcete ukládat a jakou má tabulka strukturu (lze vypsat např. díky show create table)? |
||
Kleciss Profil |
#13 · Zasláno: 9. 1. 2020, 15:43:19
Do kalendáře nechci vkládat událost na každý den, stačí mi když můžu vložit událost do každého víkendu v měsíci. Proto rozděleno jako "prvni" "druhy" apod. Dělám to možná složitě, ale učím se.. Vyzkouším to INSERT ON DUPLICATE KEY UPDATE a uvidím.
|
||
Tomášeek Profil |
#14 · Zasláno: 9. 1. 2020, 15:48:47
Kajman:
„Ale to by udělal i replace“ Hm, viděl jsem XXX leden VALUES () a automaticky si mozek doplnit INSERT ... :-)
Kleciss: „Do kalendáře nechci vkládat událost na každý den, stačí mi když můžu vložit událost do každého víkendu v měsíci.“ Přesto na to jdeš špatně. Tabulka se bude jmenovat podle toho, co do ní vkládáš. Třeba akce (nebo kalendar ). Sloupce tabulky by mohly být následující:
id (číselné, AI) | nazev (varchar) | popis_akce (varchar/text) | datum (date/datetime) Záznamy nemusíš mazat, ID se postará o to, aby byly unikátní. |
||
Kleciss Profil |
Bohužel nefunguje.
Mám již sestavený kalendář pomocí HTML + CSS (tabulka) a do ní vkládám proměnné, která si z databáze vytáhne data. (např. první víkend v měsíci $prvni atd..) Stačí jeden sloupec s názvem akce, nic víc není potřeba. |
||
Tomášeek Profil |
#16 · Zasláno: 9. 1. 2020, 15:56:41
Kleciss:
Tak to HTML předělej. Ve vlastním zájmu, dokud to jde ještě snadno. Psal jsi, že se učíš, ne? Tak se uč správně. S tvým přístupem nebudeš moci ukázat staré akce (třeba kvůli interní statistice). Nebudeš moci udělat 6 akcí v měsíci. Dvě v jednom dni. Tudy fakt cesta nevede :-) Ukládání do DB je snadné, to už skoro máš, výpis není o moc těžší. |
||
Kleciss Profil |
#17 · Zasláno: 9. 1. 2020, 16:02:29
Dobře, jen nevím jak myslíš předělat. Spíš co
|
||
Časová prodleva: 4 roky
|
0