23

I want to include() a php file located on my server, with additional GET attributes. But it won't work:

include('search.php?q=1');

The error it gives:

PHP Warning:  include(): Failed opening './search.php?q=1' for inclusion

Seems like it tries to open a file literally named 'search.php?q=1' instead of opening the 'search.php' file and sending it the GET attributes.

*Note that it does work if I don't put any GET attributes:

include('search.php');
7
  • 5
    It can not work. You can't use query parameters there. Commented Apr 15, 2011 at 10:46
  • (reference) de.php.net/manual/en/function.include.php Commented Apr 15, 2011 at 10:47
  • What makes you think it should work? GET is an HTTP method, i.e. it used by the HTTP protocol, which is handled by your web server. include on the other hand, just reads and interprets the file directly from the file system, no web server involved. These are two different processes. Commented Apr 15, 2011 at 10:49
  • 1
    @Felix include can use URIs if allow_url_include and allow_url_fopen is enabled. Commented Apr 15, 2011 at 10:51
  • 1
    @Felix yes of course and it's disabled on most shared hosters for security reasons anyways Commented Apr 15, 2011 at 10:55

7 Answers 7

29

You don't want to do this: You'd have to do a http request to be able to pass GET parameters. A PHP script you call in this way will run in a separate PHP process.

The optimal way is to include the file locally:

include('search.php');

and to pass any parameters to it manually, like e.g.

$q = "1";
include('search.php');  // expects `$q` parameter

or, more cleanly, putting whatever you have in search.php into a function or class that you can call with a parameter:

include('search.php');  // defines function my_search($q)  
my_search(1);       
Sign up to request clarification or add additional context in comments.

3 Comments

Or even better use a class structure. include('search.php'); $search = new Search($q);
@JonathonWisnoski because throwing in some class(es) just makes everything magically better somehow right? right?
Yes, encapsulation is important. Sharing global variables between files is just asking for incredibly hard to diagnose bugs and generally unmaintainable code.
24

The easy solution is to set your GET value before you include the file.

$_GET['q'] = 1;
include('search.php);

3 Comments

Writing into the GET array feels a bit dirty. But it will work
I agree, this is just a fast&dirty way to do that.
Tip: Check if your script does not access $_GET['q'], otherwise writing to this superglobal can lead to unwanted results.
4

Try rewrite $_GET variable.

$oldget=$_GET;
$_GET=array('q'=>'1');
include('search.php');
$_GET=$oldget;

Comments

2

In effect, writing into the $_GET array is a bit dirty and not necessary. You could simply set a variable in your page before the include statement:

$q=1;
include("search.php");

this way, the $q variable will be visible in your included page and can (obviously) be set differently in any including page.

Comments

2

It works fine!! Thank you

Set the var before the "include" statement

$q=1;
include("search.php");

Comments

1

maybe an other option, although it comes with its own limitations, using AJAX-injection into a div.. most simple way to to this is with jQuery:

<script src="//ajax.googleapis.com/ajax/libs/jquery/1.7.0/jquery.min.js" type="text/javascript"></script>
<script>$('#box').load('search.php?q=1');</script>

<div ID="box"></div>

Comments

0

If like me you needed this to be permanently in the 'include' link it can be done with jQuery.

The solution I used recently was as follows:

First, declare the location of the div to be populated by the included file:

<div id="imgdiv"> </div>

Then add a jQuery call to populate it, but insert your GET variables with PHP:

<script>                
window.onload = function(){     
        $("#imgdiv").load('php/show-img.php?id=<?php echo $i; ?>&name=<?php echo $name; ?>');           
}
</script>

Hopefully that will be sufficient to get it working, assuming a java enabled browser is used of course.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.