Autor Zpráva
BasMann
Profil
Dobrý den... nevím jestli píšu do správné diskuze, potřeboval bych poradit, jak odeslat data z formuláře.
Mám formulář, kde bude
1 - zápis jméno - přes input,
2 - input "radio" - 2 volby - ano/ne
3 - button Zapsat
to vše zapsat do XML nebo HTML tabulky bez použití DB

a pokud by to nebylo moc složité, tak aby mi přišel email...

Příklad formuláře:
<form id="#" method="post" action="#">
    <input type="text" name="Name" id="input-i" placeholder="jméno" required="">
    <input type="submit" id="#" name="submit" value="Zapsat">
    <div class="radio">
        <fieldset>
            <div>
                <input id="radio1" type="radio" name="radio" value="1" checked="checked">
                <label for="radio1">ANO</label>
            </div>
            <div>
                <input id="radio2" type="radio" name="radio" value="2">
                <label for="radio2">NE</label>
            </div>
        </fieldset>
    </div>
</form>

předem moc díky za pomoc a odpověď
lionel messi
Profil
BasMann:
Za súčasný kód doplň:
<?php
if (isset($_POST["submit"])) {
  $name = htmlspecialchars($_POST["Name"]);
?>
  <table>
    <tr>
      <td><?= $name ?></td>
      <td><?= $_POST["radio"] ?></td>
    </tr>
  </table>
<?php
}
?>

V prípade zápisu do iného súboru bude vhodné použitie napr. file_put_contents.

O zaslanie e-mailu sa postará funkcia mail, vhodný návod na posielanie mailu so správnym kódovaním nájdeš v FAQ.

Pre istotu ešte doplním, že zápis <?= $name a pod. funguje až od PHP 5.4.0 (vrátane), v starších verziách je nutný o pár znakov dlhší klasický zápis <?php echo $name
BasMann
Profil
díky moc za rychlou odpověď, ale bohužel to potřebuju dostat na wz.cz, kde je aktuálně PHP 4.3.4
PHP skoro vůbec nerozumím a bude asi potřeba ten delší zápis, tak prosím o trošku trpělivosti...

Chci se ještě zeptat jestli není nutné dopsat místo action="#" nějaké xxx.php?
A pozn. - ta tabulka je jinde než formulář...
Zápis do <table> stačí...
Posílání emailu je popsané docela slušně ve více forech, ale spíše mi šlo o to, kam v tom kousku PHP vyvolat funkci "pošli email na adresu nekdo@neco.cz

Ještě jednou moc díky

Zkusil jsem to na localhost, PHP funguje, ale ten zápis je vždy jen do jednoho řádku tabulky. Omlouvám se, měl jsem v zadání rovnou připsat, že bych chtěl pro svoje účely něco jako hlasování o účasti na akci...
lionel messi
Profil
BasMann:
Chci se ještě zeptat jestli není nutné dopsat místo action="#" nějaké xxx.php?
V prípade, že stránka s formulárom má príponu .php (čiže je to de facto PHP skript) môžeš dokonca atribút action úplne vynechať a formulár potom spracuješ na tej istej stránke. Samozrejme, môžeš nasmerovať action aj na ľubovoľný iný .php súbor, je to len na tebe, osobne sa v tomto prípade prikláňam k spracovaniu na jednom mieste, nie je to však podstatné.

bohužel to potřebuju dostat na wz.cz, kde je aktuálně PHP 4.3.4 […] bude asi potřeba ten delší zápis
Áno, presne tak, absencia PHP 5 trochu komplikuje aj zápis do súboru (nie je možné použiť šikovnú funkciu file_put_contents).

A pozn. - ta tabulka je jinde než formulář...
Čiže predpokladám, že hľadáš v podstate zápis do súboru. Mierne to však komplikuje tvoja požiadavka zapisovať do <table>. Bolo by totiž lepšie zapisovať do súboru povedzme anketa.txt zhruba takto:
Adam 1
Boris 2
Cyril 2
Dávid 1
čiže oddeliť si výstupy len zalomením riadku a tabuľku riešiť až pri výpise dát (tú vytvoríš jedným cyklom).

Najprv vytvor na serveri (pokojne cez FTP) nový súbor anketa.txt, do ktorého budeš potom zapisovať dáta. Potom vytvor súbor anketa.php s nasledovným kódom:
<form id="#" method="post" action="#">
    <input type="text" name="Name" id="input-i" placeholder="jméno" required="">
    <input type="submit" id="#" name="submit" value="Zapsat">
    <div class="radio">
        <fieldset>
            <div>
                <input id="radio1" type="radio" name="radio" value="1" checked="checked">
                <label for="radio1">ANO</label>
            </div>
            <div>
                <input id="radio2" type="radio" name="radio" value="2">
                <label for="radio2">NE</label>
            </div>
        </fieldset>
    </div>
</form>

<?php
if (isset($_POST["submit"])) {
  $name = $_POST["Name"];
  $value = $_POST["radio"];
  $content = $name . " " . $value . PHP_EOL;
  $handle = fopen("anketa.txt", "a");
  fwrite($handle, $content);
  fclose($handle);
}
?>

Toto by bol celý zápis hodnôt z formulára. Má však jeden nedostatok, nerieši tzv. atomicitu operácií (v skratke, raz za istý čas je veľmi pravdepodobné, že sa ti dáta so súboru vymažú, žiaľ, nemám toľko skúseností, aby som vytvoril kód, ktorý by tento problém spoľahlivo odstránil).

Výpis navrhujem riešiť na inej stránke, nazvime ju trebárs vypis.php nasledovne:
<?php
$lines = file("anketa.txt");
echo "<table>";
foreach ($lines as $line) {
  $data = explode(" ", $line);
  $replace = array("1" => "ANO", "2" => "NE");
  $data[1] = strtr($data[1], $replace);
?>
<tr>
  <td>
  <?php echo htmlspecialchars($data[0]); ?>
  </td>
  <td>
  <?php echo htmlspecialchars($data[1]); ?>
  </td>
</tr>
<?php
}

echo "</table>";
?>

PHP skoro vůbec nerozumím
Čiže databáza (MySQL a pod.) zrejme vôbec neprichádza do úvahy (a nie je ani potrebná).

spíše mi šlo o to, kam v tom kousku PHP vyvolat funkci "pošli email na adresu nekdo@neco.cz
Podľa mňa buď na začiatku alebo ešte skôr na konci.

Opravená syntaktická chyba.
BasMann
Profil
To je fofr... moc příjemné vědět, že někdo pomůže.
Form jsme vyřešili - nemám problém to nechat v jednom souboru.
Nemůžu vyzkoušet soubor anketa.php - na ř. 24 - fwrite = ($handle, $content); to píše chybu
Textový soubor - nešlo by za jménem vypsat ANO nebo NE místo čísla?
To že se občas texťák vymaže nevadí vůbec, je to jen na omezenou dobu - cca 2 týdny.
Email - ptám se opravdu jako naprostý amatér - co a kam mám napsat?

Díky moc
lionel messi
Profil
BasMann:
Nemůžu vyzkoušet soubor anketa.php - na ř. 24 - fwrite = ($handle, $content); to píše chybu
Odmaž znak =, správne je to takto:
fwrite($handle, $content);

Ospravedlňujem sa za mystifikáciu.

BasMann:
Textový soubor - nešlo by za jménem vypsat ANO nebo NE místo čísla?
Samozrejme, že áno, asi takto:
<?php
$lines = file("anketa.txt");
echo "<table>";
foreach ($lines as $line) {
  $data = explode(" ", $line);
  $replace = array("1" => "ANO", "2" => "NE");
  $data[1] = strtr($data[1], $replace);
?>
<tr>
  <td>
  <?php echo htmlspecialchars($data[0]); ?>
  </td>
  <td>
  <?php echo htmlspecialchars($data[1]); ?>
  </td>
</tr>
<?php
}
 
echo "</table>";
?>
BasMann
Profil
vůbec se neomlouvej... hledal jsem chybu, co jsem blbě opsal...
Takže teď už to funguje, zápis jde do anketa.txt.
A opět moje další hloupá otázka - lze to z toho txt dostat nějak do tabulky neboli na web? Asi to moc nechápu, když se v souboru vypis.php o tabulce a řádcích mluví...

Díky
lionel messi
Profil
BasMann:
A opět moje další hloupá otázka - lze to z toho txt dostat nějak do tabulky neboli na web?
Jasné, že to ide. Ešte raz si prečítaj môj príspevok [#4], konkrétne časť od: „Výpis navrhujem riešiť na inej stránke, nazvime ju trebárs vypis.php nasledovne: “, nižšie nájdeš aj kód, ktorý by mal vyriešiť výpis do tabuľky.

Ešte čo sa týka mailu — netuším, kedy chceš, aby k odoslaniu správy prišlo a čo má byť jej obsahom, preto zatiaľ môžem odporučiť iba všeobecný návod na posielanie mailu Nejčastější potíže s PHP (FAQ) » Kódování e-mailu, aneb abychom neposílali otazníky. (v núdzi postačí i obyčajné použitie funkcie mail, je však nespoľahlivé). Asi by som to riešil na konci súboru anketa.php.


Doplnenie: Vrelo odporúčam prechod na hosting s podporou PHP 5 (je súčasťou viacerých freehostingov), ak sa chceš dozvedieť viac, založ si prosím nové vlákno v kategórii Hosting (mimo tejto kategórie platí zákaz debát o hostingoch).
BasMann
Profil
tak to jsem v pasti... původně jsem měl stránku.php, kde je formulář a pod ním tabulka.
Vytvořil jsem dle návodu výpis.php a vložil celý kód z příspěvku, anketa.txt který je prázdný a původní stránku.php jsem přejmenoval na anketa.php, ale nikde jinde než v *.txt se ten zápis neobjeví. Četl jsem to poctivě 2x.

Díky


ještě mi prosím upřesni ty verze PHP.
Na začátku píšeš " funguje až od PHP 5.4.0 (vrátane)", a na konci "s podporou PHP 5"... je to asi docela rozdíl...

Díky
lionel messi
Profil
BasMann:
Vytvořil jsem dle návodu výpis.php a vložil celý kód z příspěvku, anketa.txt který je prázdný a původní stránku.php jsem přejmenoval na anketa.php
Čo presne máš teraz v súbore vypis.php? Už sa v tom trochu začínam strácať.



Na začátku píšeš " funguje až od PHP 5.4.0 (vrátane)", a na konci "s podporou PHP 5"... je to asi docela rozdíl...
Uvedené ukážky kódu som okrem úplne prvej po upozornení na starú verziu PHP písal tak, aby boli použiteľné i s PHP 4 a jeho verziou bežiacou na WebZdarma. Ako som však už spomínal, odporúčam prechod na hosting aspoň s PHP 5.2, ideálne ešte o niečo vyšším (posledná verzia je PHP 5.6, ale tá zrejme skoro nikde nie je nasadená, 5.5 sa už dá zohnať bez väčších problémov).
BasMann
Profil
pouze toto
<?php
$lines = file("anketa.txt");
echo "<table>";
foreach ($lines as $line) {
  $data = explode(" ", $line);
  $replace = array("1" => "ANO", "2" => "NE");
  $data[1] = strtr($data[1], $replace);
?>
<tr>
  <td>
  <?php echo htmlspechialchars($data[0]); ?>
  </td>
  <td>
  <?php echo htmlspechialchars($data[1]); ?>
  </td>
</tr>
<?php
}
 
echo "</table>";
?>
lionel messi
Profil
BasMann:
Opäť som tam zaniesol drobnú chybu, prepáč, správne:

<?php
$lines = file("anketa.txt");
echo "<table>";
foreach ($lines as $line) {
  $data = explode(" ", $line);
  $replace = array("1" => "ANO", "2" => "NE");
  $data[1] = strtr($data[1], $replace);
?>
<tr>
  <td>
  <?php echo htmlspecialchars($data[0]); ?>
  </td>
  <td>
  <?php echo htmlspecialchars($data[1]); ?>
  </td>
</tr>
<?php
}
 
echo "</table>";
?>
Má to totiž byť htmlspecialchars, nie htmlspechialchars.
BasMann
Profil
to je SUPEEEER!!!! FUNGUJE na JEDNIČKU.
Ještě trošku poupravím ve vypis.php "class" u tabulky a je to hotovo.

A jdu vážně přemýšlet o verzi PHP...

Strašně moc díky.


ještě jsem zapoměl doplnit, že jsem ten výpis.php dostal do původní tabulky pomocí include

<?php include "vypis.php";?>
BasMann
Profil
Mám ještě jeden drobný postřeh, pokud je to řešitelné...
Když zapíšu Jméno a Příjmení (2 slova s mezerou), tak se zapíše pouze jméno - zkusil jsem zapsat "Uživatel 1" a do tabulky se vypsalo pouze "Uživatel". Lze s tím něco udělat?

Díky
Keeehi
Profil
Je tomu tak, protože mezera je používaná jako dělící znak mezi jménem a uloženou hodnotou. Změň si skript tak, aby používal jiný znak (třeba #) a už to bude ok. Samozřejmě, že zase nastanou problémy, pokud by někdo měl ve jméně znak #, ale nikoho takového neznám ;) Takže ale nezapomeň to po uživateli při odesílání zkontrolovat, zda ti tam náhodou ten znak neposílá a případně mu "vynadat" a nebo lépe ten znak vy všech výskytech odstranit. Dalším nebezpečnám znakem je znak pro konec řádku. A pravděpodobně ješte spousta věcí ohledně bezpečnosti ale tl;dr
BasMann
Profil
opravdu nikdo ve jméně # nemá, ale již jsem psal že je pro mne PHP absolutní neznámá... takže fakt nevím který script a kde bych měl změnit.
Pokud je tento script nebezpečný, můžu to po doporučení ošetřit loginem.
Ale i přesto díky za reakce.
BasMann
Profil
Mohl by mi prosím někdo poradit, jak "změnit script", aby šlo zapsat 2 slova i s mezerou do jednoho řádku tabulky? Fakt tomu nerozumím...
lionel messi
Profil
BasMann:
opravdu nikdo ve jméně # nemá, ale již jsem psal že je pro mne PHP absolutní neznámá... takže fakt nevím který script a kde bych měl změnit.
Musíš patrične zmeniť oba súbory. Kód na zápis bude vyzerať takto (zmeny zvýrazňujem):
<?php
if (isset($_POST["submit"])) {
  $name = $_POST["Name"];
  $value = $_POST["radio"];
  if (strstr($name, "#")) {
    str_replace("#", "", $name);
  }
  $content = $name . "#" . $value . PHP_EOL;
  $handle = fopen("anketa.txt", "a");
  fwrite($handle, $content);
  fclose($handle);
}
?>
(ak zadá návštevník mriežku, bude odstránená).

A kód na výpis takto:
<?php
$lines = file("anketa.txt");
echo "<table>";
foreach ($lines as $line) {
  $data = explode("#", $line);
  $replace = array("1" => "ANO", "2" => "NE");
  $data[1] = strtr($data[1], $replace);
?>
<tr>
  <td>
  <?php echo htmlspecialchars($data[0]); ?>
  </td>
  <td>
  <?php echo htmlspecialchars($data[1]); ?>
  </td>
</tr>
<?php
}
 
echo "</table>";
?>


Odporúčam naštudovať aspoň základy PHP, inak sa ďaleko nedostaneš, budeš sa stále pýtať ostatných na jednoduché veci, ktoré nájdeš v každej solídnej učebnici, napr. na Péhápko: Učebnice PHP. A mimochodom, nakopávanie (ako v [#17]) je tu zakázané.
BasMann
Profil
To je ono, už se to zapisuje komplet... Omlouvám se, nemyslel jsem to zle a nechtěl jsem porušit PRAVIDLA - měl jsem obavu, že je to po posledním poděkování uzavřené...
Odkaz na PHP jsem si uložil.
Díky moc za pomoc.
Fisir
Profil
Reaguji na BassManna:
Od jakéhokoli hostingu s PHP 4 doporučuji rychle utíkat, vždyť je to verze tisíc let stará.

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: