I've been doing some research on calling a PHP function within a file from jQuery and can't seem to find a proper way of doing this without it failing on me. I'm trying to create an intermediary (kind of) CMS with MVVM to create a single-page website with a WordPress base.
At the moment I'm stuck on a bit where I'm trying to access PHP functions in allocated files, I've seen examples here, here and here on how to do it with a function per file, but I'd like to be able to call a function in a file as it gives me a clearer overview.
I've checked the link and it's correct, the PHP file is called posts.php and its in the location defined by window.MODELS, however the function fetch_all doesn't get executed.
JavaScript
//call php function
var requestURL = window.MODELS + 'posts/fetch_all';
$.get(requestURL, function(data){
console.log('checking data: ', data);
}, 'json')
.done(function(passed){
console.log('it worked!');
})
.fail(function(failed){
console.log('it failed :( ');
});
PHP
public function fetch_all(){
return json_encode("this is fetch_all..."); //replace text to get all posts with get_posts()
}
The console shows the JavaScript fail: "it failed :( ". How do I get 'fetch_all' to be executed and return data?
The URL you're calling from jQuery must match the location of the .php file on your server, for instance the correct URL to call is:
var requestURL = window.MODELS + 'posts.php?action=fetch_all';
Then, inside your PHP file you have to select which function to call according to query parameters. You can add this code after your function declaration, in order to call the proper function depending on the 'action' query parameter:
if ($_REQUEST['action'] == 'fetch_all')
echo fetch_all();
else
echo json_encode( array( 'status' => 'error') );
Also remember that your output should be echoed in order to generate output and not simply returned.
Hope it helps,
A.
Related
I use jquery to set a get query to a php script which then queries the database and writes to the screen, but I can't get it to trigger the download, even with headers.
The steps are as follows:
create a link that the user clicks to download the data
javascript sends the query parameters to php
php queries the database and writes the file
client downloads the file
But I can't get step 4 to happen.
Step 1: (this is a table object that also contains the parameters:
d3.select("#some-div").append('a")
.attr("href", "javascript: void(0)")
.on("click", function() { this.saveAsCSV() };
Step 2: Javascript file to make query:
var saveAsCSV = function(params) {
var tmp_params = $.extend({}, params);
tmp_params['State'] = "NM";
$.get('php/get_data.php', tmp_params);
}
php to return query:
...
header("Content-type: application/text-csv");
header("Content-Disposition: attachment; filename=query_result.csv");
while($row = $result->fetchArray() {
print "$row";
}
...
It works fine in that it correctly queries and will print the data in the javascript function (so it will print it to console.log if I add that into the get return function), but I can't figure out what I should do differently to make it just download it directly.
One thing I've tried is to do the following on the params object:
var param_string = encodeURIComponent(JSON.stringify(params));
location.href = 'http://www.mysite.com"+param_string;
But that both takes the user away from the page and fails to download the data.
EDIT: I should clarify that the php file does output the query well in csv format. The problem seems to be that using the $.get() function does not trigger a download regardless of the php headers. Maybe I need to just provide a simple link with the parameters in the URL address, but I'm not sure how to get a javascript object into a URL format so that the php script can interpret it.
You could open a popup/new window/tab/whatever with your URL php/get_data.php?State=NM (perhaps additional parameters). It should download the output.
But your output might be wrong because you just print the variable $row which is an array. If you try to print an array that way it will just show Array.
You will need to properly output your rows. Unfortunately I don't know the CSV structure well enough to help you with that problem.
You can make an AJAX call for this using something like jQuery and it will pop up the download box while keeping the user on the page. Do something like this:
$.ajax({data: {download: 'query_result.csv'}, type: 'GET', url: 'download.php', cache: false });
I've tried this a few times for a previous employer and it always worked great. Although I did it mostly with .zip and .docx files.
I figured it out!
Basically, my encoding was wrong. I don't want to encode with
encodeURIComponent(JSON.stringify(params));
The result isn't readable by the php script. However, it works to just use $.param().
To summarize, the download is triggered by creating the URL link and then using location.href to link to it. Hence everything else is the same, but instead of the $.get() in step 2, I do:
var url_params = $.param(tmp_params);
location.href = url_params;
Which generates the download. Thanks!
I am using zend framework project which is been created by using zend studio.
Also there is a Jquery project which is created separately.
I have deployed jquery project in tomcat, and on click of one button in jquery, a php method is called by using ajax LOAD method. PHP is returning string value.
However, for some reason data is not coming back to jquery method.
Jquery method:
var res = $('#updatedtime').load("http://test/index/returndate");
PHP method
public function returndateAction(){
$this->_helper->viewRenderer->setNoRender(true);//this will do job
return "hi";
}
Can we use jquery LOAD method be used to get data? Please correct me if am wrong!
Thanks all
Do you mean something like:
PHP
public function returndateAction(){
$this->_helper->viewRenderer->setNoRender(true);//this will do job
echo "hi";
}
jQuery
// data from PHP is displayed in your element having id updatedtime
$('#updatedtime').load("http://test/index/returndate");
OR
$('#updatedtime').load("http://test/index/returndate", function(data){
alert(data); //shows 'hi'
});
Check if the url you are trying to access thru load actually gets called.
The client doesn't know or care what you run server side. You can get anything you want from the server, whether that is something created with PHP, or a static resource.
If you aren't getting data back, use your browser's network tools to verify that the request is being made, and data is being returned. Also, make sure you are actually executing that function server-side. It doesn't appear that you are.
Yes, just add a callback function as the second argument to .load
$('#updatedtime').load("http://test/index/returndate", function (phpString) { ... });
This question already has answers here:
Closed 10 years ago.
Possible Duplicate:
Creating jQuery AJAX requests to a PHP function
I am trying to run a really simple formula,
Call a web page, and every few seconds or so Ajax calls a php function to echo "Hello World"
<?php
function test(){
echo "Hello World";
}
?>
<script type="text/javascript">
function testingTimer()
{
//CALL PHP FUNCTION CALLED TEST
}
setInterval('testingTimer()',5000);
</script>
All I need is the code that calls the already declared php function.
You cannot call that directly. Write code of AJAX and call URL like myfile.php?action=test and in file myfile.php write if action GET variable is equal to test then call that function and don't forget to exit code to prevent any other output.
Google on how to do ajax calls. It's basic knowledge explained in too many tutorials, and varies depending on if you are using a framework or not, and which.
You can post something for example :
function testingTimer()
{
$.post(URL,
{
foo : 'foo'
}
);
}
and in php check post:
if (isset($_POST['foo']))
test();
AJAX does not have the ability to call an arbitrary php function on its own. AJAX allows you to connect to a given page and request data. That being said, you can use AJAX to load a given page and all that page does is call your test function:
Based on your example code I assume you're trying to do this all within a single file. The issue you have is that PHP is run server side before/as the page loads. Once loaded it cannot be re-executed without a refresh.
You need to have your PHP in a separate file so that it can be called over HTTP by AJAX and return a response.
So something like this (if using jQuery):
$.ajax('helloworld.php', function(data){
alert(data);
}, 'html');
Should popup with hello world if implemented correctly.
You should use jQuery to use the ajax function.
You should not use a setInterval, but a setTimeout after the response of server because if the server take more than 5000 seconds to respond, then you'll have two requests at the same time.
If you want to put a timeout, you can always see the abort function on the jqXHR Object.
For example, you could do:
function refresh() {
$.ajax({
type: 'GET', // can be POST or GET
url: 'page.php' // php script to call
// when the server responds
}).done(function(response) {
console.log(response);
// call your function automatically
setTimeout(refresh, 5000);
});
}
I've researched and played around a fair bit, but I am stumped. Essentially I want to setup my site so that it can detect if a user is 'logged in' and thereby change the way it looks: removing the "Sign In" link and replacing it with a "Sign Out" link, and so forth.
For testing purposes I started my index.html page with:
<?php
session_start();
$_SESSION["username"]="javaman";
?>
Next, I call my setup function from within the jquery document.ready:
$(document).ready(function() {
setup_page();
};
The setup function looks like:
function setup_page()
{
var username = get_user();
//check for error
var index = username.indexOf("error");
//if not an error
if(username.length > 0 && index == -1)
{
//do the jquery calls to hide/show links
}
}
And that get_user function looks like:
function get_user()
{
var result;
$.post("./session.php", {action : "get", key : "username", value : "val"}, function(data){
result = data;
});
return result;
}
The session.php is a simple app that takes in 3 post values and hopefully spits out the proper result, the problem I am running into is that the js result variable is often undefined, especially so when I debug via the IE dev toolbar. FF seems ok though. Am I using the callback in the correct way? I've tried putting alert() functions everywhere to figure out where the code is screwing up, but that doesn't help either as often the alert's say the result is undefined. Meanwhile, it seems like the get_user calls the post function but the stack immediately returns and never gets to the return statement until AFTER the get_user has returned a value of.. undefined. I believe I am misunderstanding the code flow here. I am used to C where logically one function follows another. In that vein I am interpreting the callback to essentially be like:
int i = callback_function(post("some data"));
So in my mind the post completes it's action and then calls another function or at least performs another action and then that completes and then the get_user can return it's value.
Or is the order of operation: post, get_user, callback?
...confused in Seattle
Internet Explorer does not natively support indexOf on arrays. Use jQuery's $.inArray() instead:
var index = $.inArray("error", username);
Keep in mind that AJAX stands for Asynchronous Javascript and XML. So the callback fires as soon as a response comes, but the rest of execution goes on. If you want to lock the execution until AJAX-request will be completed, use
$.ajaxSetup({async:false});
before AJAX call.
I have a php function that builds a list of items for me. Im not sure but i read that you cant call a php function explicitly though jQuery/js.
So i saw that you can still call php pages like this:
$("#name").click(function(){
$("#div").load("script.php");
});
If i can call a php page like that, is there also a way to send it a URL when that page is loaded like this?
$("#name").click(function(){
$("#div").load("script.php", 'http://gdata.youtube.com/feeds/');
});
also another problem comes up that how do i make the script accept that string through from jQuery?
normally when you call a function you pass parameter with the call like so:
<?php makeList( 'http://gdata.youtube.com/feeds/' ); ?>
//on the function-side
<?php
function makeList( $feedURL )
{
//...stuff that uses $feedURL...
}
?>
Since i will make the function a script that runs upon being called how would i pass it a parameter?
I have no idea if this is possible or not and i would understand if this creates tons of security issues which makes it not acceptable.
You have the $.get and $.post methods in jQuery.
$.post('script.php', { url: 'http://gdata.youtube.com/feeds/' }, function(data) {
//data will hold the output of your script.php
});
The url is posted to your PHP script and you can access it through $_POST['url'].
See jQuery.ajax(), the 'sending data to the server' example.