Wywołanie funkcji php z parametrami w AJAX

0

Witam,
Chcę po kliknięciu w przycisk wywołać plik php który powiedzmy wykona dodawanie dwóch liczb, liczby mogą być różne więc, nie możemy podać jako parametry konkretnych wartości, tylko podać dwie zmienne pod którymi będą się kryć różne wartości. Załóżmy że są to zmienne $a i $b. Chcę ję przesłać do ajax więc zamieniam na js przypisując odpowiednio var a = $a, var b = $b;

$a=5;
$b=7;

<button id="klik">przycisk</button>

print "<script type="text/javascript"><!--\n";
print "var a = $a";
print "var b = $b";
print "//--></script>\n";
<script> 
$(document).ready(function(){
			$("#klik").click(function(){
				$.ajax({url: "wywolaj.php",
				data :{a,b},
				type: 'post'});
			});
		});
 </script>

plik wywolaj.php:

$a =$_POST['a'];
$b =$_POST['b'];

function suma($a,$b)
{
$s= ($a+$b);
}

Chcę aby ta funkcja dodała te dwie wartości. Jak to zrobić?

0

$a =$_POST['a'];
$b =$_POST['b'];

function suma($a,$b)
{
return $a + $b;
}

suma($a,$b);

0
Świetny Programista napisał(a):

$a =$_POST['a'];
$b =$_POST['b'];

function suma($a,$b)
{
return $a + $b;
}

suma($a,$b);

Nie działa. Problem leży gdzieś indziej

0
data :{a:a,b:b},
0
TomRZ napisał(a):
data :{a:a,b:b},

Również nie działa

0

Zdefiniuj "nie działa". Biała strona? Jakieś błędy? Konsola przeglądarki (zakłada sieć) zwraca 200?

0
Markuz napisał(a):

Zdefiniuj "nie działa". Biała strona? Jakieś błędy? Konsola przeglądarki (zakłada sieć) zwraca 200?

Zmienne a i b nie przesyłają się do pliku wywolaj.php

1

Robisz np. tak, choć zastanawiam się po co się bawić w AJAX w tym przypadku:

wywolaj.php

<?php

$a = isset($_POST['a']) ? $_POST['a'] : 0;
$b = isset($_POST['b']) ? $_POST['b'] : 0;

function suma($a, $b)
{
  return $a + $b;
}

echo suma($a, $b);

oraz index.php

<?php
$a = 2;
$b = 3;
?>
<!DOCTYPE html>
<html>
  <body>
    <button>Click</button>
    <p></p>

    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
    <script>
        $('button').click(function() {
            $.ajax({
                url: 'wywolaj.php',
                type: 'POST',
                data: {
                    'a': <?= $a ?>,
                    'b': <?= $b ?>
                },
                dataType: 'text'
            }).done(function(data) {
                $('p').html(data);
            });
        });
    </script>
  </body>
</html>

Równie dobrze prostym sposobem można sobie zrobić kalkulatorek działający po stronie przeglądarki więc po co się tak bawić?

index.html

<!DOCTYPE html>
<html>
<body>
    A: <input type="text" data-bind="value: a, valueUpdate: 'afterkeydown'" /><br>
    B: <input type="text" data-bind="value: b, valueUpdate: 'afterkeydown'" /><br>
    C: <span data-bind="text: c"></span>

    <script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.0/knockout-min.js"></script>
    <script>
        function ViewModel(a, b) {
            this.a = ko.observable(a);
            this.b = ko.observable(b);
            this.c = ko.pureComputed(function() {
                return Number(this.a()) + Number(this.b());
            }, this);
        };

        ko.applyBindings(new ViewModel(0, 0));
    </script>
</body>
</html>
0
drorat1 napisał(a):
<!DOCTYPE html>
<html>
<body>
    A: <input type="text" data-bind="value: a, valueUpdate: 'afterkeydown'" /><br>
    B: <input type="text" data-bind="value: b, valueUpdate: 'afterkeydown'" /><br>
    C: <span data-bind="text: c"></span>

    <script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.0/knockout-min.js"></script>
    <script>
        function ViewModel(a, b) {
            this.a = ko.observable(a);
            this.b = ko.observable(b);
            this.c = ko.pureComputed(function() {
                return Number(this.a()) + Number(this.b());
            }, this);
        };

        ko.applyBindings(new ViewModel(0, 0));
    </script>
</body>
</html>

A jak bym chciał przesłać wartość z pola teksowego ajaxem do pliku wywolaj.php:


<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
    <script>
        $('button').click(function() {
            $.ajax({
                url: 'wywolaj.php',
                type: 'POST',
                data: {
                    'wartosc': this.a
                },
            })
        });
    </script>

To jak powinno się podać ten argument? bo this.a nie przekazuje...

1

Wklejam ostatni raz, nie wiem też czy w ogóle załapiesz działanie, zwłaszcza na czym polega two-way binding, faktycznie może kiepski pomysł, o ile tą bibliotekę można nazwać frameworkiem:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF8" />
    </head>
<body>
    <input type="text" data-bind="value: a" />
    <input type="text" data-bind="value: b" />
    <button data-bind="click: evaluate">=</button>
    <span data-bind="text: c"></span>

    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.0/knockout-min.js"></script>
    <script>
        var ViewModel = function() {
            var self = this;
            self.a = ko.observable(0);
            self.b = ko.observable(0);
            self.c = ko.observable(0);

            self.evaluate = function() {
                $.ajax({
                    url: 'wywolaj.php',
                    type: 'POST',
                    data: {
                        'a': self.a(),
                        'b': self.b()
                    },
                    dataType: 'text'
                }).done(function(data) {
                    self.c(data);
                });
            };
        };

        ko.applyBindings(new ViewModel());
    </script>
</body>
</html>

Ale podstawa do opanowania tej biblioteki która tylko współpracuje z jQuery jest tutaj:
http://learn.knockoutjs.com/
http://knockoutjs.com/examples/

Bez tego to nawet nie próbuj dalszych zabaw

1

Masz problem w zapytaniu ajax. Zacznij korzystać z dokumentacji http://api.jquery.com/jquery.ajax/

Zamiast:

        $('button').click(function() {
            $.ajax({
                url: 'wywolaj.php',
                type: 'POST',
                data: {
                    'zmienna': wartość                },
            })
        });

Powinno być **method ** zamiast type

        $('button').click(function() {
            $.ajax({
                url: 'wywolaj.php',
                method: 'POST',
                data: {
                     'zmienna': wartość    
                },
            })
        });
0
drorat1 napisał(a):

oraz index.php

<?php
$a = 2;
$b = 3;
?>
<!DOCTYPE html>
<html>
  <body>
    <button>Click</button>
    <p></p>

    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
    <script>
        $('button').click(function() {
            $.ajax({
                url: 'wywolaj.php',
                type: 'POST',
                data: {
                    'a': <?= $a ?>,
                    'b': <?= $b ?>
                },
            })
        });
    </script>
  </body>
</html>

Da się jakoś przyspieszyć czas przekazywania tych zmiennych, jest jakiś szybszy sposób? Bo jeśli wykonuje plik wykonaj.php z już przypisanymi wartościami to on wykonuje się w około 2 sekundy, natomiast z powyższym kodem gdzie klikam w przycisk i przekazuje te zmienne to wykonuje się całość od kliknięcia łącznie 15 sekund, znaczy kod dalej wykonuje się 2 sekundy tylko od kliknięci to długo trwa bo te zmienne się długo przekazują. Da się coś z tym zrobić?

0

Nie mieszaj w ten sposób języków!!!
Poza tym jak chcesz zmierzyć czas wykonania funkcji to w PHP masz funkcje http://php.net/manual/en/function.microtime.php, która daje timestampa i możesz wyliczyć ile czasu zajmuje funkcja.
Nie wiem jaką implementacje funkcji masz w tym pliku php to nie za bardzo Ci pomogę, czy można tą funkcje przyspieszyć.

0
Paweł Antyporowicz napisał(a):

Nie wiem jaką implementacje funkcji masz w tym pliku php to nie za bardzo Ci pomogę, czy można tą funkcje przyspieszyć.

Ja chcę przyspieszyć przekazanie zmiennych do pliku wykonaj.php, bo sam kod który jest w pliku wywolaj.php wykonuje sie w takim samym czasie. Tylko to przekazanie trwa około 13 sekund, a mierze to tak:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
    <script>
        $('button').click(function() {
            $.ajax({
                url: 'wywolaj.php',
                type: 'POST',
                data: {
                    'a': <?= $time1=time() ?>
                },
            })
        });
    </script>

a plik wywolaj.php

<?php
 
$a = isset($_POST['a']) ? $_POST['a'] : 0;
$time2 = time();

echo ($time2-$time1);

//moj kod

?>

I takie przekazanie wykonuje 13 sekund i chce to przyspieszyć, tylko jak?

0
    <script>
        $('button').click(function() {
            $.ajax({
                url: 'wywolaj.php',
                type: 'POST',
                data: {
                    'a': <?= $time1=time() ?>
                },
            })
        });
    </script>

Tutaj masz błąd. Mówiłem nie mieszaj kodów.
Czas, który Ci się wygenerował w tej funkcji jest wartością w tym momencie w którym wygenerował się widok strony...
Do timestampu w JS wykorzystaj funkcje

new Date().getTime()

wtedy momencie wysłania zapytania Ajax wygeneruje Ci się odpowiednia wartość czasu unixowego.

0

Skoro mam nie mieszać języków to jak to powinienem przekazać?

0
Paweł Antyporowicz napisał(a):

Czas, który Ci się wygenerował w tej funkcji jest wartością w tym momencie w którym wygenerował się widok strony...

Co nie zmienia faktu, że mój kod zaczyna się wywoływać po tym czasie...czyli jest to za długo

0

Dałem rozwiązanie prawie jak na tacy:
Tak twoja funkcja ajax powinna wyglądać:

<script>
 var timeStampInMs = function () { 
return window.performance && window.performance.now && window.performance.timing && window.performance.timing.navigationStart ? window.performance.now() + window.performance.timing.navigationStart : Date.now();
}

        $('button').click(function() {
             $.ajax({
                 url: 'wywolaj.php',
                type: 'POST',
                 data: {
                   'a': timeStampInMs();
               },
             })
        });
</script>

A tak funkcja php, która Ci pokaże czas przesłania żądania:

<?php
$time2 = microtime(true);
$a = isset($_POST['a']) ? $_POST['a'] : 0;

 
echo ($time2 - $time1);
 

asdf42 napisał(a):

Skoro mam nie mieszać języków to jak to powinienem przekazać?

0

Ale ja chce przekazać zmienne z php

Jak to powinienem zastąpić żeby nie mieszać języków a przekazać zmienne z php?
Jak to zastąpić?

...
data: {
                    'a': <?= $a ?>,
                    'b': <?= $b ?>
                },
....
0

Możesz zapisać dane w np: ukrytym inpucie a później je pobrać. Zamiast tak mieszać kod.

<input type="hidden" value="<?php $zmiennaX ?>" id="zmiennaX">

var zmiennaX = document.getElementById("zmiennaX").value;

0
Paweł Antyporowicz napisał(a):

Możesz zapisać dane w np: ukrytym inpucie a później je pobrać. Zamiast tak mieszać kod.

<input type="hidden" value="<?php $zmiennaX ?>" id="zmiennaX">

var zmiennaX = document.getElementById("zmiennaX").value;

Nie działa takie przekazanie

<button>klik</button>
<input type="hidden" value="<?php $zmiennaX =66; ?>" id="zmiennaX">
<script>
	var zmiennaX = document.getElementById("zmiennaX").value;
        $('button').click(function() {
            $.ajax({
                url: 'wywolaj.php',
                type: 'POST',
                data: {
                    'a':  zmiennaX
                },
            })
        });
    </script>
0

Jezu Chryste co Ty kombinujesz??? Podałem wcześniej jak na tacy:

https://4programmers.net/Forum/1458358
https://4programmers.net/Forum/1458780

Najwyżej zrób download jQuery oraz opcjonalnie KnockoutJS i zamiast wczytywać to z zewnętrznych serwerów, wczytaj to z podkatalogu Twojego projektu, zapisując wcześniej te biblioteki.

A tak w ogóle to po co do takich pierdół jak sumowanie bawić się jeszcze w AJAX skoro wszystko można załatwić w samej przeglądarce???

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF8" />
    </head>
<body>
    A: <input type="text" data-bind="value: a, valueUpdate: 'afterkeydown'" /><br>
    B: <input type="text" data-bind="value: b, valueUpdate: 'afterkeydown'" /><br>
    C: <span data-bind="text: c"></span>
 
    <script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.0/knockout-min.js"></script>
    <script>
        function ViewModel(a, b) {
            this.a = ko.observable(a);
            this.b = ko.observable(b);
            this.c = ko.pureComputed(function() {
                return Number(this.a()) + Number(this.b());
            }, this);
        };
 
        ko.applyBindings(new ViewModel(0, 0));
    </script>
</body>
</html>

1 użytkowników online, w tym zalogowanych: 0, gości: 1