Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Разбить текстовую строку на массив данных
 
 автор: Lin-san   (28.09.2008 в 13:44)   письмо автору
 
 

помогите пожалуйста разобратся с кодом:
есть текстовый фаил с масивом: 1¦2¦3¦


<?php
extract($HTTP_POST_VARS);
extract($HTTP_GET_VARS);
### Type 1
if($name)
{
@$results=file($name.'.txt') or exit('<b>Не найден фаил</b>');
$count=count($results);
echo ('<br> Число выборов:'.$count);
if ($count == 3)
{
for($n=0;$n<$count;$n++)
{
$temp= explode('¦',$results[$n]);
$vname[$n]=$temp[0];
if ($vname[$n] == 1)
{
echo ('<br>'.$vname[$n].$data1);
}
elseif ($vname[$n] == 2)
{
echo ('<br>'.$vname[$n].$data2);
}
elseif ($vname[$n] == 3)
{
echo ('<br>'.$vname[$n].$data3);
}
}
}
else echo('<b><br>Вы не выбрали 3 пункта!</b>');
}
else echo('<b>Не задано имя</b>');
?>


как сделать так, что бы мне этот скрипт выбирал из масива только "1" и приписывал к ней "some data", далее выбирал "2" и приписывал к ней другие данные. так же с 3-ойкой.
1: ....some data....
2: ....another data...
3: ....any data...

  Ответить  
 
 автор: Lin-san   (28.09.2008 в 13:59)   письмо автору
 
   для: Lin-san   (28.09.2008 в 13:44)
 

возможно ли такое сравнение???

if ($vname[$n] == 3)

  Ответить  
 
 автор: mihdan   (28.09.2008 в 14:19)   письмо автору
 
   для: Lin-san   (28.09.2008 в 13:44)
 

2 Замечания:
Код написан под РНР3 ?
Не используйте extract - это огромная дыра в безопасности ваших скриптов

  Ответить  
 
 автор: Lin-san   (28.09.2008 в 14:32)   письмо автору
 
   для: mihdan   (28.09.2008 в 14:19)
 

чем его заменить? оО

  Ответить  
 
 автор: mihdan   (28.09.2008 в 14:47)   письмо автору
 
   для: Lin-san   (28.09.2008 в 14:32)
 

extract или код?

  Ответить  
 
 автор: Lin-san   (28.09.2008 в 14:52)   письмо автору
 
   для: mihdan   (28.09.2008 в 14:47)
 

и экстракт и код)

...а в коде у меня не работает оператор IF
не делает он сравнение числа из базы и числа, который который я задаю.

  Ответить  
 
 автор: Lin-san   (28.09.2008 в 16:48)   письмо автору
 
   для: Lin-san   (28.09.2008 в 14:52)
 

код заработал.

  Ответить  
 
 автор: xx77   (28.09.2008 в 17:53)   письмо автору
 
   для: Lin-san   (28.09.2008 в 14:52)
 

переменные
$name
$data1
$data2
$data3
у Вас должны быть получены из массива $_POST или из $_GET
получаете их вначале скрипта ,

почти стандартные способы:
<?
$name 
= @$_GET['name'] || $name ''
// не очень правильный но работающий способ
// здесь  @ заглушает предупреждение, если $_GET['name'] совсем небыло установлено,
// или присваиваете $name пустую строку (пустая строка установится даже если передавалось значение '0')

$name = (isset($_GET['name'])) ? $_GET['name']: '';
// способ лучше
// проверяется установленна-ли переменная $_GET['name']
// и взависимости от результата устанавливается $name

// аналогично делаете с каждой нужной переменной из массивов $_POST или из $_GET
$data1 = (isset($_POST['data1'])) ? $_POST['data1']: '';

?>
даже можно сразу защититься от того что в эти data1, data2 и data3
напихают html-тегов, и они Вам весь дизайн странички испортют :)<?
//т.к. они нужны только в echo то их можно сразу htmlspecialchars();

$data2 = (isset($_POST['data2'])) ?htmlspecialchars($_POST['data2']) : '' ;
// ....................


Разбираетесь с этой $name ,
у Вас она используется в скрипте в качестве начала имени файла , file($name.'.txt')
и следовательно можно заставить скрипт читать любой файл с '.txt'
,только например перейдя по адресу вашего скрипта с строкой запроса adres?name=http://.....без .txt
или не адрес а путь по любым вашим папкам.

Непонятно что за файл Вы хотите считать в массив,
может у вас он всего один
, и можно просто тупо проверить $name сравнив с именем файла ,
, может лучше вообще избежать передачи имени , и передавать , только цифру
, может нужно проверить $name на соответствие шаблону if (preg_match('#[a-z]+#',$name)) ............

об этом история умалчивает.

и потом как только его прочитаете этот файл , чисто для себя, выведите структуру получившегося массива $results
добавив пару строк сразу после вызова функции file()
например такие
var_dump($results);
exit;

и посмотрите получилось-ли прочитать файл

p/s
такое-же var_dump() можно применить к любой переменной :)

upd//

долго сочинял ;))

  Ответить  
 
 автор: xx77   (28.09.2008 в 17:58)   письмо автору
 
   для: xx77   (28.09.2008 в 17:53)
 

если заработал с extract(),
то учитывайте то что обращение типа адрес.php?_SERVER[REMOTE_ADDR]=555.555.555.555

extract($_GET);
echo $_SERVER['REMOTE_ADDR'];
print_r($_SERVER);
опустошит Вам весь суперглобальный массив $_SERVER и подменит любую из переменных окружения

  Ответить  
 
 автор: Lin-san   (28.09.2008 в 20:00)   письмо автору
 
   для: xx77   (28.09.2008 в 17:58)
 

ухх)) спасибо большое)) ...можно сразу в манула)
только вот не допонял:
мне надо просто:

extract($HTTP_POST_VARS);
extract($HTTP_GET_VARS);


заменить на:

$name = (isset($_GET['name'])) ? $_GET['name']: '';
$data1 = (isset($_POST['data1'])) ? $_POST['data1']: '';

и так с каждой датой.


...а скрипт выглядит так (который я привел это 2-ой этап)
1-этап: пользователь заходит на страничку:
вводит имя - создается фаил txt : имя.txt
#тут можно как то закодировать, но как? через другую переменную.
так же на этой страничке он выбирает из 11-ти позиции 3-ри.
эти позиции записываются в фаил: имя.txt
теперь у нас есть текстовый фаил с масивом: 6¦2¦3¦

2-ой этап: я привел пример скрипта тут:
мы получаем из файла имя.тхт нужные нам позиции.
далее приписываем к тим позициям "наши" значения (например цену).
далее нам надо сохранить в файле имя.тхт новый ряд ввиде:
6-500¦2-200¦3-700¦

3-ий этап: показать пользовотелю после того как он выберет 3 позиции:
6 - 500
2 - 200
3 - 700

вот такая вот у мну была задачка))
сейчас думаю над пунктом 2 - как записать в фаил цены.

  Ответить  
 
 автор: sim5   (29.09.2008 в 04:39)   письмо автору
 
   для: Lin-san   (28.09.2008 в 20:00)
 

Вы что магазин на файлах делаете, или это корзина пользователя? У вас что к базе нет доступа?

  Ответить  
 
 автор: Trianon   (28.09.2008 в 20:12)   письмо автору
 
   для: xx77   (28.09.2008 в 17:53)
 

>даже можно сразу защититься от того что в эти data1, data2 и data3
>напихают html-тегов, и они Вам весь дизайн странички испортют :)

Сразу - не стоит.

  Ответить  
 
 автор: Lin-san   (29.09.2008 в 00:44)   письмо автору
 
   для: Trianon   (28.09.2008 в 20:12)
 

как закрыть файлы "имя.тхт" которые хранятся на сайте, от пользователей, что бы они не просматривали так:

директория/имя.тхт

??

  Ответить  
 
 автор: mehelson   (29.09.2008 в 04:21)   письмо автору
 
   для: Lin-san   (29.09.2008 в 00:44)
 

С помощью .htассеss
http://www.softtime.ru/article/index.php?id_article=25

  Ответить  
 
 автор: Lin-san   (29.09.2008 в 12:18)   письмо автору
 
   для: mehelson   (29.09.2008 в 04:21)
 

спасибо.

  Ответить  
 
 автор: xx77   (29.09.2008 в 23:12)   письмо автору
 
   для: Lin-san   (29.09.2008 в 12:18)
 

Для такой простой задачи , я-бы присмотрелся к суперглобальгому массиву $_SESSION
Можно вкратце ознакомиться с сессиями тут
http://softtime.ru/bookphp/gl8_1.php
но учитывая что $HTTP_SESSION_VARS это уже устаревающее имя этого массива

И для передачи между страницами достаточно строки
session_start()
и присваивать и читать значения из $_SESSION.

Только есть минус -
у пользователей должны быть включены cookies
или это придётся обходить передавая идентификатор сессии в адресе.

p/s
из слов Trianon'а ,о том что применение htmlspecialchars() сходу не лучший вариант,
увидел только намёк на то что пользователь сможет вставить в эти переменные текст максимального размера,
и эта функция будет всё это безобразие обрабатывать :)
Но по сути ,в памяти сервера и так уже будет вся эта поместившаяся туда строка,
Следовательно первым делом можно применять что-то типа
unpack() или substr() или sscanf() или sprintf(), или что-то другое
, что сможет загрузить в переменную ровно столько нужно ,и облегчит работу скрипта избавлением от переработки лишних данных :)

Но могу ошибаться или недопонимать в своих предположениях смысла этих слов :)

upd//
немного подумал и понял ещё один возможный смысл слов
ещё, и даже в первую очередь, наверное подразумевалась одна в последнее время постоянно-включенная опция
которая экранирует кавычки находимые в данных передаваемых пользователями посредством
GET POST и COOKIE

имя ей magic_quotes_gpc
она прячетс в недрах файла php.ini
и иногда заставляет честных кодеров бороться с её проявлениями , применяя stripslashes()
предварительно проверяя
if ( get_magic_quotes_gpc() )

Извиняюсь за многословие ))

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования