How to access a variable inside a function from another file?

I have two files: function.php, which contains a PDO object to connect to the database and contains columns as variables and index.php to output a variable containing data. The database connection works, however, when I try to repeat a variable from my function, it returns undefined. What am I doing wrong;

functions.php

<? php 

function connectDB() {
    $hostname = 'xxxxxxxx';
    $db = 'xxxxxxx';
    $user = 'xxxxxxxx';
    $pass = 'xxxxxxx';

    $dbh = new PDO("mysql:host=$hostname; dbname=$db; charset=utf8", $user, $pass, array(PDO::ATTR_EMULATE_PREPARES => false, PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION)); 

    $sql = "//my query";

    $query = $dbh->prepare($sql);
    $query->execute(array('//value','//value'));            
    $query->setFetchMode(PDO::FETCH_ASSOC);

    while ($r = $query->fetch()):

        $var1 = $r['column1']; 
        $var2 = $r['column2'];
        $var3 = $r['column3'];
        $var4 = $r['column4'];
        $var5 = $r['column5'];

    endwhile;                                                       

}

?>

index.php

<?php
include 'functions.php';

?>

<?php 

try {

connectDB();
echo 'You are connected to Database';
echo $var1;
$dbh = null; 

    }
catch(PDOException $e) { 
        echo $e -> getMessage(); 
    }

?>
+4
source share
3 answers

these variables are local to your connectDB () function by default, so you have to either declare them in the global scope in advance, or use $ GLOBALS to set them:

Method 1

<? php 

    $var1 = ''; 
    $var2 = '';
    $var3 = '';
    $var4 = '';
    $var5 = '';

function connectDB() {
    $hostname = 'xxxxxxxx';
    $db = 'xxxxxxx';
    $user = 'xxxxxxxx';
    $pass = 'xxxxxxx';

    $dbh = new PDO("mysql:host=$hostname; dbname=$db; charset=utf8", $user, $pass, array(PDO::ATTR_EMULATE_PREPARES => false, PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION)); 

    $sql = "//my query";

    $query = $dbh->prepare($sql);
    $query->execute(array('//value','//value'));            
    $query->setFetchMode(PDO::FETCH_ASSOC);

    while ($r = $query->fetch()):

        $var1 = $r['column1']; 
        $var2 = $r['column2'];
        $var3 = $r['column3'];
        $var4 = $r['column4'];
        $var5 = $r['column5'];

    endwhile;                                                       

}

?>

Method 2

<? php 

function connectDB() {
    $hostname = 'xxxxxxxx';
    $db = 'xxxxxxx';
    $user = 'xxxxxxxx';
    $pass = 'xxxxxxx';

    $dbh = new PDO("mysql:host=$hostname; dbname=$db; charset=utf8", $user, $pass, array(PDO::ATTR_EMULATE_PREPARES => false, PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION)); 

    $sql = "//my query";

    $query = $dbh->prepare($sql);
    $query->execute(array('//value','//value'));            
    $query->setFetchMode(PDO::FETCH_ASSOC);

    while ($r = $query->fetch()):

        $GLOBALS['var1'] = $r['column1']; 
        $GLOBALS['var2'] = $r['column2'];
        $GLOBALS['var3'] = $r['column3'];
        $GLOBALS['var4'] = $r['column4'];
        $GLOBALS['var5'] = $r['column5'];

    endwhile;                                                       

}

?>

Sincerely, your copy-paste-service :)

+2

: , , . ,

function banana( $externalvar=false ){
   echo $externalvar;
}

or

function banana(){
    global $externalvar;

    echo $externalvar;
}
+1

Smart code should use the yield keyword :

function connectDB() {
    // ...
    $output = [];
    $index  = 0;
    while ($r = $query->fetch()):
        yield $r;
    endwhile; 
}

Then:

foreach ($connectDB() as $row)
    echo $row['column1'], PHP_EOL;
    echo $row['column2'], PHP_EOL;
    echo $row['column3'], PHP_EOL;
endforeach;

Otherwise, just return the array, then extract :

function connectDB() {
    // ...
    $output = [];
    $index  = 0;
    while ($r = $query->fetch()):
        ++$index;
        foreach($r as $key => $value) {
            $output[$name . '_' . $index] = $value;
        }
    endwhile; 
    return $output; 
}

Then:

$vars = connectDB();
extract($vars);
;
echo $column1_1, PHP_EOL;
echo $column2_1, PHP_EOL;
echo $column3_1, PHP_EOL;
;
echo $column1_2, PHP_EOL;
echo $column2_2, PHP_EOL;
echo $column3_2, PHP_EOL;

The second goal is very ugly.

0
source

Source: https://habr.com/ru/post/1625809/


All Articles