IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
gorri
Člen
Avatar
gorri:16.12.2019 17:12

Zdravím zkušenější,

s JS teprve začínám a chtěl jsem si zkusit uložit data z formuláře přes JS. Na netu jsem našel různá řešení i na youtube ale nějak se mi nedaří zprovoznit odesílání. Vždy se mi ukáže, že Zpráva nebyla odeslána.

Věděl by prosím někdo v čem je chyba?
Moc děkuji

Form

<script type="text/javascript">
$("form").submit(function(e) {
    e.preventDefault();

    $.post(
            './online-chat/save-message.php',
            {
                message: $("#msg").val()
            },
            function(result) {
                if(result == "success")
                {
                    $("#result").html("Zpráva odeslána");
                }
                else
                {
                    $("#result").html("Zpráva neodeslána");

                }
            }
                );
});
</script>


<form method="POST" id="mesg" action="">
    <input type="text" name="messag" id="msg" placeholder="Napište zprávu" title="Napište zprávu">
    <input type="submit" id="odeslat" name="send" value="Odeslat" title="Odeslat zprávu">
    <p id="result"></p>
</form>

save-message.php

$res = prepare(Db::query('INSERT INTO pending_comunication (zprava) VALUES (?)'));
    $res -> bind_param("ssi", $message);
    if($res -> execute())
    {
        echo 'success';
    }
    else
    {
        echo 'error';
    }

Zkusil jsem: Stackoverflow, youtube, google

Chci docílit: Odeslání formuláře

Odpovědět
16.12.2019 17:12
Když vím, tak poradím. Nikdo neví všechno :-)
Avatar
Radek Veverka
Tvůrce
Avatar
Radek Veverka:16.12.2019 17:34

Dám ti tip jak najít, kde je chyba:
Zpráva neodeslána. Ok, to znamená, že to po response vklouzlo do else větve. A cože je tedy vlastně v proměnné result? Vyprinti si to nebo použij debugger. Je tam co očekáváš? Není? Pak pravděpodobně php skript odeslal něco blbě. Dost možná v result budeš mít nějaký php error.
Dle php erroru, pokud tam je, oprav php skript. Error ti řekne víc. Nebude tam něco jako funkce prepare není definovaná? Vypadá to že si nedal kompletní kód, takže těžko posoudit co máš zle. (co je identifikátor Db?)
Takto je třeba se naučit postupovat, jinak nic moc sám neopravíš.
Takže první krok: zjisti chybové hlášení. Pokud je, lépe pro tebe, protože víš, co máš opravit. Pokud není, tak je to horší, budeš mít těžší práci - najdi chybu pomocí výpisů proměnných nebo debuggeru.

 
Nahoru Odpovědět
16.12.2019 17:34
Avatar
gorri
Člen
Avatar
Odpovídá na Radek Veverka
gorri:16.12.2019 17:57

Právě že to žádnou chybu nevypisuje. Script je kompletní. A ty chybu vidíš nebo ne?
Já mám připojení k Db includovane.
Zajímavé je, že v PHP scriptu mám i zobrazování chyb a nic mi to neukazuje. Podle mě je špatná cesta ke scriptu. Nevím jak ji zapsat když ji mám ve stejné složce jako script kde je form.
Mám to vše ještě v podsložkách.
takto vypadá php script

<?php
include ('connect.php');
ini_set('display_errors', 1);
    $message = $_POST['messag'];
    $res = prepare(Db::query('INSERT INTO pending_comunication (zprava) VALUES (?)'));
    $res -> bind_param("ssi", $message);
    if($res -> execute())
    {
        echo 'success';
    }
    else
    {
        echo 'error';
    }

Zkusil jsem to i po staru tak jak to píšu a taky nic

include ('connect.php');
ini_set('display_errors', 1);
    $message = $_POST['messag'];
    Db::query('INSERT INTO pending_comunication (zprava) VALUES (?)', $message);

Toto je formulář s JS

<form method="POST">
    <input type="text" name="messag" id="msg" placeholder="Napište zprávu" title="Napište zprávu">
    <input type="submit" id="odeslat" name="send" value="Odeslat" title="Odeslat zprávu">
    <p id="result"></p>
</form>
<script type="text/javascript">
$("form").submit(function(e) {
    e.preventDefault();

    $.post(
            './online-chat/save-message.php',
            {
                message: $("#msg").val()
            },
            function(result) {
                if(result == "success")
                {
                    $("#result").html("Zpráva odeslána");
                }
                else
                {
                    $("#result").html("Zpráva neodeslána");

                }
            }
                );
});
</script>
Nahoru Odpovědět
16.12.2019 17:57
Když vím, tak poradím. Nikdo neví všechno :-)
Avatar
gorri
Člen
Avatar
gorri:16.12.2019 18:05

Ještě jsem se díval přes F12 a to mi vypisuje stále to stejné. Ke scriptu to dojde. Vždy. A to je vše. K zápisu vůbec ale nedojde. :(
Už se tady s tím patlám dobrý 4 hodiny a proto jsem napsal tady. Už fakt netuším.

Nahoru Odpovědět
16.12.2019 18:05
Když vím, tak poradím. Nikdo neví všechno :-)
Avatar
Radek Veverka
Tvůrce
Avatar
Odpovídá na gorri
Radek Veverka:16.12.2019 18:09

Já tam chybu nevidím, protože to ani nijak detailně nezkoumám, jenom tě zkouším navést, jak ji objevit.
Takže:
Co se nachází v proměnné result? Přidej console.log(result) do větve else při zpracování výsledku requestu.
Myslíš, že chyba je v URL, ok. Tak zjisti, jestli se php skript spouští. Dej na začátek php skriptu třeba

echo("Spustil jsem se, url je správně.")
exit;

Vypíše se ti to v js do konzole po kliknutí na tlačítko?

 
Nahoru Odpovědět
16.12.2019 18:09
Avatar
gorri
Člen
Avatar
Odpovídá na Radek Veverka
gorri:16.12.2019 18:21

Nevypíše se nic. A log mi ukazuje "Komunikace nenalezena". Takže mám chybu v odeslání. Script je ale v pořádku. Zkusil jsem odeslat normálním způsobem a jde.
Takže podle mě bude chyba v nasměrování na script. Nejspíše.

Nahoru Odpovědět
16.12.2019 18:21
Když vím, tak poradím. Nikdo neví všechno :-)
Avatar
don.jarducius:16.12.2019 18:31

Zkus si ověřit názvy proměnných … všechno je totiž jestli koukám jen o jednom e :)

PS: Když se točíš 4 hodiny v kruhu, dej si pauzu, něco sněz, napij se, minutku si něco zahraj a pak si to zkus znovu zkontrolovat, uvidíš, pomáhá to.

Nahoru Odpovědět
16.12.2019 18:31
Ten kdo nechce hledá důvod, ten kdo chce hledá způsob
Avatar
Radek Veverka
Tvůrce
Avatar
Odpovídá na gorri
Radek Veverka:16.12.2019 18:36

Takže ono se php vůbec nespustí. To jsem z tvého původního dotazu myslel, že jo, protože si psal, že to vypíše "Zpráva nebyla odeslána.". Co je odeslání "normálním způsobem"? A dal bys sem kopii logu? Chce to být trochu konkrétnější. Nemáš třeba v html hlavičce base tag?

 
Nahoru Odpovědět
16.12.2019 18:36
Avatar
gorri
Člen
Avatar
gorri:16.12.2019 18:39

Jak to myslíš, že se to točí okolo "e"?
S JS se teprve učím. A základem je formulář.
Abych se přiznal, tak toto jsem dělal podle videa. Vždy jsem se pak díval co dělám. Ať tam nedám nějakou kravinu. Ale to "e" jsem nepochopil. No hlavní je, že se script ani nechce načíst.
Nevím jak ho do zapsat. myslím jestli má jít cesta jako při include nebo stačí, že je v adresáři, kde se nachází i formulář.
Toto myslím

$.post(
            'save-message.php',
Nahoru Odpovědět
16.12.2019 18:39
Když vím, tak poradím. Nikdo neví všechno :-)
Avatar
gorri
Člen
Avatar
Odpovídá na Radek Veverka
gorri:16.12.2019 18:40

To jsi pochopil špatně. A teď i opravdu vidím, že jsi se na to nedíval.
Kdyby ano, tak vidíš, že v JS je ta hláška napsaná.

Nahoru Odpovědět
16.12.2019 18:40
Když vím, tak poradím. Nikdo neví všechno :-)
Avatar
gorri
Člen
Avatar
Odpovídá na gorri
gorri:16.12.2019 18:49

Jinak odeslání normálním způsobem bylo myšleno serverově. Bez JS. A to se bez problémů uložilo

Nahoru Odpovědět
16.12.2019 18:49
Když vím, tak poradím. Nikdo neví všechno :-)
Avatar
Radek Veverka
Tvůrce
Avatar
Radek Veverka:16.12.2019 18:54

Právě protože je tam napsaná, tak jsem se domníval, že tvůj php skript se normálně spustí :)
Protože ten callback je volaný při úspěšném requestu. Proto se z tebe snažím neúspěšně dostat, co je v proměnné result. Takže jsem to myslel správně.

Tím 'e' pravděpodobně myslel toto:

$message = $_POST['messag'];

Chybí ti tam "e" na konci. To by mohlo vyřešit tvůj problém, páč to vypadá na tu chybu, kterou si měl najít :)

 
Nahoru Odpovědět
16.12.2019 18:54
Avatar
gorri
Člen
Avatar
Odpovídá na Radek Veverka
gorri:16.12.2019 18:56

To už jsem zkusil. Není to ono. To jsem jen různě přepisoval a když jsem to posílal, tak jsem tam omylem toto nechal.

Nahoru Odpovědět
16.12.2019 18:56
Když vím, tak poradím. Nikdo neví všechno :-)
Avatar
Radek Veverka
Tvůrce
Avatar
Odpovídá na gorri
Radek Veverka:16.12.2019 19:09

Zkus ještě přidat ošetření fail:

$.post(
            './online-chat/save-message.php',
            {
                message: $("#msg").val()
            },
            function(result) {
                if(result == "success")
                {
                    $("#result").html("Zpráva odeslána");
                }
                else
                {
                    $("#result").html("Zpráva neodeslána");

                }
            }
                ).fail((err) => { console.log(err) });
});

Vypíše to něco do konzole?

 
Nahoru Odpovědět
16.12.2019 19:09
Avatar
gorri
Člen
Avatar
Odpovídá na Radek Veverka
gorri:16.12.2019 19:14

Opět mi to ukazuje jen Komunikace nenalezena. :(

Nahoru Odpovědět
16.12.2019 19:14
Když vím, tak poradím. Nikdo neví všechno :-)
Avatar
Radek Veverka
Tvůrce
Avatar
Odpovídá na gorri
Radek Veverka:16.12.2019 19:18

Můžeš prosím poslat printscreen?

 
Nahoru Odpovědět
16.12.2019 19:18
Avatar
gorri
Člen
Avatar
gorri:16.12.2019 19:25

Nevím ale co z toho vykoumáš. Já sám už to nechápu. Vše OK ale nic není OK :-D

Nahoru Odpovědět
16.12.2019 19:25
Když vím, tak poradím. Nikdo neví všechno :-)
Avatar
gorri
Člen
Avatar
gorri:16.12.2019 19:30

Zkusil jsem se prohrabat logem a ani tam jsem nic nenašel. Podle všeho se PHP script načítá ale výsledek tomu neodpovídá.

Nahoru Odpovědět
16.12.2019 19:30
Když vím, tak poradím. Nikdo neví všechno :-)
Avatar
Radek Veverka
Tvůrce
Avatar
Odpovídá na gorri
Radek Veverka:16.12.2019 20:18

Výborně. Tak z toho je jasně vidět že zlobí to URL.
Zkus zadat do jquery.post url takto:

"/online-chat/save-message.php"

Důležité je to lomítko na začátku.

 
Nahoru Odpovědět
16.12.2019 20:18
Avatar
gorri
Člen
Avatar
Odpovídá na Radek Veverka
gorri:17.12.2019 6:51

Bez změny. Toto už jsem dokonce zkoušel. Postupně jsem umazával a nic :(

Nahoru Odpovědět
17.12.2019 6:51
Když vím, tak poradím. Nikdo neví všechno :-)
Avatar
Radek Veverka
Tvůrce
Avatar
Odpovídá na gorri
Radek Veverka:17.12.2019 9:19

Hmm, divné. Nezměnilo se ani výsledné URL requestu? To co jde vidět na těch printscreenech co jsi poslal.
Funguje aspoň toto?

$.post(
            'https://admin.kaleis.cz/online-chat/save-message.php',
 
Nahoru Odpovědět
17.12.2019 9:19
Avatar
gorri
Člen
Avatar
Odpovídá na Radek Veverka
gorri:17.12.2019 9:30

Stále neodesláno. Asi si s tím ještě dnes pohraju. V opačném případě se na to vyprdnu. Což je škoda. JS umožňuje dost věcí.

Nahoru Odpovědět
17.12.2019 9:30
Když vím, tak poradím. Nikdo neví všechno :-)
Avatar
Radek Veverka
Tvůrce
Avatar
Odpovídá na gorri
Radek Veverka:17.12.2019 10:33

To přece není možné. Co vidíš když dáš do prohlížeče "https://admin­.kaleis.cz/on­line-chat/save-message.php". Existuje ten souboru vůbec? Prosím ještě ty screeny co jsi dal minule, ale tentokrát pro pro tu absolutní url v předchozím příspěvku.

 
Nahoru Odpovědět
17.12.2019 10:33
Avatar
gorri
Člen
Avatar
Odpovídá na Radek Veverka
gorri:17.12.2019 10:58

Je tady víc divných věcí. Toto by mělo normálně fungovat

<script src="https://code.jquery.com/jquery-3.4.1.js"></script>
  <form id="message">
      <div class="form-group">
    <input type="text" name="zprava" id="zprava" placeholder="Napište zprávu">
      </div>
      <div class="form-group">
    <input type="button" id="send" value="Uložit">
      </div>
</form>

<script>
    $(document).ready(function(){
        $("#send").click(function(){
           $.ajax({
              url:"save_post.php",
              type:"post",
              date:$("#message").serialize(),
              success:function(d)
              {
                  alert(d);
              }
           });
        });
    });
</script>

V save_post.php mám

<?php
ini_set('display_errors', 0);
var_dump($_POST);

mělo by to v alertu vypsat položky z formuláře. A ukáže to akorát to co je na obrázku. I když je to vyplněné. Zkusil jsem napsat podmínku, která jen kontroluje jestli je v inputu text. Při prázdném to ukázalo chybu ale při obsahu v textu to opět ukázalo chybu.
Už to nedělám v adminu. Dělám to na normální doméně. Ať vím kde mám chybu.
Takhle mám vše v root.

Nahoru Odpovědět
17.12.2019 10:58
Když vím, tak poradím. Nikdo neví všechno :-)
Avatar
gorri
Člen
Avatar
gorri:17.12.2019 11:03

Toto je při

print_r($_POST);
Nahoru Odpovědět
17.12.2019 11:03
Když vím, tak poradím. Nikdo neví všechno :-)
Avatar
gorri
Člen
Avatar
gorri:17.12.2019 11:18

Idiot. :-D :-D :-D
Našel jsem chybu :-D :-D
Písmenko :-D
místo data jsem napsal date :-D
Tak si jdu dál pokračovat s hraním

Nahoru Odpovědět
17.12.2019 11:18
Když vím, tak poradím. Nikdo neví všechno :-)
Avatar
gorri
Člen
Avatar
gorri:17.12.2019 11:18

Když to dodělám a bude to funkční, tak sem dám celý script.

Nahoru Odpovědět
17.12.2019 11:18
Když vím, tak poradím. Nikdo neví všechno :-)
Avatar
gorri
Člen
Avatar
gorri:17.12.2019 12:12

Tak. Sice by to chtělo ještě vyšperkovat ale základ je na světě. Jednoduché, přehledné

<?php
header("Content-Type: text/html; charset=UTF-8");
ini_set('display_errors', 0);
?>
  <script src="https://code.jquery.com/jquery-3.4.1.js"></script>
  <form id="message">
      <p id="result"></p>
    <input type="text" name="zprava" id="zprava" placeholder="Napište zprávu">
    <input type="button" id="send" value="Uložit">


</form>

<script>
    $(document).ready(function(){
        $("#send").click(function(){
           $.ajax({
              url:"save_post.php", // umístění odesílacího scriptu
              type:"post", // metoda odeslání
              data:$("#message").serialize(), // díky tomuto není nutné definovat pro každou položku var
              success:function(d) // úspěšné odeslání
              {
                  $("#result").html(d); // zobrazení informace o odeslání
                  $("#message")[0].reset(); // vyresetování formuláře
                  setInterval(
function()
{
$('#message').load(location.href + " #message");
}, 3000, ); // po 3 sekundách refresh formuláře. Aby zmizela hodnota $("#result").html(d);
              }
           });
        });
    });
</script>

odesílací script save_post.php

<?php
include ('connect.php');
ini_set('display_errors', 0);
if(empty($_POST['zprava']))
{
    echo 'Prazdne';
}
else
{
    if(Db::query('INSERT INTO zprava (zprava, datumacas) VALUES (?, ?)', $_POST['zprava'], date("Y-m-d H:i")))
    {
        echo 'OK';
    }
    else
    {
        echo 'Chyba';
    }
}

Vyzkoušeno a funguje.
Ostatní už je pak na každém jak si to poupravíte ;-)

Nahoru Odpovědět
17.12.2019 12:12
Když vím, tak poradím. Nikdo neví všechno :-)
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 28 zpráv z 28.