Autor Zpráva
Kleciss
Profil
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
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
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
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
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
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
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
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
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
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
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
Dobře, jen nevím jak myslíš předělat. Spíš co

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0