LinuxForum.Fans
Тема

Авторизация PHP и Apache

Автор: Sanatin 1 сообщений 4603 просмотров
#220473

Помогите разобраться со следующей проблемой пожалуйста. Есть свой сервер на FreeBSD (Apache, PHP, MySQL, DNS). Соответственно организован домашний хостинг и на нем крутятся сайты. Собственно проблема в авторизации PHP. На моем хостинге работает авторизация которая использует пользователей MySQL. А мне нужна авторизация пользователей, имена и пароли которых хранились бы в таблице любой из баз данных, неважно. Надеюсь понятно объясняю... Есть файл auth.php

text
<?php
include "blocks/connectdb.php";
if (isset($_POST['auth_name'])) {
  $name=mysql_real_escape_string($_POST['auth_name']);
  $pass=mysql_real_escape_string($_POST['auth_pass']);
  $query = "SELECT * FROM users WHERE name='$name' AND pass='$pass'";
  $res = mysql_query($query) or trigger_error(mysql_error().$query);
  if ($row = mysql_fetch_assoc($res)) {
    session_start();
    $_SESSION['user_id'] = $row['id'];
    $_SESSION['ip'] = $_SERVER['REMOTE_ADDR'];
  }
  header("Location: http://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']);
  exit;
}
if (isset($_GET['action']) AND $_GET['action']=="logout") {
  session_start();
  session_destroy();
  header("Location: http://".$_SERVER['HTTP_HOST']."/");
  exit;
}
if (isset($_REQUEST[session_name()])) session_start();  {echo "блин";}
if (isset($_SESSION['user_id']) AND $_SESSION['ip'] == $_SERVER['REMOTE_ADDR']) return;
else {echo "где?";}
{
?>
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="utf-8" />
<link rel="stylesheet" href="styles/reserv.css" />
<title>Вход в админку</title>
</head>
<body>
    <div class="form">
    <h1>Войти в административную часть сайта:</h1>
<form method="POST">
<p>Ваш логин:<br /></p>
      <input type="text" name="auth_name">
<p>Ваш пароль:<br /></p>
      <input type="password" name="auth_pass">
<br /><br />
      <input type="submit" value="Войти">
<br />
</form>
    </div>
</div>
</body>
</html>
<?php 
}
exit;
?>

А в файле index.php первой строкой после подключения к БД

text
require "auth.php";

.
Так вот, эта связка прекрасно работает у любого провайдера, а на моем хостинге нихрена не работает. Думал проблема в том, что не создаются сессии. Поправил php.ini - раскомментил строку session.save_path = "/tmp". Файл сессии стал появляться, но проблема не решилась. А выглядит это так - при нажатии "Войти" на форме просто мигает страничка, создается сессия и все... форма как висела так и висит, но уже с введенными логином и паролем. Напоминаю, у любого из провайдеров данная форма работает. Помогите поискать в чем может быть проблема, а то я уже себе мозг сломал. В логах чисто, без ошибок. Куда рыть не знаю =(

Ув. модератор! Просьба не переносить данную тему в программирование, потому что код рабочий, он не работает только у меня на фряхе, значит проблема в конфигурационных файлах либо apache, либо php, либо mysql.

проверил подключение к базе данных, выполнил $db=mysql_connect(blablabla); и после проверку if ($db != NULL) {echo "OK!";} - вывел ОК! два раза. Подключение к БД прошло, но почему он вывел ОК! два раза - непонятно, выполнил запрос к базе данных, вывел данные из массива, опять два раза... куда рыть?

Посмотрел логи мускула, после запроса вот такая фигня, откуда берется quit непонятно

text
/usr/local/libexec/mysqld, Version: 5.5.15-log (Source distribution). started with:
Tcp port: 3306  Unix socket: /tmp/mysql.sock
Time                 Id Command    Argument
120111  7:45:01     1 Connect   dimka@localhost on
                    1 Query     SET NAMES utf8
                    1 Init DB   skydb
                    1 Query     SELECT * FROM users WHERE name='dimka' AND pass='qwerty'
                    1 Quit
                    2 Connect   dimka@localhost on
                    2 Query     SET NAMES utf8
                    2 Init DB   skydb
                    2 Quit

При этом файл сессии создался.

my.cnf

text
port = 3306
socket = /tmp/mysql.sock
log = /tmp/log/mysql.log
key_buffer_size = 384
sort_buffer_size = 2M
read_buffer_size = 2M
read_rnd_buffer_size = 8M
myisam_sort_buffer_size = 64M
thread_cache_size = 8
query_cache_size = 32M
thread_concurrency = 8
skip-name-resolve
# Если Вы используете InnoDB, то закомментируйте эту опцию
#skip-innodb
# С этой опцией MySQL не будет инициализировать библиотеку Berkeley DB,
# что позволит сэкономить большое количество памяти.
#skip-bdb
#innodb_buffer_pool_size = 32M
#innodb_additional_mem_pool_size = 8M
#innodb_data_home_dir =/var/db/mysql/
#innodb_log_group_home_dir = /var/db/mysql/
#innodb_data_file_path = ibdata1:10M:autoextend
#innodb_log_file_size = 32M
#innodb_log_buffer_size = 8M
#innodb_log_files_in_group = 2
#innodb_flush_log_at_trx_commit = 1
#innodb_lock_wait_timeout = 70
max_connections = 1024

[mysqldump] quick max_allowed_packet = 16M

[mysql] # Отключает автоматическое рехеширование. rehash следует использовать # для получения хеша таблиц и полей. Это обеспечивает более # быстрый старт mysql. no-auto-rehash # Опция, которую рекомендуется раскомментить начинающим :) # Разрешает выполнять только операции UPDATE и DELETE, используя ключи. #safe-updates

[isamchk] key_buffer = 20M sort_buffer_size = 20M read_buffer = 2M write_buffer = 2M

[myisamchk] key_buffer_size = 256M sort_buffer_size = 256M read_buffer = 2M write_buffer = 2M

[mysqlhotcopy] interactive-timeout

Все, всем спасибо!
Надо было включить в php.ini
session.auto_start = 1

Войдите или зарегистрируйтесь, чтобы ответить.