2016-04-20 4 views
1

Я пишу php-файл, который будет содержать функции, задач, которые я хочу выполнить. Некоторым из этих функций необходимо будет использовать базу данных mysql. Я создал отдельный файл db_connections.php, который я добавил в файл функций, используя require_once.Как получить доступ к переменной внутри функции?

Я могу получить доступ к объекту PDO, созданному в этом файле, но я не могу получить доступ к этой переменной внутри своих функций. Есть ли способ доступа к переменным внутри функций?

<?php 

require_once ("class.phpmailer.php"); 
require_once ("error_option.php"); 
require_once ("db_connection.php"); //The PDO object has been created here 

function processLoginUser($email, $password) { 
    //I cant seem to access the pdo object inside functions, but it is accessible outside functions 
    $email = trim($email); 
    $password = trim($password); 
    $checkUserQuery = $dataObject->prepare("CALL sp_CheckLogin()"); 
    $checkUserQuery->bindParam(); 
} 
+2

См. Http://php.net/manual/en/language.variables.scope.php. – chris85

+0

Возможно, вы должны показать нам требуемую функцию. – RiggsFolly

+0

Передайте ее в функцию. – AbraCadaver

ответ

1

Вы должны написать что-то вроде

<?php 
require_once ("class.phpmailer.php"); 
require_once ("error_option.php"); 
require_once ("db_connection.php"); 

function processLoginUser($email, $password) { 
    /** 
    global keyword let you use variables out of the scope of 
    your block, however is no recommended 
    **/ 
    global $dataObject; 
    $email = trim($email); 
    $password = trim($password); 
    $checkUserQuery = $dataObject->prepare("CALL sp_CheckLogin()"); 
    $checkUserQuery->bindParam() 

} 

я предлагаю вам переписать код на что-то вроде

function processLoginUser($email, $password, $dataObject) { 
    $email = trim($email); 
    $password = trim($password); 
    $checkUserQuery = $dataObject->prepare("CALL sp_CheckLogin()"); 
    $checkUserQuery->bindParam()  
} 

[1] http://php.net/manual/en/language.variables.scope.php

2

Вы можете передать соединение объект при вызове функции:

processLoginUser($email, $password, $dataObject); 

Тогда он будет доступен в пределах функции при добавлении его в список аргументов:

function processLoginUser($email, $password, $dataObject) { 
    $email = trim($email); 
    $password = trim($password); 
    $checkUserQuery = $dataObject->prepare("CALL sp_CheckLogin()"); 
    $checkUserQuery->bindParam() 
} 

Или вы можете использовать замыкание (> = PHP 5.3), предполагая, замыкание вызывается после определения $dataObject:

$processLoginUser = function($email, $password) use ($dataObject) { 
    $email = trim($email); 
    $password = trim($password); 
    $checkUserQuery = $dataObject->prepare("CALL sp_CheckLogin()"); 
    $checkUserQuery->bindParam() 
}; 
$processLoginUser($email, $password); // call the closure as you would a regular function. 

Или, в качестве альтернативы, вы можете сделать $dataObject переменную global:

function processLoginUser($email, $password) { 
    global $dataObject; 

    $email = trim($email); 
    $password = trim($password); 
    $checkUserQuery = $dataObject->prepare("CALL sp_CheckLogin()"); 
    $checkUserQuery->bindParam() 
} 

Это чисто основанный на мнениях, но для вашего случая я придерживаюсь первого варианта: просто передайте его функции в качестве аргумента.

0

Вы используете проблему с переменной областью. См.: http://php.net/manual/en/language.variables.scope.php

Я бы не рекомендовал использовать глобальные переменные, чтобы решить эту проблему. Ваш лучший вариант - передать переменную в функцию.

function processLoginUser($email, $password, $dataObject) { 
    $email = trim($email); 
    $password = trim($password); 
    $checkUserQuery = $dataObject->prepare("CALL sp_CheckLogin()"); 
    $checkUserQuery->bindParam() 
} 
Смежные вопросы