Want to protect your cyber security and still get fast solutions? Ask a secure question today.Go Premium

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 159
  • Last Modified:

Help with PHP Variable Scope

I have a script that calls a function which runs a query and returns a result. The calling script includes an application file at the top via require_once. This application file includes my session, database connection, function, and other often needed scripts using the same method, via require_once.

I call the function from inside the script and get an error because it is not able to find my dbconnection variable (I am using mysqli). The only way I have been able to get the function to work is by including the dbconnection code inside the function.

How can I access that variable and not have to include the code a second time?

//top of calling file
<?php require_once '../includes/application.php'; ?>

//contents of application file
<?php require_once("../includes/sessions.php"); ?>
<?php require_once("../includes/dbconnect.php"); ?>
<?php require_once("../includes/functions.php"); ?>
<?php require_once("../includes/validation_functions.php"); ?>
<?php require_once("../includes/breadcrumb.php"); ?>

//contents of dbconnect file
<?php
  // Create a database connection
  $dbhost = "";
  // $dbuser = "";
  // $dbpass = "";
  $dbuser = "";
  $dbpass = "";
  $dbname = "";
  $db = mysqli_connect($dbhost, $dbuser, $dbpass, $dbname);
  // Test if connection occurred.
  if(mysqli_connect_errno()) {
    die("Database connection failed: " . 
         mysqli_connect_error() . 
         " (" . mysqli_connect_errno() . ")"
    );
  }
?>

//function call from within the calling file
<?php
 $crewresult = getCrewDescription($li["CrewId"]);
 echo "Code: " .  $crewresult['CrewCode'] . "Description: " . $crewresult['CrewDescription']; 
?>

//finally the function itself
<?php
	function getCrewDescription($CrewID) {

		$querystring =  " SELECT yadda";
		$querystring .= " FROM yidda";
		$querystring .= " WHERE yackity = ";
		$querystring .= (int) schmackity;
		
		$result_get_crew = mysqli_query($thisdb, $querystring);

		if(!$result_get_crew) {
			die("Database error in function getCrewDescription.");
		}
		if(mysqli_num_rows($result_get_crew)) {
			while ($record = mysqli_fetch_assoc($result_get_crew)) {
				$aarray_crew = array("CrewCode" => $record['CrewCode'], "CrewDescription" => $record['LongDescription']);
			}
		} else {
				$aarray_crew = array("CrewCode" => 0, "CrewDescription" => "No Crew Found");
		}	
		mysqli_free_result($result_get_crew);
		return $aarray_crew;
	}
?>

Open in new window

0
medievalman
Asked:
medievalman
  • 2
1 Solution
 
Dave BaldwinFixer of ProblemsCommented:
You have to make the connection variable a 'global' in each routine or function that uses it.  Also... everything between the PHP close and open tags will be sent to the browser if this is for a web page including what you think are comments.  '//' only works for comments Inside the PHP tags.

I just edited the top section although I didn't see anything in your code that wouldn't work between a single open and close tag.  If you use anything that requires headers or cookies to be sent, those extra characters will cause it to fail.
<?php //top of calling file
require_once '../includes/application.php';

//contents of application file
require_once("../includes/sessions.php");
require_once("../includes/dbconnect.php");
php require_once("../includes/functions.php");
require_once("../includes/validation_functions.php");
require_once("../includes/breadcrumb.php"); ?>

Open in new window

0
 
Ray PaseurCommented:
Without dragging this into a really long question and answer session, you may not get the best answer and the answer you need for application development.  So rather than trying to answer, I'll just leave this here as encouragement for your future learning.  It's not simple at first, but it transforms your software development process from one that can only survive in isolation to one that can be shared with your colleagues and proved to be testable, dependable and reliably error free.

Learn about Dependency Injection.  Using PHP require_once() gives you dependencies that are impossible to mock or test.  Same thing with the global keyword.  Injecting the dependencies (like the database connection and the function definitions) enables you to mock these dependencies, causing the mock objects to return predictable and testable values.

http://en.wikipedia.org/wiki/Dependency_injection
0
 
medievalmanAuthor Commented:
Thank you, Dave. Declaring global $db in the function did the trick. The comments in the code section of my post were merely for guidance as to what code was where.
0
 
Dave BaldwinFixer of ProblemsCommented:
You're welcome, glad to help.
0

Featured Post

Free Tool: Port Scanner

Check which ports are open to the outside world. Helps make sure that your firewall rules are working as intended.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

  • 2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now