2016-10-24 4 views
0

У меня есть небольшая проблема, и я не могу найти причину. У меня есть эта простая функция, которая должна проверять правильность ввода/передачи, и я хотел бы сохранить всю информацию о пользователе из $ строки объекта в $ UserData глобальногообъектГлобальная переменная исчезает из функции

function check_credentials($username, $password) { 
    global $userdata;  
     $password = md5($password); 
     $result = mysql_query("SELECT * FROM users WHERE username='$username' AND password='$password' LIMIT 0,1")or die(mysql_error()); 


    while ($row = mysql_fetch_object($result)) { 
     if(($row->password == $password) && ($row->username == $username) && ($row->ver == 1)) { 

      $userdata = clone $row; 
      return true; 
     } 
     else break; 
    } 
    } 
    unset($_SESSION['logged_as']); 
    return false; 
} 

у вас есть представление о том, почему, из функции, глобальные переменные исчезнут? потому что это должно быть global

+0

Как вы определили переменную $ userdata раньше? – Broatcast

+0

@Broatcast я этого не сделал. $ userdata объявляется глобальным в начале и «заполняется» непосредственно перед возвратом true –

+0

, вы не можете определить его с глобальным состоянием в начале функции, вам нужно определить эту переменную за пределами функции до ... глобальный оператор дает вам доступ только для чтения/записи к внешней определенной переменной в вашей функции ... это ваша проблема – Broatcast

ответ

1

Как сказал @Broatcast, глобальная функция должна была быть объявлена ​​вне функции раньше.

$var = null; 
function name() { 
global $var 
} 

// use $var as global 
+0

, что является правильным способом;) – Broatcast

+0

Спасибо большое :) –

1

Ваша функция просто возвращает логическое значение true, а не измененную переменную. Изменить

  $userdata = clone $row; 
      return true; 

в

 $userdata = clone $row; 
     return $userdata; 
+0

Не могу. Сама функция должна возвращать только true или false, если пользователь/пароль правильный. Другим эффектом является то, что из функции $ userdata все еще доступна. –

0

Вместо использования с помощью глобальной переменной, просто вернуть $ UserData:

if(($row->password == $password) && ($row->username == $username) && ($row->ver == 1)) { 
return $row; 
} 

Затем захватить строку при вызове функции

$userdata = check_credentials($username, $password); 
+0

Я не могу. Сама функция должна возвращать только true или false, если пользователь/пароль правильный. Другим эффектом является то, что из функции $ userdata все еще доступна. –

+0

непустой массив будет оцениваться как истинный в булевом контексте. – faraday703

+0

Кроме того, если вы сохраняете $ userdata для глобального, то $ userdata все еще доступна после возвращения функции. По сути, он доступен * глобально *. – faraday703

Смежные вопросы