Solved

Help with PHP Variable Scope

Posted on 2015-02-21
4
141 Views
Last Modified: 2015-02-22
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
Comment
Question by:medievalman
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 2
4 Comments
 
LVL 83

Accepted Solution

by:
Dave Baldwin earned 500 total points
ID: 40623690
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
 
LVL 110

Expert Comment

by:Ray Paseur
ID: 40623743
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
 

Author Comment

by:medievalman
ID: 40623766
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
 
LVL 83

Expert Comment

by:Dave Baldwin
ID: 40623837
You're welcome, glad to help.
0

Featured Post

The Eight Noble Truths of Backup and Recovery

How can IT departments tackle the challenges of a Big Data world? This white paper provides a roadmap to success and helps companies ensure that all their data is safe and secure, no matter if it resides on-premise with physical or virtual machines or in the cloud.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Things That Drive Us Nuts Have you noticed the use of the reCaptcha feature at EE and other web sites?  It wants you to read and retype something that looks like this.Insanity!  It's not EE's fault - that's just the way reCaptcha works.  But it is …
When table data gets too large to manage or queries take too long to execute the solution is often to buy bigger hardware or assign more CPUs and memory resources to the machine to solve the problem. However, the best, cheapest and most effective so…
Learn how to match and substitute tagged data using PHP regular expressions. Demonstrated on Windows 7, but also applies to other operating systems. Demonstrated technique applies to PHP (all versions) and Firefox, but very similar techniques will w…
This tutorial will teach you the core code needed to finalize the addition of a watermark to your image. The viewer will use a small PHP class to learn and create a watermark.

730 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question