Využij akce až 30 % zdarma při nákupu e-learningu. Více informací. Zároveň je tento týden sleva až 80 % na e-learning týkající se C# .NET
Hledáme nového kolegu do redakce - 100% home office, 100% flexibilní pracovní doba. Více informací.
Avatar
gorri
Člen
Avatar
gorri:18.12.2019 11:29

Všechny zdravím a prosím o radu.
Včera se mi povedlo poprvé napsat zpracování formuláře ajaxem.
Ovšem jsem zjisti, že to ssebou nese menší problém.
Při zpracování nechce komunikovat s proměnnými a ani s URL (např. GET)
Myslím tím, že nechce umožnit PHP scriptu, který formulář ukládá do DB, aby si sáhnul pro hodnoty, které potřebuje. Něco z $_GET něco z DB.
Napadá někoho v čem by ohl být háček? Formulář funguje, vše se odesílá ale je tady ten problém se zpracováním.
Toto je formulář a ajax kód

<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" class="btn" id="send" name="send" value="Odeslat">
</form>
<script>
    $(document).ready(function(){
        $("#send").click(function(){
           $.ajax({
              url:"save-message.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)
              {
                  $("#result").html(d); // zobrazení informace o odeslání
                  $("#message")[0].reset(); // vyresetování formuláře
                  document.getElementById("result").style.display = "block";
              }

           });
        });
    });
</script>

a toto je PHP script save-message.php

include ('connect.php');
date_default_timezone_set("Europe/Prague");
ini_set('display_errors', 1);
if($_POST['send'])
{
    if(empty($_POST['zprava']))
{
    echo 'Prazdne';
}
else
{
    if(Db::query('INSERT INTO pending_comunication (zprava, uid) VALUES (?, ?)',
            $_POST['zprava'], $_GET['name']))
    {
        echo 'OK';
    }
    else
    {
        echo 'Chyba';
    }
}
}

Děkuji moc za případné připomínky a návrhy. :-)

Zkusil jsem: Google, protože ani nevím co bych hledal. S tímto jsem se nějak ještě nesetkal.

Chci docílit: Odeslat formulář i s daty z DB přípdně i z jiných proměnných.

Odpovědět
18.12.2019 11:29
Když vím, tak poradím. Nikdo neví všechno :-)
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:18.12.2019 21:14

1)

var_dump('get', $_GET);
var_dump('post', $_POST);
var_dump('request = post + get', $_REQUEST);

2)
Ty get parametry si muzes overit primym odkazem na kod. Ajaxove php je normalni php program.
mujserver.cz/save-message.php?zpra­va=123

3)

...if($_POST['send'])
...if(empty($_POST['zprava']))
...            $_POST['zprava'], $_GET['name']))
  • Pokud odesilas postem, tak get parametry nejsou. (odesilat prs get a post najednou tusim lze jen u formularu)
  • Jsi si jisty, ze odesilas vsechny parametry? send, zprava i name? Predevsim teda send je mi podezrely, protoze je uz v prvnim ifu.

Chces poradit? Pouzil pole. Zakoduj ho pomoci json. A odesli jako message nebo q, query.

'url?q=' + JSON.stringify(arr)
JSON.parse - dekoder stringu kodovanem do jsonu
php json_decode / json_encode
Editováno 18.12.2019 21:16
 
Nahoru Odpovědět
18.12.2019 21:14
Avatar
Odpovídá na gorri
Martin Konečný (pavelco1998):19.12.2019 0:19

Ahoj, je potřeba mít i něco v URL? Pokud vážně ano, pak můžeš při ajaxovém požadavku, kde zadáváš "url", ten parametr přidat, např.

$.ajax({
        url:"save-message.php?name=<?php echo $name; ?>"
        type:"post"
        data:$("#message").serialize()
});

Pokud to tolik nutné není, můžeš si to přes POST přidat třeba hidden inputem.

<input type="hidden" name="name" value="<?php echo $name; ?>">

Pokud se ti nechce dělat ani input, je stále možnost ta data do atributu "data" poslat jinak než jako řetězec. Z hlavy si teď nejsem přesně jistý, ale měly by fungovat nějaké takové možnosti:

  1. mít to jako pole, do kterého to pak předat ručně, v jQuery např.: https://stackoverflow.com/…ct-in-jquery

do toho pole to pak přidáš jednoduše jako pole["name"] = "jméno"

  1. použít JS objekt FormData
var form = $("#form");
var postData = new FormData(form[0]);  // první položka z pole proto, že je to JS objekt elementu, který objekt FormData vyžaduje

postData.append("name", "jméno");

$.ajax({
        data: postData
});
  1. vypsat si ty parametry ručně
data: {
        "zprava": $("#zprava").val(),
        "name": "jméno"
}
  1. jestli to odesílá přihlášený uživatel, pak máš jeho ID v session, a při ukládání zprávy do DB si to jméno můžeš vyhledat a nepřenášet ho někde v URL nebo formulářem
Nahoru Odpovědět
19.12.2019 0:19
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
gorri
Člen
Avatar
Odpovídá na Peter Mlich
gorri:19.12.2019 6:57

Děkuji za rady. Vzhledem k mé znalosti JS, jsem se raději rozhodnul vypsat si to do data:{} a pak to nechat jen script odeslat. I když se mi moc nelíbí, že data:{} jsou "veřejná" jelikož JS je klientský ale co se dá dělat. Snad si s těmi daty nebude nikdo před odesláním hrát. Jelikož se mi nechce PHP rozjet, protože je serverový a potřebuje refresh, tak mi asi nic jiného nezbude. Ale k tomuto se stejně ještě vrátím. Nemůžu to takhle nechat. :-)
Každopádně moc děkuji :-)

Nahoru Odpovědět
19.12.2019 6:57
Když vím, tak poradím. Nikdo neví všechno :-)
Avatar
gorri
Člen
Avatar
Odpovídá na Martin Konečný (pavelco1998)
gorri:19.12.2019 6:59

Ahoj. Moc děkuji za reakci. Už večer jsem to předělal na data:{}. Je to o něco lepší. Sice bych spíše kvůli další práci potřeboval data ověřit přes PHP ale co se dá dělat. Prozatím to nechám tak a pak se do toho zase někdy pustím :-)
Ale i tak děkuji za radu. :-)

Nahoru Odpovědět
19.12.2019 6:59
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 5 zpráv z 5.