0

Getting undefined variable error when i put string replace code in function

Bellow code show undefined for dataemail, AND $datafname but SESSION username is okay, also when i try to echo this dataemail, AND $datafname it show logged user email and fullname

<?php
function mentioned($input_str){
    $input_str = strip_tags($input_str);
    $input_str = htmlentities($input_str);

    $wordInString = array('@user@','@email@','@fname@');
    $replaceInString = array($_SESSION['username'], $dataemail, $datafname); // the error is from here
    return str_replace($wordInString, $replaceInString, $input_str);
}
$match_user = mentioned($info_body);
?>

This bellow code work well without error but i need to code it in a function so i can reuse it anywhere without coding it again

<?php
            $string = $info_body;
            $wordInString = array('@user@','@email@','@fname@');
            $replaceInString = array($_SESSION['username'] ,$dataemail,$datafname);
            $match_user = str_replace($wordInString, $replaceInString, $string);
echo $match_user;
?>
Alex
  • 87
  • 8

1 Answers1

1

By default, PHP functions don't have access to global variables, so your function do not see the two "data" variables.

The best solution would be to pass them as argument:

function mentioned($input_str, $dataemail, $datafname){
    $input_str = strip_tags($input_str);
    $input_str = htmlentities($input_str);

    $wordInString = array('@user@','@email@','@fname@');
    $replaceInString = array($_SESSION['username'], $dataemail, $datafname); // the error is from here
    return str_replace($wordInString, $replaceInString, $input_str);
}
$match_user = mentioned($info_body, $dataemail, $datafname);

Another solution would be to declare them as global on top of the function, but that would make your code less re-usable and more difficult to maintain, so use with caution:

function mentioned($input_str){
    global $dataemail;
    global $datafname;
    ...
laurent
  • 88,262
  • 77
  • 290
  • 428
  • so if i have 10 more variable to replace i will have to pass them all and when getting to output also same like you did? – Alex Sep 26 '16 at 13:35
  • Yes, pretty much, though you could group them for example in an associative array. That means you won't need to change the function signature every time you change the number of variables. You could also loop on that array from within the function to reduce code duplication. – laurent Sep 26 '16 at 13:41