Autor Zpráva
Sidbin
Profil
Ahoj,
řeším problém s formulářem. Ve formuláři je:
-textové pole
-výběrové pole
-zatrhávací políčko
-heslo
Tlačítko odeslat

Rád bych tyto výstupy po ověření platného hesla uložil do TXT (pouze jeden jediný řádek i po opakovaném stisknutí tlačítka odeslat). Hotnoty bych rád odělil čárkou a zatrhávací tlačítko stačí stav 1 a 0.

Jde o možnost řídit termostat přes web, zařízení si pak z webu načte toto nastavení v TXT.
PHP moc nerozumím, jen základy. Děkuji.
Keeehi
Profil
<?php
if(isset($_POST["pole1"]) and isset($_POST["pole2"]) and isset($_POST["password"])) {
    if($_POST["password"] == "tajné heslo") {
        $data = $_POST["pole1"] . "," . $_POST["pole2"] . ",";
        $data .= isset($_POST["pole3"]) ? "1," : "0,";
        file_put_contents("soubor.txt", $data);
        echo "hodnoty uloženy";
    } else {
        echo "špatné heslo";
    }
}
?>
<form method="post">
    <input type="text" name="pole1">
    <select name="pole2">
        <option value="moznost1">Možnost 1</option>
        <option value="moznost2">Možnost 2</option>
    </select>
    <input type="chceckbox" name="pole3">
    Heslo: <input type="password" name="password">
    <input type="submit" value="uložit">
</form>
Sidbin
Profil
Děkuji, takovou rychlost jsem nečekal. :-)
Zkusil jsem to nanečisto a funguje to hezky. Už tam hodím jen svou připravenou css šablonu.
https://www.dropbox.com/s/dg1kzzc5stg6gph/termostat2.png

Děkuji.
Tomáš123
Profil
Keeehi:
Čo je sledované piatym riadkom? Premenná $date sa nikde neukladá, ani skript s ňou nepracuje. Je to nejaké zamedzenie opakovania záznamu?

Sidbin:
Nemyslím, že kód hore nejako overuje duplicity v súbore. Napadá mi niekoľko riešení:
1.) Overovať pred uložením, či už rovnaký riadok náhodou neexistuje (neviem, či by v tvojej aplikácii takéto chovanie vadilo)
2.) Môžeš ukladať do premennej $_SESSION aktuálny čas a porovnávať ho s časom ďalších prichádzajúcich údajov (záleží na tebe aký dlhý interval zvolíš)

Druhé riešenie mi príde múdrejšie. Urobil by som to nejako takto:
<?php
  if(!empty($_SESSION['casovy-rozdiel']) OR time() - $_SESSION['casovy-rozdiel'] > x) { // x symbolizuje časový interval, ktorý je prípustný medzi dvoma odoslaniami
      //Keeehiho kód
  }
  else {
    echo "Nejaké chybové hlásenie";
  }
?>
<!-- Formulár -->
lionel messi
Profil
Tomáš123:
Keeehi:
Čo je sledované piatym riadkom? Premenná $date sa nikde neukladá, ani skript s ňou nepracuje. Je to nejaké zamedzenie opakovania záznamu?
Výborný postreh. Dovolím si odpovedať namiesto kolegu. Piaty riadok má na starosti kontrolovať, či bol zaškrtnutý checkbox a podľa toho pridať na koniec reťazca $data zodpovedajúcu hodnotu. Keeehi však pravdepodobne (na 99%) zabudol uviesť bodku na vyznačenom mieste a tak si premennú $data prepísal namiesto toho, aby docielil pripojenie reťazca.

$data = $_POST["pole1"] . "," . $_POST["pole2"] . ",";
$data   .= isset($_POST["pole3"]) ? "1," : "0,";
Keeehi
Profil
Tomáš123:
To byl samozřejmě překlep.

Řešení duplicit je velmi jednoduché, při každém odeslání se soubor přepíše. A jeden řádek nemůže být nikdy duplicitní. A dokonce je to správné řešení viz „(pouze jeden jediný řádek i po opakovaném stisknutí tlačítka odeslat).
Sidbin
Profil
Zatím jsem zkoušel teploty, toho checkbox jsem si všiml až pozdějc.
Použil jsem raděj vstup "number", abych se vyhnul nějakým chybám a extrémním hodnotám.
<input type="number" min="10" step="0.5" max="25" name="termostat">

Tomáš123:
Duplicity se nemusí řešit, tenhle TXT se uloží s nastavením na webu, zařízení si zkontroluje občas toto nastavení a případně provede akci ( vyřadí standarní termostat a začne řídit vytápění dle zvoleného čidla a teploty). Jde tedy jen o jeden řádek s nastavením.

Zkusil jsem i načíst hodnotu toho nastavení z TXT zpět do formuláře a u teploty to už funguje.

$soubor = 'we.txt';
if (!File_Exists ($soubor)) {
exit("<P>Nelze najít soubor $soubor.\n\n");
}
$klika = fopen($soubor, 'r');
if ($klika == false) {
exit("<P>Nelze otevřít soubor $soubor ke čtení.\n\n");
}
$data = fread ($klika, filesize ($soubor));
fclose ($klika);

$radky = explode ( "\n", $data );
while (list(, $radek) = each ($radky)) {
list($teplota, $cidlo, $termostat) = explode( ',', $radek);
echo "teplota: $teplota cidlo: $cidlo termosta: $termostat <BR>\n";
}

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: