Перейти к содержимому

Реферальная программа Мегаплана


Вывести список программ из файла

#11 Tori

Tori
    Topic Starter
  • Пользователь
  • 35 сообщений
  • Репутация: 0
0

Отправлено 08 Ноябрь 2010 - 21:18

А что значат эти строчки (index.php):
________________________________________

$programms[] = explode(" ||| ", trim($programm));

И еще эти три палочки ||| в файле data.inc формируют массив? Просто мы использовали функцию array. Или это что-то другое?


И еще вопрос: Как включить функцию отображения ошибки в php?
  • 0

#12 ZiTosS

ZiTosS
  • Пользователь
  • 5 148 сообщений
  • Репутация: 8

Отправлено 10 Ноябрь 2010 - 17:00

Tori,
$programms[] = explode(" ||| ", trim($programm));

$programm - это у нас одна строка из файла - программа (пока в виде строки)
trim() - данная функция убирает из программы (в виде строки) с концов пробельные символы + различные \n\r\t
explode() - данная функция разбивает строку программы по разделителю " ||| " - т.е. возвращает массив разбитый по разделителю
$programms - данный массив содержит все программы из файла в форме
$programms = array(
	  array('Программа - гороскоп 1', 154, 'Гороскопы'),
	  array('Программа - антивирус 2', 0, 'Антивирусы'),
	  array('Программа - антивирус 3', 15, 'Антивирусы'),
	  ...
	  array('Программа - антивирус 4', 0, 'Антивирусы')
);
С помощью конструкции $programms[] в конец массива $programms помещается новый элемент. Т.е. Это указатель за последний элемент массива.

И еще эти три палочки ||| в файле data.inc формируют массив? Просто мы использовали функцию array. Или это что-то другое?

Это разделитель для формирования из строки в массив данных.

И еще вопрос: Как включить функцию отображения ошибки в php?

Что понимается под функцией отображения ошибок. Есть такое понятие как свои обработчики ошибок. Но как я понимаю, вы хотели спросить, как регулировать отображение ошибок в PHP - error_reporting()
  • 0

#13 Tori

Tori
    Topic Starter
  • Пользователь
  • 35 сообщений
  • Репутация: 0

Отправлено 10 Ноябрь 2010 - 18:46

ZiTosS, спасибо большое за объяснение)
  • 0

#14 Tori

Tori
    Topic Starter
  • Пользователь
  • 35 сообщений
  • Репутация: 0

Отправлено 13 Ноябрь 2010 - 20:00

И снова я прошу помощи. У меня вот какой вопрос.
Создала в html фору запроса.
Изображение
Как из этой формы извлекать данные?
  • 0

#15 ZiTosS

ZiTosS
  • Пользователь
  • 5 148 сообщений
  • Репутация: 8

Отправлено 14 Ноябрь 2010 - 11:25

Tori, и так, форму используют для передачи данных с одной страницы на другую методами:
1) GET - прямо в адресной строке после знака "?"
2) POST - в заголовках обращения к странице.

Как я понимаю, ваша форма выглядит примерно так:
<form method="[POST|GET]" action="handler.php">

<b>Поиск по названию</b>
<input type="text" name="search_name" />

<b>Выберите категорию:</b>
<input type="checkbox" name="internet_name" value="[value_1]" /> internet
<input type="checkbox" name="multimedia_name" value="[value_2]" /> multimedia
<input type="checkbox" name="discs_file_name" value="[value_3]" /> discs & file

<input type="checkbox" name="top10" value="[value_4]" />TOP10

<input type="submit" name="go" value="Отправить" />
<input type="reset" value="Отменить" />
</form>

В зависимости от выбранного метода, POST или GET, вы выбираете способ передачи данных. Поэтому и обращение к данным на странице handler.php будет разным:
// распечатаем переменную, переданную методом GET
echo $_GET['name'];

// распечатаем переменную, переданную методом POST
echo $_POST['name'];

Массивы $_GET и $_POST в PHP - это супер-глобальные массивы, хранящие значения переданных данных.
Для выбора определенного значения нужно указать ключ. В качестве ключа используется сформированный в теге input параметр name. Параметр name вы можете задать сами, какое хотите, но оно не должно начинаться со знака подчеркивания или цифры.
Я покажу вам как вывести все значения переменных, переданных методом POST из формы выше:
<?php

// выводим то что мы ищем
echo $_POST['search_name']; // выведется то, что пользователь ввёл в текстовое поле

// выводим первые три флага
if( isset($_POST['internet_name']) )
echo $_POST['internet_name']; // выведется [value_1]

if( isset($_POST['multimedia_name']) )
echo $_POST['multimedia_name']; // выведется [value_2]

if( isset($_POST['discs_file_name']) )
echo $_POST['discs_file_name']; // выведется [value_3]

// выводим значение флага TOP10
if( isset($_POST['top10']) )
echo $_POST['top10']; // выведется [value_4]
?>

Значение текстового поля можно выводить без проверки по ключу search_name, поэтому что оно будет существовать всегда, когда пользователь что-либо ввёл в поле, и даже когда пользователь оставил его пустым.

Флаги же нужно проверять, они могут как существовать, так и отсутствовать.
Если пользователь поставил галочку в флаг, то его значение можно будет получить - есть переменная.
Если пользователь не поставил галочку в флаг, то значение получить НЕЛЬЗЯ - переменной не существует.
Поэтому я и проверяю флаги на существование, прежде чем использовать их значения.
  • 0

#16 Tori

Tori
    Topic Starter
  • Пользователь
  • 35 сообщений
  • Репутация: 0

Отправлено 14 Ноябрь 2010 - 16:51

Выдается ошибка

Форма
<h3>Поиск программ по названию</h3> 
<form action="1.php" method=POST>
Введите название программы<br>
<input type="text" name="search_name" value='Skype'>
<h3>Поиск по категориям:</h3>
Выберите категорию:<br>
<input type=checkbox name='gen[]'
value='internet'>Internet<br>
<input type=checkbox name='gen[]'
value='multimedia'>Multimedia<br>
<input type=checkbox name='gen[]'
value='files'>Discs & Files<br><br>
<input type=checkbox name='s' value='sortirovka'>Сортировка программ по рейтингу<br><br>
<input type="submit" value="Отправить">
<input type="reset" value="Отменить">
</form>

Файл data.inc
<?php
// категории и соответсвующие им программы
$type = array(
"internet" => array(
"Skype Technologies" => "Skype",
"BitTorrent Inc." => "BitTorrent",
"Opera Software" => "Opera",
"Adobe Systems Inc." => "Adobe Flash Player",
"AOL" => "AOL IM"),
"multimedia" => array(
"Nero AG" => "Nero",
"KMPlayer.com" => "KMPlayer",
"Gabest" => "Media Player Classic"),
"cowonamerica.com" => "jetAudio"),
"speedbit.com" => "SpeedBit"),
"files" => array(
"RAR LAB" => "WinRAR",
"Daemon Soft Inc." => "Daemon Tools"),
"Alcohol Soft" => "Alcohol 120%"),
"Piriform Ltd." => "Defraggler")
);
// рейтинг программ
$reiting=array(
"Skype" => 10,
"BitTorrent" => 9,
"Opera" => 4,
"Adobe Flash Player" => 8,
"AOL IM" => 3,
"Nero" => 7,
"KMPlayer" => 5,
"Media Player Classic" => 2,
"jetAudio" => 0,
"SpeedBit" => 1,
"WinRAR" => 5,
"Daemon Tools" => 9,
"Alcohol 120%" => 4,
"Defraggler" => 6,
);
?>

PHP файл (где здесь ошибка?). Мне нужно чтобы при вводе в поле названия программы выводился Разработчик - Название программы, а при выборе определенной категории список всех программ по этой категории.
<?php

require("data.inc");
$str=NULL;
echo "<H3 align=center> По Вашему запросу найдено:</H3><BR>";

if($_POST["search_name"]{
foreach($type as $k1 => $programm){
foreach($programm as $maker => $title ){
if($maker==$_POST["search_name"]){
$str.="$maker - $title<BR>";}}}}

$a=$_POST["gen"];
$str3=NULL;
if($a!=NULL) {
foreach($type as $k1 => $programm){
for ($i=0;$i<count($a);$i++){
if($k1==$a[$i]){
$str3.="<BR>$k1:<BR>";
foreach($programm as $maker =>$title ){
$str3.="$maker - $title;<BR>";}}}}}

echo "<H4> По названию:</H4>";
echo $str;
echo "<H4> По категориям:</H4>";
echo $str3;

if (isset($_POST['s'])) {
echo '<br><br><b>Программы по рейтингу:</b><br />';
arsort($reiting);
list($key, $value) = each($reiting)
$str4="$key - $value";
echo $str4;
}
?>

  • 0

#17 ZiTosS

ZiTosS
  • Пользователь
  • 5 148 сообщений
  • Репутация: 8

Отправлено 14 Ноябрь 2010 - 17:40

Tori, решил проверить на компе:
1) Ошибка 1:
if($_POST["search_name"]{

где у вас закрывающая скобка условия? Советую вам писать другим способом, открывающие и закрывающие скобки операторов лучше писать на отдельных строках. Это хотя бы на начальный этап.
2) Ошибка 2:
		list($key, $value) = each($reiting)

Забыли в конце строки поставить ";"
3) Ошибка 3:
В файле data.inc вы наставили скобок закрывающих, которые там не уместны:
"multimedia"  => array(
	"Nero AG" => "Nero",
	"KMPlayer.com" => "KMPlayer", 
	"Gabest" => "Media Player Classic"),
	"cowonamerica.com" => "jetAudio"),
	"speedbit.com" => "SpeedBit"),
"files"  => array(
	"RAR LAB" => "WinRAR",
	"Daemon Soft Inc." => "Daemon Tools"),
	"Alcohol Soft" => "Alcohol 120%"),
	"Piriform Ltd." => "Defraggler")
 );
Скобки после "Media Player Classic" и "jetAudio" наверное не нужны! Так же и в другой категории.
4) Ошибка 4:
Надо проверять всегда, была ли отправлена форма или человек просто зашёл на эту страницу через адресную строку. Для этого достаточно проверять существование переменной, создающейся от кнопки submit. Если переменная существует, то продолжаем, если нет, то завершаем скрипт.
5) Ошибка 5:
Основывается на ошибке 4, т.е. вы не проверяете существование переменных, поэтому строка:
$a=$_POST["gen"];

приводит к ошибке, когда ни один чекбокс не выбран.
Конечно, усложнили вы себе задачу, но на ошибках учатся :) Дерзайте. Исправьте эти ошибки, а затем будем разбираться с остальными.
И приучайте себя сразу учиться понимать ошибки. Т.е. в ошибке всё сказано. Из-за чего ошибка, какого она типа(синтаксическая, фатальная и др.) и в какой строке ошибка.
Чаще всего у новичка ошибка в синтаксисе, поэтому как только увидели ошибку, посмотрели номер строки, переходим к этой строке, и смотрим на строчку выше и на саму строчку, скорее всего, сразу обнаружится незакрытая скобка или подобное.
  • 0

#18 Tori

Tori
    Topic Starter
  • Пользователь
  • 35 сообщений
  • Репутация: 0

Отправлено 14 Ноябрь 2010 - 20:39

Исправила указанные ошибки, спасибо. Да уж, со скобками это я не заметила Сейчас правильно выдает списки при выборе категорий, а вот в поле где вводится название он ищет если вводить разработчика, а не название программы.
Изображение
Исправила эту часть кода, сейчас сортировка работает правильно. Делала по примеру поэтому не очень понимаю, почему когда добавляешь WHILE перед list все работает, а если убираешь выводит только Skype - 10?
reset($reiting);
if (isset($_POST['s'])) {
echo '<br><br><b>Программы по рейтингу:</b><br />';
arsort($reiting);
while (list($key, $value) = each($reiting)){
$str4="$key = $value<BR>";
echo $str4;
}
}

Изображение

Что-то я 4 пункт про проверку переменных не поняла?!
["gen"] это какой-то оператор, или просто название переменной? Я по поиску не нашла.
И еще что за операторы list и each?
  • 0

#19 Tori

Tori
    Topic Starter
  • Пользователь
  • 35 сообщений
  • Репутация: 0

Отправлено 15 Ноябрь 2010 - 09:39

Преподаватель сказал что Обработка формы не соответствует логике включения переключателей Это я код неправильно написала что-ли?
  • 0

#20 ZiTosS

ZiTosS
  • Пользователь
  • 5 148 сообщений
  • Репутация: 8

Отправлено 15 Ноябрь 2010 - 22:46

Tori, продокументирую:
<?php
// в этот файл переходим из формы

require("data.inc"); // подключаем файл с данными (массив программ)
$str=NULL; // зачем NULL - $str = "" - разве пустая строка не катит?!
echo "<H3 align=center> По Вашему запросу найдено:</H3><BR>";

// Если передано слово для поиска (нет проверки, а вдруг оно пустое, что мучить комп)
if($_POST["search_name"]{
/*
* читаем общий массив (категория => массив(программы))
* $k1 (internet, multimedia, files)
*/
foreach($type as $k1 => $programm){
/*
* $programm - отдельная программа
* $marker - производитель
* $title - название программы
*/
foreach($programm as $maker => $title ){
if($maker==$_POST["search_name"]){ // если производитель совпадает с запросом (ВОТ ОНО, надо не $maker, а $title)
$str.="$maker - $title<BR>";}}}} // прибавляем к строке "производитель - программа"

$a=$_POST["gen"]; // вот здесь вы пытаетесь обратиться к переменной $_POST["gen"], а если флаг не стоит?! Будет ошибка...
$str3=NULL; // опять $str = ""

// такая проверка не прокатит, с NULL сравнивать бесполезно, это отдельный тип. $a никогда не будет NULL (если мне не изменяет память)
if($a!=NULL) {
/*
* читаем общий массив (категория => массив(программы))
* $k1 (internet, multimedia, files)
*/
foreach($type as $k1 => $programm){
/*
* $a - массив выбранных категорий
* цикл по всем выбранным категориям
*/
for ($i=0;$i<count($a);$i++){
// если одна из выбранных категорий совпадает с текущей из данных
if($k1==$a[$i]){
$str3.="<BR>$k1:<BR>"; // печатаем название категории
foreach($programm as $maker =>$title ){
$str3.="$maker - $title;<BR>";}}}}} // в цикле выводим все программы

echo "<H4> По названию:</H4>";
echo $str;
echo "<H4> По категориям:</H4>";
echo $str3;

// если поставили флаг рейтинга (вот она, правильная проверка)
if (isset($_POST['s'])) {
echo '<br><br><b>Программы по рейтингу:</b><br />';
arsort($reiting); // отсортировали в обратном порядке массив рейтинга
list($key, $value) = each($reiting); // вытаскиваем первый элемент из массива рейтинга
$str4="$key - $value";
echo $str4; // выводим его
}
?>


Исправила эту часть кода, сейчас сортировка работает правильно. Делала по примеру поэтому не очень понимаю, почему когда добавляешь WHILE перед list все работает, а если убираешь выводит только Skype - 10?

reset($reiting);
if (isset($_POST['s'])) {
	echo '<br><br><b>Программы по рейтингу:</b><br />';
		arsort($reiting);
		while (list($key, $value) = each($reiting)){
		$str4="$key = $value<BR>";
echo $str4;
		 }
	 }

while это массив с условием. Пока функция each будет возвращать true или значение не равное false (зоть это будет массив, строка или что ещё другое), будет обрабатываться тело цикла.
each() - это функция - она возвращает текущую пару ключ/значение из массива(параметра) и сдвигает указатель на следующий элемент. Понятное, дело, что когда элементы закончатся, функция вернет false.
list() - это языковая конструкция - Присваивает переменным из списка значения подобно массиву.

Стоку
while (list($key, $value) = each($reiting))

нужно понимать так:
1) Сначала выполняется функция each() - она возвращает пару ключ/значение и сдвигает указатель в массиве $reiting на следующий элемент
2) То, что вернула функция each() присваивается переменным $key, $value с помощью языковой конструкции list()
3) Далее идёт проверка выполнения условия. Проверяется то, что вернула функция each() Если fasle(закончились элементы) - выходим из цикла, если НЕ false(всё ещё обрабатываются пары ключ/значение) - обрабатываем тело цикла

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

["gen"] это какой-то оператор, или просто название переменной? Я по поиску не нашла.

$_GET и $_POST это массивы
$_GET["gen"] и $_POST["gen"] - это доступ к значению элемента массива по ключу "gen"
$_GET = array(
   "gen" = "значение1",
   "gen2" = "значение2"
);
Теперь
echo $_GET['gen']; // выведет "значение1"
echo $_GET['gen2']; // выведет "значение2"


Преподаватель сказал что Обработка формы не соответствует логике включения переключателей Это я код неправильно написала что-ли?

Это означает что логика работы вашей программы не верна.
Скорее всего здесь имелось ввиду следующее.
В вашей форме пользователь вводит название программы, которую он бы хотел найти, затем выбирает категории, по которым производить поиск.
И затем ставит флаг сортировки результатов поиска по рейтингу.
Скрипт должен найти программы в выбранных категориях по искомому слову и если нужно их отсортировать.

Что же делает ваша программа:
1) Выводит из всех категорий все найденные программы по названию (если исправите)
2) Выводит все программы из выбранных категорий
3) Если стоит флаг рейтинга, выводит совсем из другого, не связанного с первым, массива отсортированные данные. У вас массив программ и массив рейтинга не имеет связи.
Чувствуете здесь логику? Я пока нет.
  • 0

robot

robot
  • Пользователь PRO
  • 2 652 сообщений
  • Репутация: 85


Оформление форума – IPBSkins.ru