[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Выборка данных из двумерного массива
Bandicoot
Ребята, не могу решить задачу, второй день мучаюсь. Работаю над скриптом авторизации. Данные о пользователях загружаются из текстового файла, т.к. СУБД не должно использоваться. Все данные я загнал в одну переменную, которая явлется двумерным массивом. Итак, дан двумерный массив, содержащий в себе массивы, состоящие из пар логин - пароль:

Array ( [0] => Array ( [0] => Коля [1] => 123 )
[1] => Array ( [0] => Вася [1] => 456 )
[2] => Array ( [0] => Петя [1] => 789 )
[3] => Array ( [0] => Олег [1] => 000 ) )

Соответственно пользователь вводит свои данные, которые нужно сравнить с каждой из пар, и при совпадении логина и пароля дать добро, в противном случае отказать в авторизации. Как это сделать?



Спустя 45 минут, 51 секунда (26.01.2011 - 04:24) kirik написал(а):
Bandicoot
Используйте ассоциативный массив: логин как ключ а пароль как значение. Только пароль нужно хранить в захэшированном виде.
$users = array(
'коля' => 'пароль',
'вася' => 'пароль',
...
);

if(isset($users[$_POST['login']]) && $users[$_POST['login']] == $_POST['password']) {
echo 'OK';
} else {
echo 'FAIL';
}

<<< это просто набросок (ака пример) к нему нужно прикрутить хэширование пароля с солью и приводить значения логинов к одному регистру.

Спустя 9 часов, 9 минут, 50 секунд (26.01.2011 - 13:34) dima4321 написал(а):
Присоединяюсь к предыдущему оратору код должен быть таким:

<?php

ini_set('display_errors',1);
error_reporting(E_ALL);

$n=array('0'=>array('dima'=>'abcd','petya'=>'ddd'));

$a='dima';
$p='abcd';

foreach($n as $value)
{

foreach($value as $key=>$new)
{
if($key==$a and $new==$p)
{
echo "ура пароль и логин верны";
}
}
}




?>


все отсальное возможно..но надо много оперировать с массивами плюс городить дополнительные циклы

вот посмотри может найдешь что

http://php.su/functions/?cat=array

Спустя 3 минуты, 40 секунд (26.01.2011 - 13:37) Snus написал(а):
Bandicoot
Уже обсуждалось в этой теме

Спустя 27 минут, 31 секунда (26.01.2011 - 14:05) dima4321 написал(а):
Жду большой большой и толсый плюсик


<?php

ini_set('display_errors',1);
error_reporting(E_ALL);

$a='misha';
$p='aaa';

$n=array('0'=>array('1'=>'dima','2'=>'ddd'),'1'=>array('1'=>'misha','2'=>'aaa'));

$i=0;
$kol=count($n);
while($i<$kol)

{
$y= array_search($a, $n[$i]);


if($y=='1' and $n[$i][2]=$p)

{
echo "ура пароль и логин верны";

}
$i++;

}



?>

Спустя 11 минут, 1 секунда (26.01.2011 - 14:16) dima4321 написал(а):
хотя нет..кривовато...но может кто и доведет до ума.

Спустя 8 минут, 21 секунда (26.01.2011 - 14:24) Snus написал(а):
dima4321
А зачем доводить? Я рабочий вариант выложил в другом посте. Ссылку кинул в этой теме.

Спустя 48 минут, 15 секунд (26.01.2011 - 15:12) Bandicoot написал(а):
Спасибо ребят, буду разбираться!

Спустя 13 часов, 28 минут, 7 секунд (27.01.2011 - 04:41) Bandicoot написал(а):
Цитата (dima4321 @ 26.01.2011 - 10:34)
Присоединяюсь к предыдущему оратору код должен быть таким:

<?php

ini_set('display_errors',1);
error_reporting(E_ALL);

$n=array('0'=>array('dima'=>'abcd','petya'=>'ddd'));

$a='dima';
$p='abcd';

foreach($n as $value)
{

foreach($value as $key=>$new)
{
if($key==$a and $new==$p)
{
echo "ура пароль и логин верны";
}
}
}




?>



Ребят, я все же не до конца разобрался, поэтому приведу свои исходиники полностью:
Это скрипт-обработчик, сделал, примерно так, как вы и советовали:
<?php

ini_set('display_errors',1);
error_reporting(E_ALL);

$username = $_POST['username'];
$password = $_POST['password'];

if (empty($username) || empty($password))
{
echo "Введите логин и пароль";
exit;
}

if (isset($username) || isset($password))
{
$username = trim($username);
$password = trim($password);
$fu = fopen('users.inc', 'r') or die("Ошибка! Не удалось открыть файл");

while(! feof($fu))
{
$user_info = fgetcsv($fu, 100, "|");
$logins[] = $user_info;
}

fclose($fu);

foreach ($logins as $value)
{
foreach ($value as $login => $pass)
{
if ($login == $username and $pass == $password)
{
echo "Добро пожаловать";
} else {
echo "Пошел вон, придурок!";
}

}
}
}

?>

А это файл с данными пользователей:

Коля|123
Вася|456
Петя|789
Олег|000

Итак, при выполнении и вводе правильных данных выводится сообщение об отказе в авторизации 8 раз! В чем моя ошибка?

Спустя 7 минут, 36 секунд (27.01.2011 - 04:48) Bandicoot написал(а):
Цитата (kirik @ 26.01.2011 - 01:24)
Bandicoot
Используйте ассоциативный массив: логин как ключ а пароль как значение. Только пароль нужно хранить в захэшированном виде.
$users = array(
'коля' => 'пароль',
'вася' => 'пароль',
...
);

if(isset($users[$_POST['login']]) && $users[$_POST['login']] == $_POST['password']) {
echo 'OK';
} else {
echo 'FAIL';
}

<<< это просто набросок (ака пример) к нему нужно прикрутить хэширование пароля с солью и приводить значения логинов к одному регистру.

Идея хорошая, но как привести мне свой двумерный массив, в такой ассоциативный? Мои исходники смотрите выше. Если честно я уже прочитал главу про массивы в книге по PHP раза 3, но так и не смог решить поставленную задачу. Вы конечно можете послать меня опять читать FAQ, но раз я открыл тему, значит для меня не все так просто...

Спустя 15 минут, 14 секунд (27.01.2011 - 05:03) Bandicoot написал(а):
Цитата (dima4321 @ 26.01.2011 - 11:05)
Жду большой большой и толсый плюсик


<?php

ini_set('display_errors',1);
error_reporting(E_ALL);

$a='misha';
$p='aaa';

$n=array('0'=>array('1'=>'dima','2'=>'ddd'),'1'=>array('1'=>'misha','2'=>'aaa'));

$i=0;
$kol=count($n);
while($i<$kol)

{
$y= array_search($a, $n[$i]);


if($y=='1' and $n[$i][2]=$p)

{
echo "ура пароль и логин верны";

}
$i++;

}



?>

Ваш метод тоже испробовал, не работает. Может я данные из файла неправильно загружаю?

Спустя 5 часов, 28 минут, 57 секунд (27.01.2011 - 10:32) Snus написал(а):
Bandicoot
Ты своим массивом с пользователями не исключаешь возможности дубликата логина! А это отнюдь не хорошо! Делай, как тебе посоветовали!

$n = array( 'dima' => 'ddd', 'misha' => 'aaa');


И зачем тебе создавать многомерный массив?! Тратишь драгоценную память :)

Спустя 35 минут, 36 секунд (27.01.2011 - 11:08) kirik написал(а):
Цитата (Bandicoot @ 26.01.2011 - 20:48)
Идея хорошая, но как привести мне свой двумерный массив, в такой ассоциативный?

Чет не понял, откуда там двумерный массив, ну да ладно.. Вот попроще вариант немного:
$data = file('users.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);

$users = array();
foreach($data as $line) {
list($u, $p) = explode('|', $line);
$users[$u] = $p;
}
unset($data); // убиваем, чтобы память не занимать..

print_r($users); // viola!

но все же советую использовать для таких целей БД..

Спустя 12 минут, 52 секунды (27.01.2011 - 11:21) Snus написал(а):
kirik
txt файл вообще никак не защищен. А если его поисковые роботы спалят? - вуаля smile.gif смотрите пароли smile.gif

Спустя 48 минут, 41 секунда (27.01.2011 - 12:09) Snus написал(а):
Для новичков написал простенький код авторизации

Файл index.php

<?php
session_start();
require_once 'users.php';

// Дабы в нескольких частях кода не писать одно и то же
// Выносим простенький код в функцию

function killSess(){
// Обнуляем сессию
$_SESSION['login'] = NULL;
// Рефрешемся
header('Location: '.$_SERVER['PHP_SELF']);
exit;
};

// Если юзверь нажал на EXIT выполняем функцию (та, что выше)
if($_GET['act'] == 'exit') killSess();

// Если сессия зарегистрированна, то объявляем ее в переменную
$sLogin = isset($_SESSION['login']) ? $_SESSION['login'] : NULL;

// Если поля логин и пароль заполнены и нажата кнопка log in
if(!empty($_POST['login']) && !empty($_POST['pass'])){
// Объявляем переменные
$login = $_POST['login']; // логин
$pass = $_POST['pass']; // пароль
// Проверяем есть ли в массиве юзверь с ключом login и сравниваем пароли

if(isset($arrUsers[$login]) && $arrUsers[$login] == $pass){
// Если условия выполнены, регистрируем сессию со значением логина
$_SESSION['login'] = $login;
// Рефрешемся
header('Location: '.$_SERVER['PHP_SELF']);
exit;
} else {
// Если юзверь в массиве отсутствует или пароли не совпадают, кричим об этом.
echo 'Incorrect Password!';
}
}


// Если все-таки сессия зарегистрированна и переменная благополучно объявлена
if(isset($sLogin)){
// На всякий случай сверяемся с текущими показателями массива.
// На случай если юзверя удалили, а сессия у него все еще висит.

if(!isset($arrUsers[$sLogin]) || empty($arrUsers[$sLogin])) killSess();

// Если все бодрячном - выдаем пару несвязанных слов
echo 'Hello, <b>'.$sLogin.'</b>! Your pass is <b>'.$arrUsers[$sLogin].'</b> <a href="?act=exit">EXIT</a>';

// ############## здесь можно инклудить свои странички или писать быдло-код :)

} else {

// А вот в случае, если сессия не зарегистрированна и переменная не объявлена,
// Выдаем форму ввода логина - пароля
// PS: вообще тут можно прописать require 'form.htm';
// А в form.htm закинуть свою форму ввода логина - пароля


echo '<form action="" method="post">';
echo '<table border="1">';
echo '<tr>';
echo '<td><input type="text" name="login"></td>';
echo '</tr>';
echo '<tr>';
echo '<td><input type="password" name="pass"></td>';
echo '</tr>';
echo '<tr>';
echo '<td><input type="submit" value="log in"></td>';
echo '</tr>';
echo '</table>';
echo '</form>';

}

?>



Файл users.php

<?php
// Загоняем юзверей в ассоциативный массив,
// Где Ключ - логин, значение - пароль.

$arrUsers = array(
'user1' => 'pass1',
'user2' => 'pass2'
);
?>

Спустя 2 часа, 51 минута, 30 секунд (27.01.2011 - 15:01) Georg-71 написал(а):
Спасибо огромное ша буду пробовать. huh.gif

Спустя 8 часов, 23 минуты, 36 секунд (27.01.2011 - 23:25) kirik написал(а):
Цитата (Snus @ 27.01.2011 - 03:21)
txt файл вообще никак не защищен

Да ну? smile.gif
Идея изначально провальная. Начиная от хранения пар логин/пароль в открытом виде в файле (не важно в каком), заканчивая потребляемой памятью при большом количестве записей.

Спустя 11 часов, 8 минут, 48 секунд (28.01.2011 - 10:33) Bandicoot написал(а):
Цитата (kirik @ 27.01.2011 - 20:25)
Цитата (Snus @ 27.01.2011 - 03:21)
txt файл вообще никак не защищен

Да ну? smile.gif
Идея изначально провальная. Начиная от хранения пар логин/пароль в открытом виде в файле (не важно в каком), заканчивая потребляемой памятью при большом количестве записей.

Я бы конечно использовал MySQL, но не для себя делаю - желание клиента.

Спустя 5 минут, 45 секунд (28.01.2011 - 10:39) Snus написал(а):
kirik
Если пользлвателей менее 1000, то много памяти не займет. А php файл все-таки понадежнее, чем txt. К тому же перед
require_once 'users.php';
можно поставить $antihack = 1;
И в самом users.php в начальной строке прописать
if(!$antihack) die('WTF?!');
Какая-никакая , но защита... :)

Спустя 3 минуты, 43 секунды (28.01.2011 - 10:43) kirik написал(а):
Цитата (Snus @ 28.01.2011 - 02:39)
можно поставить $antihack = 1;

Это явно лишнее.

Цитата (Snus @ 28.01.2011 - 02:39)
А php файл все-таки понадежнее, чем txt.

Не спорю, только серьёзная дырка в безопасности, а так конечно понадежнее smile.gif

Спустя 2 минуты, 46 секунд (28.01.2011 - 10:46) inpost написал(а):
kirik
Чем же опасно хранить пароль в PHP файле?

Спустя 2 минуты, 4 секунды (28.01.2011 - 10:48) Snus написал(а):
kirik
Почему лишнее? Это исключит запуск users.php независимо от основного скрипта (откуда инклудится usres.php).

Спустя 3 минуты, 13 секунд (28.01.2011 - 10:51) kirik написал(а):
Цитата (inpost @ 28.01.2011 - 02:46)
Чем же опасно хранить пароль в PHP файле?

Я не говорил что хранить опасно smile.gif

Файл служит БД пользователей. Пользователи регистрируются => файл изменяется автоматически самим php скриптом => этот файл могут изменить другие скрипты ... итп. Если хостинг кривой, то ввобще залететь можно smile.gif


Цитата (Snus @ 28.01.2011 - 02:48)
Почему лишнее? Это исключит запуск users.php независимо от основного скрипта (откуда инклудится usres.php).

А что будет при его запуске? Вывестись ничего не выведется.. Поэтому строчка лишняя smile.gif Имеет смысл так делать, когда скрипт выполняет какую-то работу, а если в нем всего лишь задается переменная - толку нет.

Спустя 4 часа, 31 минута, 38 секунд (28.01.2011 - 15:23) Bandicoot написал(а):
Цитата (kirik @ 27.01.2011 - 08:08)
Цитата (Bandicoot @ 26.01.2011 - 20:48)
Идея хорошая, но как привести мне свой двумерный массив, в такой ассоциативный?

Чет не понял, откуда там двумерный массив, ну да ладно.. Вот попроще вариант немного:
$data = file('users.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);

$users = array();
foreach($data as $line) {
list($u, $p) = explode('|', $line);
$users[$u] = $p;
}
unset($data); // убиваем, чтобы память не занимать..

print_r($users); // viola!

но все же советую использовать для таких целей БД..

Спасибо, так действительно проще!

Спустя 1 день, 14 минут, 37 секунд (29.01.2011 - 15:37) Bandicoot написал(а):
Да что за фигня! Вот код скрипта - обработчика:
<?php

ini_set('display_errors',1);
error_reporting(E_ALL);

$username = $_POST['username'];
$password = $_POST['password'];
// $tarif = $_POST['tarif'];

if (empty($username) || empty($password))
{
echo "Введите логин и пароль";
exit;
} else {

$data = file('users.inc', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
$users = array();

foreach($data as $line)
{
list($u, $p) = explode ('|', $line);
$users[$u] = $p;
}
unset($data);

if ($u == $username and $p == $password)
{
echo "Good";
} else {
echo "Fuck";
}
}

?>

А это файл с данными:
Коля|123
Вася|456
Петя|789
Олег|000

Для всех пользователей, кроме последнего в списке, скрипт выдает отказ в авторизации. Но последняя строка ничем не отличается принципиально! В чем косяк? Совсем не пойму!

Спустя 2 минуты, 15 секунд (29.01.2011 - 15:39) Snus написал(а):
Bandicoot
Может косяк в русскоязычных индексах?

Спустя 1 минута, 11 секунд (29.01.2011 - 15:41) Bandicoot написал(а):
Цитата (Snus @ 29.01.2011 - 12:39)
Bandicoot
Может косяк в русскоязычных индексах?

Все логины набраны на кириллице, включая последний, для которого все ОК

Спустя 55 секунд (29.01.2011 - 15:41) Snus написал(а):
Bandicoot
напиши в своем скрипте после цикла
echo '<pre>';
print_r($users);
echo '</pre>';

И покажи, что вывело

Спустя 55 секунд (29.01.2011 - 15:42) Snus написал(а):
Bandicoot
А только ща заметил...
Откуда у тебя берутся $u и $p?

	if ( isset($users[$username]) && $users[$username] == $password)
{
echo "Good";
} else {
echo "Fuck";
}

Спустя 2 минуты, 31 секунда (29.01.2011 - 15:45) Bandicoot написал(а):
Array
(
[Коля] => 123
[Вася] => 456
[Петя] => 789
[Олег] => 000
)

Спустя 1 минута, 37 секунд (29.01.2011 - 15:47) Snus написал(а):
Bandicoot
У тебя $u и $p в массиве используются, вот он тебе и вывел последние объявленные данные.

Спустя 3 минуты, 34 секунды (29.01.2011 - 15:50) Bandicoot написал(а):
А как сделать правильно, не подскажите?

Спустя 1 минута, 21 секунда (29.01.2011 - 15:51) Snus написал(а):
Bandicoot
Я же уже написал

	if ( isset($users[$username]) && $users[$username] == $password)
{
echo "Good";
} else {
echo "Fuck";
}

Спустя 5 минут, 40 секунд (29.01.2011 - 15:57) Bandicoot написал(а):
Цитата (Snus @ 29.01.2011 - 12:51)
Bandicoot
Я же уже написал

	if ( isset($users[$username]) && $users[$username] == $password)
{
echo "Good";
} else {
echo "Fuck";
}

Постойте, $users[$username] == $password, логин = пароль?

Спустя 2 минуты, 12 секунд (29.01.2011 - 15:59) Bandicoot написал(а):
А точно, ассоциативный массив же. Спасибо!


_____________
Работаю с Уии
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.