Diskuze: Odeslání dat
V předchozím kvízu, Online test znalostí JavaScript, jsme si ověřili nabyté zkušenosti z kurzu.

Člen

Zobrazeno 28 zpráv z 28.
V předchozím kvízu, Online test znalostí JavaScript, jsme si ověřili nabyté zkušenosti z kurzu.
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.
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>
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.
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?
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.
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.
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?
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',
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á.
Jinak odeslání normálním způsobem bylo myšleno serverově. Bez JS. A to se bez problémů uložilo
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
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.
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?
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.
Bez změny. Toto už jsem dokonce zkoušel. Postupně jsem umazával a nic
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',
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í.
To přece není možné. Co vidíš když dáš do prohlížeče "https://admin.kaleis.cz/online-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.
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.
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
Zobrazeno 28 zpráv z 28.