Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.05.2012, 21:52   #1
MLMaster
 
Регистрация: 05.05.2012
Сообщений: 7
Вопрос php/MySQL выводят Access denied for user. Непорядок.

Доброе время суток, господа. Полдня ковыряюсь в коде, не пойму, где собака порылась - нужна помощь...

Суть проблемы такова. Есть скрипт на php, который должен делать следующее:
1) Вычислить ip заходившего.
2) Если сессия не открыта, то найти соответствующее значение переменной r (реферер):
2.1) сперва в куках.
2.2) если там нет - то в таблице в базе данных, где сопоставлены ip и id рефереров.
2.3) если и там нет - то в адресной строке.
2.4) если нигде нет - задать значение по умолчанию.
2.5) записать это значение в сессию и сделать там пометку о том, что пользователь идентифицирован.
3) если ip в соответствующей таблице базы данных не числится - записать его туда вместе с вычисленным значением r.

Так вот... скрипт всё это вроде бы делает, но с одной весьма существенной помаркой. Когда открываю тестирования ради страницу (с предварительно вычищенными куками и очищенной таблицей ip) - то он показывает мне фигу (Access denied for user 'user'@'domain' (using password: NO)). И только после обновления страницы наконец выдаёт всё то, что должен выдавать (это всё идёт уже после вышеупомянутого скрипта).

Это я-то понимаю, что нужно всего-то нажать F5. А посетителям, конечно, надо бы выдавать нужную информацию без подобных заморочек. Но как это сделать - не пойму, мозги уже кипят буду признателен за помощь. Ну а вот, собственно, тот самый скрипт...

PHP код:
<?php
if (!isset ($_SESSION['authr']))
{
 if (!empty(
$_SERVER['HTTP_CLIENT_IP'])) 
 {
   
$ip=$_SERVER['HTTP_CLIENT_IP'];
 }
 elseif (!empty(
$_SERVER['HTTP_X_FORWARDED_FOR']))
 {
  
$ip=$_SERVER['HTTP_X_FORWARDED_FOR'];
 }
 else
 {
   
$ip=$_SERVER['REMOTE_ADDR'];
 }
}
function 
non_grata_test ($testing_r)
{
  global 
$testing_r;
  include_once (
"including/connect.php");
  
$connect mysql_connect ("$db_host""$db_account""$db_password");
  
$db mysql_select_db("$db_name"$connect);
  
$query_result mysql_query ('SELECT * FROM users') or die(mysql_error());
  while (
$row =  mysql_fetch_array ($query_result))
    {
      if (
$row['id'] == $testing_r)
      {
        if (
$row['non_grata']==0) { return 0; } else { return 1; }
        
$end_testing 1;
      }
    }
  if (
$end_testing != 1) { return 1; }
  unset (
$row);
  
mysql_free_result ($query_result);
  
mysql_close();
}
function 
find_in_pre_reg ($ip)
{
  global 
$ip;
  include_once (
"including/connect.php");
  
$connect mysql_connect ("$db_host""$db_account""$db_password");
  
$db mysql_select_db("$db_name"$connect);
  
$query_result mysql_query ('SELECT * FROM pre_reg') or die(mysql_error());
  while (
$row =  mysql_fetch_array ($query_result))
    {
      if (
$row['ip'] == $ip)
      {
        
$prereg_ip $row['ip'];
        
$pre_id $row['pre_id'];
        
$pre_ref $row['pre_ref'];
        
$success_getting 1;
      }
    }
  if (
$success_getting != 1) { $prereg_ip 0$pre_id 0$pre_ref 0; }
  return array (
$prereg_ip$pre_id$pre_ref);
  unset (
$row);
  
mysql_free_result ($query_result);
  
mysql_close();
}
if (
$unload == 1)
{
  
session_destroy();
  unset (
$_SESSION);
  unset (
$unload);
}
if (!isset (
$_SESSION['authr']))
{
  if (isset(
$_COOKIE['r']))
    {
      
$testing_r $_COOKIE['r'];
      if (
non_grata_test ($testing_r) == 0) { $r $testing_r;  } else { $cookie_error=1;  }
    }
    else
    { 
$cookie_error 1; }

  if (
$cookie_error == 1)
  {
    list (
$prereg_ip$pre_id$pre_ref) = find_in_pre_reg($ip);
    if (
$pre_ref!=0
    {
      
$testing_r $pre_ref;
      if (
non_grata_test ($testing_r) == 0) { $r $testing_r; } else { $pre_reg_error=1; }
    }
    else { 
$pre_reg_error=1; }
  }
  if (
$pre_reg_error == 1)
  {
    if (isset (
$HTTP_POST_VARS['r']))
    {
      
$testing_r $HTTP_POST_VARS['r'];
      if (
non_grata_test ($testing_r) == 0) { $r $testing_r; } else { $post_error=1; }
    }
    else { 
$post_error=1; }
  }
  if (
$post_error == 1)
  {
    
$r=1;
  }
$_SESSION['authr'] = 1;
setcookie ("r"$rtime()+86400);
}
include_once (
"including/connect.php");
$connect mysql_connect ("$db_host""$db_account""$db_password");
$db mysql_select_db("$db_name"$connect);
$query_result mysql_query ('SELECT * FROM pre_reg') or die(mysql_error());
while (
$row =  mysql_fetch_array ($query_result))
  {
    if (
$row['ip'] == $ip)
    {
      
$success_find 1;
    }
  }
unset (
$row);
mysql_free_result ($query_result);
mysql_close();
if (
$success_find != 1)
{
  include_once (
"including/connect.php");
  
$connect mysql_connect ("$db_host""$db_account""$db_password");
  
$db mysql_select_db("$db_name"$connect);
  
$query "INSERT INTO pre_reg (ip, pre_ref) VALUES ('".$ip."', '".$r."')";
  
$result mysql_query ($query) or die (mysql_error());
  
mysql_free_result($result);
  
mysql_close();
}
?>

Последний раз редактировалось MLMaster; 05.05.2012 в 22:42.
MLMaster вне форума Ответить с цитированием
Старый 05.05.2012, 22:27   #2
Andkorol
Старожил
 
Регистрация: 31.05.2010
Сообщений: 3,301
По умолчанию

Копипаста-то столько вам зачем?
PHP код:
  include_once ("including/connect.php"); 
  
$connect mysql_connect ("$db_host""$db_account""$db_password"); 
  
$db mysql_select_db("$db_name"$connect); 
Четыре раза одно и тоже.
Подробно ваш код не рассматривал - но причина может быть именно в таком копипасте - include_once подключает файл только 1 раз.
Судя по вашей ошибке - повторное подключение файла где-то не происходит (скорее всего - в одной из функций), и соединение с БД выдает указанную ошибку.
Andkorol вне форума Ответить с цитированием
Старый 05.05.2012, 22:51   #3
MLMaster
 
Регистрация: 05.05.2012
Сообщений: 7
По умолчанию

Мда... Вот уж не думал, что это может вызвать проблему. А действительно, заменил везде include_once на include - заработало Спасибо за подсказку
MLMaster вне форума Ответить с цитированием
Старый 05.05.2012, 22:59   #4
Andkorol
Старожил
 
Регистрация: 31.05.2010
Сообщений: 3,301
По умолчанию

Цитата:
Сообщение от MLMaster Посмотреть сообщение
А действительно, заменил везде include_once на include - заработало
Копипаст нужно из кода вычищать - а не функции менять.
Завтра, к примеру, понадобится вам указать дополнительные параметры подключения к БД (тот же SET NAMES, например) - упаритесь это прописывать в десятке разных скриптов.
Подключение к БД в коде должно быть только одно, в одном месте(файле).
А уж потом этот самый файл подключайте в ваши скрипты, по небходимости.
Andkorol вне форума Ответить с цитированием
Старый 05.05.2012, 23:05   #5
MLMaster
 
Регистрация: 05.05.2012
Сообщений: 7
По умолчанию

Цитата:
Сообщение от Andkorol Посмотреть сообщение
Копипаст нужно из кода вычищать - а не функции менять.
Это да, надо бы. Потому как уже сейчас тяжеловато искать недочёты, и я представляю, насколько сложнее это будет по мере присобачивания ещё каких-нибудь фишек в перспективе.
MLMaster вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Windows+Apache+PHP+MySQL: не работает расширение MySQL. Пепел Феникса Софт 10 15.04.2012 14:10
Access denied for user 'root'@'localhost' (using password: NO) koteotake Помощь студентам 0 02.12.2011 23:44
TopServer(PHP+MySQL+Apache+/etc), и обновление компонентов(в основном PHP) Пепел Феникса Софт 2 05.11.2011 14:38
DATASNAP, error - access is denied shurik_7866 БД в Delphi 1 27.10.2011 18:40
Функции 02 и 09 прерывания 21h ничего не выводят Alex071 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 11 27.05.2011 13:31