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

Форум PHP

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

 

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

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

тема: Не могу разобраться с глобальными переменными
 
 автор: Эдик12   (27.12.2009 в 13:20)   письмо автору
 
 

Здравствуйте!У меня такая проблема-у меня на странице несколько десятков отдельных форм.Пользователь вволит данные в одну форму-->ОТПРАВИТЬ, потом другую и тд.
Как определить, есть ли вообще глобальные переменные(т.е. нажал ли пользователь кнопку), передались ли вообще они?Мне это нужно для того, чтобы сначала поставить условие:если глобальных перееменных нет вообще, то выводить формы, а если есть, то выполнять такой-то код.подскажите, пожалуйста, как это сделать!

  Ответить  
 
 автор: Faatt   (27.12.2009 в 13:47)   письмо автору
 
   для: Эдик12   (27.12.2009 в 13:20)
 


if(isset($_POST['test'])
{
      //Код, если форма отправлена.
}
else if(!isset($_POST['test']))
{
      //Код, если форма не отправлена.
}

Здесь $_POST['test'] - это hidden поле с названием test, которое нужно поместить в форму, или использовать одно из обязательных полей формы. Вместо $_POST['test'] можно указать $_GET['test'], если метод, собственно GET.

  Ответить  
 
 автор: Эдик12   (27.12.2009 в 16:37)   письмо автору
 
   для: Faatt   (27.12.2009 в 13:47)
 

>

>if(isset($_POST['test'])
>{
>      //Код, если форма отправлена.
>}
>else if(!isset($_POST['test']))
>{
>      //Код, если форма не отправлена.
>}
>

>Здесь $_POST['test'] - это hidden поле с названием test, которое нужно поместить в форму, или использовать одно из обязательных полей формы. Вместо $_POST['test'] можно указать $_GET['test'], если метод, собственно GET.>
Так в ьом то и дело, что я не знаю, в какую форму пользователь ввел данные, у меня строчки прайса создаются с помощью цикла, и там имена для форм заполняются автоматически, те у меня есть переменная $p, которая при каждой новой строчке увеличивается на 1 и присваевается как имя для каждой новой формы, те в первой строчке name=a$p,во второй уже $p на 1 больше и тд.Пользователь же вводит данные в любую форму, а я не знаю в какую, и сначала мне надо проверить, есть ли какие-то глобальные переменные вообще, а если есть, то какие именно?Вот в чм вопрос

  Ответить  
 
 автор: sim5   (27.12.2009 в 14:29)   письмо автору
 
   для: Эдик12   (27.12.2009 в 13:20)
 

>у меня на странице несколько десятков отдельных форм.

Зачем так много?

  Ответить  
 
 автор: Эдик12   (27.12.2009 в 16:31)   письмо автору
 
   для: sim5   (27.12.2009 в 14:29)
 

Ну у меня типа прайса, где напротив каждого товара автоматически создается форма для заролнения количеством товара.

  Ответить  
 
 автор: Эдик12   (27.12.2009 в 16:38)   письмо автору
 
   для: Эдик12   (27.12.2009 в 16:31)
 

Для Faftt:
Так в том то и дело, что я не знаю, в какую форму пользователь ввел данные, у меня строчки прайса создаются с помощью цикла, и там имена для форм заполняются автоматически, те у меня есть переменная $p, которая при каждой новой строчке увеличивается на 1 и присваевается как имя для каждой новой формы, те в первой строчке name=a$p,во второй уже $p на 1 больше и тд.Пользователь же вводит данные в любую форму, а я не знаю в какую, и сначала мне надо проверить, есть ли какие-то глобальные переменные вообще, а если есть, то какие именно?Вот в чм вопрос

  Ответить  
 
 автор: Киналь   (27.12.2009 в 17:04)   письмо автору
 
   для: Эдик12   (27.12.2009 в 16:38)
 

Эм... А не проще сделать одну форму, а рядом с каждой позицией товара поставить input с именем, равным id товара? Тогда в обработчике циклом проходите по $_POST'у, ища ненулевые элементы, и бёрете для каждого пару "ключ-значение". И всё, дальше дело техники.

  Ответить  
 
 автор: Эдик12   (27.12.2009 в 17:34)   письмо автору
 
   для: Киналь   (27.12.2009 в 17:04)
 

Ну, во-первых я id товара не знаю, тк прайс строится на основе файла csv.
А нсачет одной формы-я изначально так и сделал, но, по-моему, у меня получилось так, что глобальная переменная для первого type является общей для других форм, и наоборот.
Т.е. я сделал так:создал таблицу с 3 сточками, получается скрипт вывел для них формы с именами 1,2 и 3(<input type=text name=1), потом в начале файла поcтавил условие if(!isset($_POST['1'])){ отображение прайса}else{echo "Hello";}и сначала я заполнил первую форму-->Hello, потом вторую и третью-->тож самое Hello, хотя должно было ничего не произойти, тк там уже глобальные переменные передавались $_POST['2'].По-моему, если одна форма, то и одна общая гл. переменная

  Ответить  
 
 автор: sim5   (27.12.2009 в 18:08)   письмо автору
 
   для: Эдик12   (27.12.2009 в 17:34)
 

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

  Ответить  
 
 автор: Эдик12   (27.12.2009 в 18:19)   письмо автору
 
   для: sim5   (27.12.2009 в 18:08)
 

Не ну прайс товаров будет сохраняться из 1С в формате csv, где будет и код товаров и все прочее

  Ответить  
 
 автор: sim5   (27.12.2009 в 18:25)   письмо автору
 
   для: Эдик12   (27.12.2009 в 18:19)
 

Ну речь то в вашем вопросе не о прайсе, а о выводе товаров на страницу. А для такого вывода писать под каждый товар форму, это крайне не оправдано и не удобно при получении о обработки данных.
Так в чем у вас хранятся товары?

  Ответить  
 
 автор: Эдик12   (27.12.2009 в 19:10)   письмо автору
 
   для: sim5   (27.12.2009 в 18:25)
 

Товары хранятся в 1С бухгалтерии, оттуда они сохраняются
как csv файл.Просто удобно-как товары, цены, наименования,
описания,id показаны в 1С и в csv,так они и представлены на
сайте.Короче, вот мой скрипт, который из файла берет данные
и строит таблицу, но с отдельной формой для ввода кол-ва
товаров для каждого товара
<html>
<body>
<?


$z
=0;
$x=0;
$c=0;
$csv="test.csv";
$open=fopen($csv,"r");
$file=file($csv);
echo 
"<table border=1>";
foreach(
$file as $string)
{

echo 
"<tr>";
$elements=explode(";",$string);
for(
$p=0;$p<count($elements);$p++)
{
echo 
"<td bgcolor=lightblue>$elements[$p]</td>";
}
if(
$x>=1)
$z++;echo "<td bgcolor=lightblue><form method=post action=index.php><input type=text size=3 name=a$z><input type=submit value=Добавить в корзину></form></td>";$c++;}
echo 
"</tr>";
$x++;
}
echo 
"</table>";
fclose($open);
echo 
"<a href=korzina.php>В корзину";

?>
</body>
</html>]

А вопрос общий в том, как сделать так, чтбы введя в несколько форм количество товаров, можно было кнопкой "сформировать заказ" эти заказы обработать, и вывести отдельно в таблице только те товары, кол-во которых пользователь указал.
В принципе, я подумал, что напротив каждой формы еще и сделать кнопку-в корзину, тем самым поочередно записывая нужный товар и его кол-во в файл а потом просто вывести его, но фопрос:как понять, передались ли вообще глобальные переменные из форм, а если да, то какая именно(для какой формы).В принципе, достаточно просто узнать, есть лии вообще глобальные переменные, а дальше я знаю?
Если есть вариант, как можно сделать это проще и(или) без глобальных переменных, то подскажите пожалуйста

  Ответить  
 
 автор: sim5   (28.12.2009 в 05:47)   письмо автору
 
   для: Эдик12   (27.12.2009 в 19:10)
 

1. Не создавайте из своего кода "портянки", не допускайте горизонтального скролла. Такой код и текст не удобно читать, и возможно, что по этой только причине вам никто не ответит.
2. Для работы с CSV-файлами уже существует функция fgetcsv.
3. Вам уже сказано - забыть о куче форм на странице, достаточно одной формы.

Вам ведь уже ответили выше, как это должно работать, вернее как можно организовать вывод и прием данных. Допустим 1С, но и в этом случае в базе ее каждый товар должен иметь уникальный идентификатор, вот на этот идентификатор и стоить обратить внимание в первую очередь, а не зацикливаться на глобальных переменных (о которых, кстати, не мешало бы почитать).

Прежде чем организовать вывод товаров на страницу, вы должны знать, чем торгует магазин. Если вы продаете Лексусы, то с вероятностью 99.999999% можно сказать, что на странице товаров выберут один Лексус. Но если вы торгуете пряниками и конфетами, то с такой же долей вероятности на странице могут выбирать по несколько упаковок пряников или конфет.

Это значит, что в этих двух случаях представление товаров в форме на странице будет разным. Объеденять их будет только одно - вы получите массив, который будет содержать выбранные поля формы, которые в свою очередь будут содержать уникальные идентификаторы товаров. И этот массив будет находиться в суперглобальной переменной $_POST или $_GET, в зависимости от метода передачи формы.

Если речь о Лексусах, то форме достаточно содержать чекбоксы, по одному на каждый товар, атрибут value которых будет равен ID товару. Имена всех чекбоксов одинаковы, с указанием на массив, например, goods[].

Если речь о пряниках, то это уже будут текстовые поля, атрибут value которых будет принимать значения количества выбранных покупателем товаров, а имена полей должны содержать ID товаров как ключи массива, например, goods[124], goods[23], goods[111] и т.п..

На стороне сервера нужно принять массив $_POST['goods'] (или $_GET['goods']) и обработать его для дальнейшего использования.

  Ответить  
 
 автор: Эдик12   (28.12.2009 в 13:58)   письмо автору
 
   для: sim5   (28.12.2009 в 05:47)
 

Как я понял, сначала в массив надо записать все id товаров, а потом при name=goods[0]-id 1-ого товара, name=goods[1]-id второго товара?Или при самом создании полей заносить поочередно в массив id товаров?

  Ответить  
 
 автор: sim5   (28.12.2009 в 14:30)   письмо автору
 
   для: Эдик12   (28.12.2009 в 13:58)
 

<?
$array 
= array(12=>4,125=>8,17=>9);
print_r($array)
?>

Что видим?

  Ответить  
 
 автор: Эдик12   (28.12.2009 в 16:11)   письмо автору
 
   для: sim5   (28.12.2009 в 14:30)
 

А, ну все, разобрался)))СПС большое
Вот еще вопрос, как установить так, чтобы в текстовые поля на моем прайсе можно было вводить только целые положительные числа, а другие знаки он бы просто игнорировал или выдавал какое-нить собщение??

  Ответить  
 
 автор: sim5   (28.12.2009 в 16:19)   письмо автору
 
   для: Эдик12   (28.12.2009 в 16:11)
 

Для клиента, это проверка ввода на JS. Но не зависимо от этой проверки, все равно проверять на сервере, для этого достаточно функции intval().
Читать мануал надо, там много инструментария.

  Ответить  
 
 автор: Эдик12   (28.12.2009 в 16:34)   письмо автору
 
   для: sim5   (28.12.2009 в 16:19)
 

Так а если ввели не число, а текст или отрицательное число, либо 1,25-это ж несеръезно, значит, решили пошутить, а нам этого не надо?

  Ответить  
 
 автор: sim5   (28.12.2009 в 16:37)   письмо автору
 
   для: Эдик12   (28.12.2009 в 16:34)
 

А вы хотя бы попробали приметь intval к тексту и посмотреть, что получится?

  Ответить  
 
 автор: Эдик12   (28.12.2009 в 16:42)   письмо автору
 
   для: sim5   (28.12.2009 в 16:37)
 

Нет.А что получится?
А как быть со знаком?

  Ответить  
 
 автор: sim5   (28.12.2009 в 16:44)   письмо автору
 
   для: Эдик12   (28.12.2009 в 16:42)
 

Так вместо того, чтобы спрашивать, что получится - пробуйте! Здесь форум, а не служба 09.

  Ответить  
 
 автор: Эдик12   (28.12.2009 в 16:54)   письмо автору
 
   для: sim5   (28.12.2009 в 16:44)
 

Ну я думаю так:
if(intval($val)!=NULL & intval($val)>0 & intval($val)=$val)
?
Выдает ошибку((((

  Ответить  
 
 автор: sim5   (28.12.2009 в 17:03)   письмо автору
 
   для: Эдик12   (28.12.2009 в 16:54)
 

intval - получает целочисленное значение переменной.
Что тут может быить не понятно?

if(intval($val)) это тоже самое, что и if(intval($val)!=0).
А это что за зверь: intval($val)=$val ?

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

Я же вам сказал - читайте мануал.

  Ответить  
 
 автор: Эдик12   (28.12.2009 в 17:06)   письмо автору
 
   для: sim5   (28.12.2009 в 17:03)
 

А,все, этот код подходит
if($val!=NULL & $val>0 & intval($val)==$val)
)))))
Спасибо еще раз!!!!
Только когда я в одно поле ввожу текст, в другое нормальные цифрф, то отображается с цифрами товар, но на непонятном языке?Блин, в чем причина?не одно, так другое?

  Ответить  
 
 автор: sim5   (28.12.2009 в 17:19)   письмо автору
 
   для: Эдик12   (28.12.2009 в 17:06)
 

intval($val)==$val - вот это что за хрень? Что она вам дает?

Причина в кодировке.

Как вы беретесь за проекты, собственно практически ничего не зная?

  Ответить  
 
 автор: Эдик12   (28.12.2009 в 17:26)   письмо автору
 
   для: sim5   (28.12.2009 в 17:19)
 

Так это не проект, это способ чему-нибудь научиться.Просто я хочу научиться на примерах, те перебирать задания, и в процессе узнавать все больше и болльше.
intval($val)==$val-это как бы целочисленное значение переменной сравнивается с самой переменной, если они совпадают, значит $val не дробное и можно дальше вести код
Так а что с кодировкой не так?У меня теперь при введении любых знаков в фоому отображаются эти значки

  Ответить  
 
 автор: Эдик12   (28.12.2009 в 22:22)   письмо автору
 
   для: Эдик12   (28.12.2009 в 17:26)
 

Кода я туда ввожу в поля цифры и нажимаю "сформировать заказ" то попадаю на страницу, где выведены товары, кол-во которых я вводил.И вот, если я ввожу цифры, то товар отображается русскими буквами.Как только я ввожу в поле буквы(чтобы проверить, что скрипт проигнорирует буквы)-все норм,игнорирует, но после этого когда я ввожу цифры(кол-во товара), то выбранные товары отображаются некорректно(непонятные значки).Если обновляю страницу-ничего.Только когда ввожу заново адрес страницы-тогда все норм до следующих букв в форме.Почему так происходит и как с этим бороться??

  Ответить  
 
 автор: sim5   (29.12.2009 в 02:55)   письмо автору
 
   для: Эдик12   (28.12.2009 в 22:22)
 

Проверить. Допустим, что ваша страница имеет метатег в котором объявлена кодировка 1251, поэтому все введенные в форму данные будут переданы на сервер в этой кодировке. Кроме этого сервер ваш может иметь кодировку по умолчанию которая может никак не отвечать заявленному в заголовке страницы. А проверить это можно, заглянув в настройки Apache, в файл его конфигурации httpd.conf, и посмотреть значение параметра AddDefaultCharset. Этот параметр можно изменять посредством .htaccess.
В общем у вас путаница где-то с объявлением кодировки, от сюда и проблемы, разбирайтесь. Ну или ваш скрипт имеет явные баги.

  Ответить  
 
 автор: Эдик12   (29.12.2009 в 11:17)   письмо автору
 
   для: sim5   (29.12.2009 в 02:55)
 

Все,спасибо, разобрался.

  Ответить  
 
 автор: Эдик12   (29.12.2009 в 11:21)   письмо автору
 
   для: Эдик12   (29.12.2009 в 11:17)
 

А можно последний вопрос, и я уезжаю домой??))
Вот у меня стоит условие:
if (isset($_POST['item'])) {echo "<table>";
     foreach($_POST['item'] as $key => $val) {if(($val!=NULL) && ($val>0) && (intval($val)==$val)){$el=explode(";",$key);echo "<tr>";
        for($e=0;$e<count($el);$e++){echo "<td>$el[$e]</td>";} echo "<td>$val</td>";}
     }
 echo "</table>";}
.А как можно сделать так, чтобы если ни одна переменная не удовлетворяет этому условию, то выводить какой-нибудь текст?

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

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