Diskuze: Volání funkce pomoci tlacitka
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.
Wal De Mar-Lad:25.6.2017 17:54
Nijak. Ak to chceš riešiť čistým PHP, musíš mať v stránke formulár. Ale ak to má byť moderné riešenie, mal by si použiť JavaScript a nejaké RPC riešenie.
Petr Čech:25.6.2017 18:26
Uděláš si normální HTML formulář s tlačítkem. Formulář povede na
.php stránku, kde bude tvá funkce.
Důležité je pochopit princip, jakým PHP funguje:
- Uživatel si vyžádá od serveru stránku
- Server požadavek přijme, pokud je v pořádku a předá všechny parametry PHP
- PHP seskládá HTML výsledné stránky. Nic zatím neopustilo server.
- Na konci PHP vyplivne statické HTML, které vrátí klientovi.
- Klientův prohlížeč vezme HTML a vyrenderuje ho.
Jak vidíš, klient nemůže žádným způsobem volat přímo PHP, ale jen
posílat požadavky na server s nějakými parametry. To tlačítko udělá jen
to, že pošle požadavek na server s parametry, které určuje, co je ve
formuláři.
Až se dostaneš na vyšší úroveň, můžeš dělat takové srandičky jako
tlačítka, která volají php soubory, aniž by odesílaly stránku
(technologií AJAX), ale na to teď kašli.
A pokud to mám volat pomocí javascriptu tak na to použiju asi onclick ale co použit u toho php aby vědělo že jsem mu poslal přikaz pomocí javascriptu?
Michal Šmahel:25.6.2017 20:34
To je jednoduché. Navážu na Petra. Máme tedy vyřešené HTML i PHP. HTML formuláři přidáš nějaké ID (v příkladu: "formular"). Po kliknutí na tlačítko (chceš onclick, tak přes něho) se formuláři řekne, aby se odeslal na server pro PHP.
<!-- HTML -->
<form id="formular">
<!--- ... -->
</form>
<button onclick="odesliFormular();">Odeslat formulář</button>
// JS
function odesliFormular() {
document.getElementById("formular").submit();
}
// PHP
if($_POST) {
// ...
}
Pokud je tlačítko ve formuláři, určitě je lepší vyřešit to přes HTML.
<input type="submit" value="Odeslat formulář" />
To php s if musí byt až pod javascript kódem nebo kdekoliv na stránce?
katrincsak:26.6.2017 7:48
Možností máš více, vytvořil jsem ti jednoduchý kod, který by ti měl stačit. Samozřejmě je potřeba provádět i nějaké ošetření atp. Ale odesláním formuláře, se odešlou veškeré inputy ve formuláři a pak to již zpracuješ jako klasický POST. Dal jsem ti do konečného zpracování alert, tak ty si pak můžeš smazat.Většinou se místo toho dává nějaká událost. Jako třeba vložíš text, že vše proběhlo v pořádku atp. Druhý alert spíše ale hlásí chybu. V ajaxu si jen nastav cest k php souboru vlož tam můj příklad a mělo by ti to fungovat, ale hoď si to do čistého prázdnéo souboru, ať ti to zbytečně něco neovlivňuje. Pak si s tím už jen hrát
Netestoval jsem to, dělal jsem to teď ve vlaku.
/* PHP */
if($_POST['action'] == "odesliFormular"){
// Zde již proces, který chceš provést
echo json_encode(array("result" => "OK", "msg" => "Vše proběhlo v pořádku")); exit;
}else{
echo json_encode(array("result" => "OK", "msg" => "Akce neexistuje")); exit;
}
/* ajax/js -> vlož do js souboru, nebo klasicky do html */
function mujAjaxNaOdeslani(formular){
$.ajax({
url: '/cesta/k/php/soubor.php',
data: {
action: "odesliFormular",
data: formular
},
dataType: 'json',
cache : false,
type : "post",
})
.done(function(data){
if(data.result == "OK"){
alert(data.msg);
}else{
alert(data.msg);
}
})
.fail(function() {
alert( "Fail" );
});
}
$(document).on("submit", "#mujFormular", function(e) {
mujAjaxNaOdeslani($(this).serialize());
return false;
});
Michal Šmahel:26.6.2017 10:00
Zase mu neblbni hlavu, AJAX na něho už bude moc, si myslím... Každopádně to máš řešené hezky. Jen se dá využívat funkce .success(), na kterou skript přejde, pokud byl požadavek úspěšný.
Submit se nechá v jeho případě v pohodě řešit klasicky odesláním HTTP požadavku bez Javascriptu (jak to dělá HTML).
Děkuji za rady.
Ještě mám jednu věc mám funkci v php pro odeslání REST
mám vytvořenou tabulku kde jsou data v databázi a potřeboval bych poradit
jak udělat pomocí tlačítka odešli REST po kliknutí aby se na pozadí
zvolená data z databáze odeslala
zatím mám kód
index.php
vypis z tabulky z databaze a na stejném řádku tlačítko
<button onClick="abra_button('.$radek->id.');">odešli REST</button>
kód pro odeslání rest
<?php
$zaznamy= array();
if (isset($_REQUEST["send_aa_api"])){
$id=$_REQUEST["send_aa_api"]+0;
OtevriDB();
$sql='SELECT `ticket`,`sn`,`nah_dily`,`opr_cena` FROM `opravy` WHERE `id`="'.($id).'" AND `del`="0" ';
$dx=mysql_query($sql);
$i=0;
while ($radek=mysql_fetch_object($dx)){
$ozn_ticketu=$radek->opr_ticket;
$ozn_sn=$radek->sn;
$zaznamy[$i]['text']=$radek->nah_dily;
$zaznamy[$i]['vat']='0';
$zaznamy[$i]['amount']=$radek->opr_cena;
// $i++;
// $i<3;
}
//přes proměnou $vysledek se odešle funkce pro rest
$vysledek=WriteST($ozn_ticketu,$ozn_sn,$zaznamy);
echo $vysledek;
}
?>
mělo by to fungovat že kliknutím na tlačítko naurčitém řádku se
pošle id řádku do kódu pro odeslání rest kde se z databáze do pole
vyplní hodnoty a pošlou se přes proměnou $vysledek, mám to celé na jedné
stránce ale asi to mám celý blbě, pokud tam nedám if a kód mám pro
odeslání rest na čisté stránce tak to vybere poslední řádek v databázi
a po refresh stránky odešle správně ale nemůžu sprovoznit jak po kliknutí
na tlačítko aby se odeslal z databáze ten správný řádek s id. Snad jsem
to napsal srozumitelně.
děkuji
Michal Šmahel:26.6.2017 10:08
Nejprve bych prosil používat tlačítko "Odpovědět". Odpovědi jsem si všiml jen náhodou.
Vytvoříš si dva (nebo tři) soubory: pro PHP a HTML + Javascript (nebo Javascript oddělit do samostatného). V PHP souboru budeš zpracovávat požadavek (jak jsem naznačil) z formuláře v HTML souboru.
HTML (+ Javascript) soubor (fromular.html):
<script>
// Javascript pro ovládání tlačítka
function odesliFormular() {
document.getElementById("formular").submit();
}
</script>
<!-- HTML formulář -->
<form method="POST" action="zpracovani-formulare.php" id="formular">
<!-- Tady si dáš nějaké prvky formuláře, které potřebuješ (input, textarea, ...) -->
</form>
<!-- Tlačítko pro odeslání -->
<button onclick="odesliFormular();">Odeslat formulář</button>
PHP soubor (zpracovani-formulare.php):
// Pokud přijde požadavek přes POST
if($_POST) {
// Něco vykonat...
}
katrincsak:26.6.2017 10:08
Je to jednoduchá konstrukce a tak si myslím, že to asi nevadí. Tohle může použít prakticky kdekoliv, ale s tím success máš určitě pravdu.
Michal Šmahel:26.6.2017 10:15
Pozor na mysql_ funkce, již nejsou podporované v nových verzích PHP a jsou velmi nebezpečné.
Mimochodem, není možné to tlačítko umístit přímo do formuláře, aby jsi to nemusel řešit Javascriptem?
To ID si ulož o nějakého pole (input) a odesílej do do PHP souboru (u tebe nejspíše tentýž).
Ještě bych poprosil o rozšířený HTML kód.
<input type="number" value="0" placeholder="Zadej ID" />
Michal Šmahel:26.6.2017 10:16
Formulář by mohl vypadat i nějak takto:
<form method="POST" action="nazev-souboru.php" id="formular">
<input type="number" value="0" placeholder="Zadej ID" />
<input type="submit" value="Odeslat formulář" />
</form>
Michal Šmahel:26.6.2017 10:22
Ještě bych chtěl upozornit na funkci PHP. PHP je jazyk běžící na serveru. Jeho skript je zpracováván pouze, jestliže obdrží nějaký požadavek (např. od HTML nebo Javascriptu).
Javascript běží na straně klienta. Může tedy reagovat na interakce uživatele a dále je zpracovávat a s uživatelem komunikovat. V poslední řadě může komunikovat i se serverovými jazyky (PHP, node.js, Java, ...) přes již zmiňovaný AJAX z důvodů např. použití databáze nebo menší zátěže na straně klienta.
Ty tedy musíš odeslat požadavek (kliknutím na tlačítko typu submit ve formuláři), který si PHP převezme, zpracuje ho a vrátí nějaký výsledek (HTML).
michal Čepelák:26.6.2017 10:41
tabulka i s tlačitkem je víc přiloha. Je tam tlačítko odešli rest po stisknutí by se mělo provést tento kód
OtevriDB();
$sql='SELECT `ticket`,`sn`,`nah_dily`,`opr_cena` FROM `opravy` WHERE `id`="'.($id).'" AND `del`="0" ';
$dx=mysql_query($sql);
$i=0;
while ($radek=mysql_fetch_object($dx)){
$ozn_ticketu=$radek->opr_ticket;
$ozn_sn=$radek->sn;
$zaznamy[$i]['text']=$radek->nah_dily;
$zaznamy[$i]['vat']='0';
$zaznamy[$i]['amount']=$radek->opr_cena;
// $i++;
// $i<3;
}
//přes proměnou $vysledek se odešle funkce pro rest
$vysledek=WriteST($ozn_ticketu,$ozn_sn,$zaznamy);
michal Čepelák:26.6.2017 11:54
</table>
<p></p>
<div class="uzivtable2">
<table class="uzivtable2" border="1" cellspacing="0">
<tr class="nadpis" align="center" >
<td >č.p.</td>
<td >datum</td>
<td> Ticket</td>
<td >S/N</td>
<td >Typ desky</td>
<td width="100px" >MAC</td>
<td >Od koho</td>
<td >Přislušenství </td>
<td >Závada</td>
<td >Náhradní dily</td>
<td >Opravil</td>
<td >Wizard</td>
<td >Poznámka</td>
<td>Cena opravy</td>
<td >Čas práce</td>
<td>-</td>
</tr>
<?php
OtevriDB();
$sql='SELECT opra. *,user.jmeno AS uziv_jmeno FROM opra LEFT JOIN user ON (user.id=opra.opravil) WHERE opra.del=0 ORDER BY id DESC ';
// $sql='SELECT opra.*,user.jmeno as uziv_jmeno FROM opra ';
//echo $sql;
//die;
$h=mysql_query($sql);
while ($radek=mysql_fetch_object($h)){
echo'
<tr class="radekdat">
<td align="center"><form action="" method="get"><input name="id" type="hidden" value="'.$radek->id.'" />'.$radek->id.'</td>
<td align="center"><div style="width:70px" >'.$radek->datum.'</div></td>
<td aling="center">'.$radek->opr_ticket.'</td>
<td align="center"><div style="width:74px" >'.$radek->sn.'</div></td>
<td align="center"><div style="width:70px" >'.$radek->typ_desky.'</div></td>
<td align="center"><div style="width:100px; word-wrap: break-word" >'.$radek->mac.'</div></td>
<td align="center"><div style="width:85px;word-wrap: break-word" >'.$radek->od_koho.'</div></td>
<td><div style="width:90px;word-wrap: break-word" >'.$radek->prislu.'</div></td>
<td><div style="width:118px;word-wrap: break-word" >'.$radek->zavada.'</div></td>
<td><div style="width:110px;word-wrap: break-word" >'.$radek->nah_dily.'</div></td>
<td align="center"><div style="width:100px" >'.$radek->uziv_jmeno.'</div></td>
<td align="center"><div style="width:70px" >'.$radek->wizard.'</div></td>
<td><div style="width:90px;word-wrap: break-word" >'.$radek->poznamka.'</div></td>
<td align="center">'.$radek->opr_cena.'</td>
<td align="center"><div style="width:40px;word-wrap: break-word" >'.$radek->timeh.':'.$radek->timem.'</div></td>
<td align="center"><div style="width:110px" > <input name="editace" type="submit" value="edituj" style="border: 1px solid black; font-size:10px;" /><input name="delete" type="submit" onClick="return zeptejse();" value="smaž" style="border: 1px solid black; font-size:10px;" /></div>
<i class="" onClick="aa_button('.$radek->id.');">odešli rest</i>
</form></td>
</tr>
';
}
?>
</table>
To je HTML kód tabulky na obrázku nahoře
HTML mám dohromady s PHP kódem
Michal Šmahel:26.6.2017 19:37
Aha, děkuji. Pořád zcela nechápu, co přesně potřebuješ. Napiš, jaký je výchozí stav a poté, jak má vypadat výsledek. Když to dáš i do obrázku bude to ideální.
michal Čepelák:27.6.2017 7:37
výchozí stav je ta tabulka s daty a tam pokud kliknu na tlačítko "odešli
rest" tak by se po zmáčknutí tlačítka odešle ID toho řádku, kde jsem
kliknul na tlačítko a zpracuje se tento kód, který přes proměnou $vysledek
to odešle pryč.
Než to odešle musí z databáze načíst do pole určená data.
OtevriDB();
$sql='SELECT `ticket`,`sn`,`nah_dily`,`opr_cena` FROM `opravy` WHERE `id`="'.($id).'" AND `del`="0" ';
$dx=mysql_query($sql);
$i=0;
while ($radek=mysql_fetch_object($dx)){
$ozn_ticketu=$radek->opr_ticket;
$ozn_sn=$radek->sn;
$zaznamy[$i]['text']=$radek->nah_dily;
$zaznamy[$i]['vat']='0';
$zaznamy[$i]['amount']=$radek->opr_cena;
// $i++;
// $i<3;
}
//přes proměnou $vysledek se odešle funkce pro rest
$vysledek=WriteST($ozn_ticketu,$ozn_sn,$zaznamy);
Michal Šmahel:27.6.2017 7:45
Aha, už to chápu. Co přesně tedy nefunguje??
michal Čepelák:27.6.2017 8:42
nevím jak udělat aby se mi po stisknutí tlačítka odeslal $vysledek
pokud použiju ten kód na samostatné stránce a vložím tam ručně číslo
ID tak to odešle data OK, ale nevím jak zprovoznit to tlačítko.
- Štýly prosím ťa píš do externého .css súboru, pretože takto je to HTML tak neprehľadné, že sa mi to nechcelo ani čítať.
- Na tvojom mieste by som používal $_POST pre odosielanie dát, ty to robíš cez JS, v tomto prípade podľa mňa celkom zbytočne.
- Neviem presne, čo premenná výsledok obsahuje, ale podľa buttonu by som povedal, že asi ID? V tom prípade zase použi $_POST, do nejakého inputu uložíš hodnotu a po odoslaní len spracuješ cez podmienku.
- Pre prehľadnosť kódu by som tiež nepoužíval echo pre vypisovanie html kódu, ale stackoverflow.com/questions/10258345/php-simple-foreach-loop-with-html
- Funckiu mysql ti neodporúčam používať kvôli bezpečnosti, pozrel by som sa na PDO, máš tu dokonca tutoriály a db wrapper na stiahnutie.Z
Michal Šmahel:27.6.2017 10:01
Aha, jasně. Máš to takové divoké, trochu to zjednodušíme.
HTML:
<td align="center">
<div>
<input name="editovat" type="submit" value="edituj" />
<input name="smazat" type="submit" value="smaž" />
</div>
<input type="submit" name="rest" value="odešli rest" />
</form></td>
PHP:
// Přišel požadavek
if($_POST) {
if(isset($_POST['editovat'])) {
// ...
}
else if(isset($_POST['odstranit'])) {
// ...
}
else if(isset($_POST['rest'])) {
// ...
}
}
Je to jednoduché, máš více odesílacích tlačítek (type="submit"), které v PHP od sebe odlišuješ přes jejich název.
+20 Zkušeností
+2,50 Kč
Michal Šmahel:27.6.2017 10:05
Id si uložíš do nějakého pole (klidně skrytého).
<input type="number" value="<?= $id ?>" />
michal Čepelák:27.6.2017 10:28
else if(isset($_POST['rest'])) {
// ...
}
do složených závorek vložím ten kód pro odeslání rest
OtevriDB();
$sql='SELECT `ticket`,`sn`,`nah_dily`,`opr_cena` FROM `opravy` WHERE `id`="'.($id).'" AND `del`="0" ';
$dx=mysql_query($sql);
$i=0;
while ($radek=mysql_fetch_object($dx)){
$ozn_ticketu=$radek->opr_ticket;
$ozn_sn=$radek->sn;
$zaznamy[$i]['text']=$radek->nah_dily;
$zaznamy[$i]['vat']='0';
$zaznamy[$i]['amount']=$radek->opr_cena;
// $i++;
// $i<3;
}
//přes proměnou $vysledek se odešle funkce pro rest
$vysledek=WriteST($ozn_ticketu,$ozn_sn,$zaznamy);
Michal Šmahel:27.6.2017 11:45
Prostě ho skryješ. Nebo lépe použít tento tvar.
<input type="hidden" name="id" value="<?= $id ?>"/>
michal Čepelák:27.6.2017 15:24
Děkuji moc za rady už to funguje ok.
Ještě bych měl dotaz pokud bych chtěl aby se tlačítka na daném řádku
skryli po kliknutí na tlačítko rest udělat to přes databázi nebo se to dá
udělat ještě nějak jinak?
Přes databázi bych si to představoval asi takhle : by byl sloupec
odeslany_rest, který by měl defaultní hodnotu 0 a po kliknutí na tlačítko
by se přes update přepsalo na 1 a tlačítka by zmizela.
Nebo jde to ještě nějak jinak udělat?
Děkuji
Vladislav Domin:27.6.2017 23:30
Vytiahnes z DB hodnotu
<?php
$rest = 0 // dajme tomu
if($rest == 0):?>
<input type='submit'>
<?php endif; ?>
toto si tam len daj a budu sa buttony zobrazovat len vtedy ak bude hodnota 0,ak bude hodnota 1 tak sa html kod nevypise
michal Čepelák:29.6.2017 10:02
Jsem to asi špatně pochopil ten kód, nemusím tam někde mít aji spojení s databází aby to zjistilo jaká hodnota je v databázi nastavena?
Vladislav Domin:29.6.2017 10:43
najprv z DB ziskas hodnotu $rest a podla toho, ci je 1 alebo 0 vypises tie buttony
michal Čepelák:29.6.2017 10:58
Takle nějak
Db::connect('localhost', 'opravy', 'root', '');
$rest = Db::queryOne('SELECT odes_api FROM opravy WHERE opravy.odes_api=0 AND `id`="'.$id.'"');
$rest = 0;
if ($rest == 0){
<input .....
}
Děkuji
Michal Šmahel:29.6.2017 20:52
Podívej se na ten kód. Vždyť je jasné, že to nikdy nemůže fungovat.
// Vždy bude v proměnné $rest hodnota 0
$rest = 0;
// => vždy se podmínka splní
if ($rest == 0){
Musíš si z databáze vytáhnout hodnotu pro "rest" a poté porovnávat tuto hodnotu v dané podmínce. Nikdy nemůžeš jen napevno před podmínkou nastavit hodnotu, to se pak podmínka vydá vždy jen jedním směrem.
Zobrazeno 33 zpráv z 33.