Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2009.07.05;
Скачать: [xml.tar.bz2];

Вниз

PHP и параметры строки   Найти похожие ветки 

 
dmk ©   (2009-04-28 06:16) [0]

Привет!
В HTML страничку помещен PHP-скрипт, который выводит ссылки для выбора категорий (Например: index.html/?category=3).
При первом запуске по умолчанию выбирается категория 1. Потом пользователь выбирает какую то категорию, например 3, но скрипт не видит параметры в строке. Т.е. я делаю так: $click = $_GET["category"],
но $click у меня всегда получается пустой, хотя в строке написано index.html/?category=3.
Подскажите как получить параметр?


 
dmk ©   (2009-04-28 06:29) [1]

Для уточнения: скрипт помещен в HTML-код как SSI.


 
palva ©   (2009-04-28 08:13) [2]

html страничка это то, что отправляется клиенту. Скрипт помещенный в нее не будет выполняться на сервере а отправляется клиенту. Для того, чтобы скрипт выполнялся на сервере, его URL нужно указать в атрибуте action формы. Именно этому скрипту передаются параметры формы. Если вы хотите включить в этот скрипт другой php-код, для которого должны быть доступны эти же параметры, включайте его при помощи команды php include, а не через SSI.


 
dmk ©   (2009-04-28 08:20) [3]

т.е. должен быть index.php, а не index.html? и весь HTML код выводить PHP средствами?


 
antonn ©   (2009-04-28 08:55) [4]

по умолчанию расширение html не обрабатывается php. Не я ли говорил уже про ЧПУ и htaccess в прошлой теме? :)


 
antonn ©   (2009-04-28 08:57) [5]

а, опять ssi...
а так пробывали? index.html?category=3


 
palva ©   (2009-04-28 09:00) [6]

Грубо говоря, да.
На самом деле может быть все что угодно, лишь бы это привело к работе серверного скрипта с передачей нужных параметров.
Например, файла index.html на сервере вообще может не быть. В этом случае сервер должен вернуть клиенту фиксированную страницу (ошибка 404) Имя этой страницы вы можете указать в .htaccess. Но если вы там укажете имя скрипта, который правильно обработает параметры и передаст клиенту нужный html-текст, то все будет в порядке.


 
palva ©   (2009-04-28 09:01) [7]

Это я отвечал на следующий вопрос:

> т.е. должен быть index.php, а не index.html? и весь HTML
> код выводить PHP средствами?


 
dmk ©   (2009-04-28 09:05) [8]

>Не я ли говорил уже про ЧПУ и htaccess в прошлой теме? :)
Скорее всего это был не я.

>а так пробывали? index.html?category=3
У меня именно так. В моем посте ошибка.


 
antonn ©   (2009-04-28 09:09) [9]


> Скорее всего это был не я.

ну да, я, но нема чья? )
http://delphimaster.net/view/15-1239829821/

значит вебсервером (точнее php) не "обрабатываются" html, отсюда отсутствие. На тестовом 11.php такие массивы есть?


 
dmk ©   (2009-04-28 09:19) [10]

antonn ©   (28.04.09 09:09) [9]

Прошу прощения. Точно я. :-)

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

Скачал тест сессий с php.net - у провайдера работает у меня нет.
Пишет Warning: session_start() [function.session-start]: open(/tmp\sess_li5cqiv7rcl3m9cftrf6jgdi37, O_RDWR) failed: No such file or directory (2) in D:\Dmk_server\test.php on line 9 Непонятно чего не хватает.


 
antonn ©   (2009-04-28 09:22) [11]

сервак на винде чтоли? в конфиге путь правильный нужно прописать


 
dmk ©   (2009-04-28 09:27) [12]

Спасибо. Прописал - работает. Только если куки выключить не работает.
А без них никак нельзя?


 
palva ©   (2009-04-28 09:27) [13]

Вам надо проверить установку session.save_path в php.ini
Только найдите у себя нужный php.ini их обычно накидано по компьютеру несколько, а используется один.


 
dmk ©   (2009-04-28 09:28) [14]

>сервак на винде чтоли?
Локальный на винде, а у провайдера FreeBSD.


 
dmk ©   (2009-04-28 09:32) [15]

Это у меня в конфиге
Может не так что-нибудь?

session.save_path = "c:/tmp"
session.use_cookies = 0
; session.use_only_cookies = 1
session.name = PHPSESSID
session.auto_start = 0
session.cookie_lifetime = 0
session.cookie_path = /
session.cookie_domain =
session.cookie_httponly =
session.serialize_handler = php
session.gc_probability = 1
session.gc_divisor     = 1000
session.gc_maxlifetime = 1440
session.bug_compat_42 = 0
session.bug_compat_warn = 1
session.referer_check =
session.entropy_length = 0
session.entropy_file =
session.cache_limiter = nocache
session.cache_expire = 180
session.use_trans_sid = 0
session.hash_function = 0
session.hash_bits_per_character = 5


 
palva ©   (2009-04-28 09:44) [16]


> c:/tmp

Попробуйте использовать обратный слэш.

Чтобы изменения php.ini вступили в силу нужно перезапускать apache


 
palva ©   (2009-04-28 09:52) [17]

Директория c:\tmp должна быть создана и доступна для записи. У меня, например, нет такой директории. Может, у вас тоже?

Тот ли php.ini вы правите?


 
dmk ©   (2009-04-28 10:02) [18]

palva ©   (28.04.09 09:52) [17]

Да php.ini у меня только один.

В общем сессии работают только когда включены куки и то через раз.
Иногда не регистрируются. С чем связано не знаю.

Когда куки отключаешь - не работают. Сессии не регистрируются :-(
А как же тогда быть? Если пользователь их отключит?


 
palva ©   (2009-04-28 10:22) [19]

А причем здесь работает/не работает. Сначала нужно решить проблему с открытием файла. Сессионные переменные у вас всё равно сохраняться не будут.
Ошибка при открытии файла исчезла?

> С чем связано не знаю.

Это связано с
session.use_cookies = 0
session.use_trans_sid = 0
их надо установить в единицу. Читайте здесь: http://www.phpfaq.ru/sessions


 
dmk ©   (2009-04-28 16:00) [20]

>Ошибка при открытии файла исчезла?
Да, ошибка исчезла.

Вот тест который рекомендован на PHP.NET
У меня не работает. ID сессии выдает, но переменные в ней не сохраняются.

session_start();

$sessPath   = ini_get("session.save_path");
$sessCookie = ini_get("session.cookie_path");
$sessName   = ini_get("session.name");
$sessVar    = "foo";

echo "<br>sessPath: " . $sessPath;
echo "<br>sessCookie: " . $sessCookie;

echo "<hr>";

if( !isset( $_GET["p"] ) ){
   // instantiate new session var
   $_SESSION[$sessVar] = "hello world";
}else{
   if( $_GET["p"] == 1 ){

       // printing session value and global cookie PHPSESSID
       echo $sessVar . ": ";
       if( isset( $_SESSION[$sessVar] ) ){
           echo $_SESSION[$sessVar];
       }else{
           echo "[not exists]";
       }

       echo "<br>" . $sessName . ": ";

       if( isset( $_COOKIE[$sessName] ) ){
       echo $_COOKIE[$sessName];
       }else{
           if( isset( $_REQUEST[$sessName] ) ){
           echo $_REQUEST[$sessName];
           }else{
               if( isset( $_SERVER["HTTP_COOKIE"] ) ){
               echo $_SERVER["HTTP_COOKIE"];
               }else{
               echo "problem, check your PHP settings";
               }
           }
       }

   }else{

       // destroy session by unset() function
       unset( $_SESSION[$sessVar] );

       // check if was destroyed
       if( !isset( $_SESSION[$sessVar] ) ){
           echo "<br>";
           echo $sessName . " was "unseted"";
       }else{
           echo "<br>";
           echo $sessName . " was not "unseted"";
       }

   }
}


 
dmk ©   (2009-04-28 16:06) [21]

ну и соответственно HTML

<a href=test.php?p=1>test 1 (printing session value)</a><br>
<a href=test.php?p=2>test 2 (kill session)</a>


 
palva ©   (2009-04-28 17:18) [22]

У меня этот код работает. В директории назначенной для хранения сессионных файлов появляется файл с содержанием переменной.


 
dmk ©   (2009-04-28 17:47) [23]

Даже не знаю, что и сказать. Когда я запускаю в первый раз, то
этот скрипт пишет problem, check your PHP settings.

Если обновить страницу, то в темпе появляется файл,
но переменной в нем нет.

У провайдера работает.

Проблема где-то у меня, но как ее обнаружить я не знаю.
А не мог бы я получить Ваш php.ini? Не знаю только, подойдет?
У меня PHP 5.2.1


 
dmk ©   (2009-04-28 19:21) [24]

Нашел проблему. Функция, которая использовала переменные сессии
была в конфигурационном файле, который был включен так:

require_once("eg_config.php");

переделал на require и все заработало!!! :-)

Спасибо за помощь!


 
dmk ©   (2009-04-28 19:27) [25]

Кроме того в php.ini значение session.auto_start = 0 !!!
Поэтому если сделать так, и вставить в первый попавшийся
php-код, то работает без вопросов.


$session_name = "PHPSESSID";
$session_started = session_is_registered($session_name);
if (!$session_started)
  {
   session_register($session_name);
   session_start();
  };


 
antonn ©   (2009-04-28 22:30) [26]

а мне вообще сессии не нравятся, не стабильно как то :)


 
dmk ©   (2009-04-28 23:32) [27]

antonn ©   (28.04.09 22:30) [26]

Мне тоже не нравятся. Действительно не стабильно.
А как Вы делаете параметры уникальными?


 
antonn ©   (2009-04-28 23:37) [28]

как я уже говорил, я юзаю обычные скрипты без всяких ssi, где в get передаю категорию и id картинки, вообще всю информацию по отображению стараюсь узнавать из GET, все это работает без всяких куков, доступно для индексации поисковиками и удобным обменом ссылками :)


 
antonn ©   (2009-04-28 23:56) [29]

а почему вообще вся идея с этим ssi или что там появилась?
ну для примера, моя "галерея": http://desksoft.ru/index.php?pictures&id=5&owner=3
в параметрах передается владелец, сама галерея (и там на странице id картинки), работает без каких то куков и записей в сессию.
Код я уже приводил:
if(isset($_GET["cat"]) && isnum($_GET["cat"])){
//рисуем ссылки с категорией cat
//echo "<a href=\"index.php?galery&cat=".$_GET["cat"]."\">url</a>";
}else{
//рисуем просто ссылки
//echo "<a href=\"index.php?galery\">url</a>";
}


 
dmk ©   (2009-04-29 10:40) [30]

>а почему вообще вся идея с этим ssi или что там появилась?

У меня опыта в програмировании WEB 0 целых 1 десятая из ста :-)
Поэтому я просто не знаю как делать. В моем распоряжении есть только
лицензионный Dreamweaver CS3. Есть еще Delphi for PHP, но чисто для
изучения. В общем я ограничен возможностями Дрима и своими скудными
знаниями. Вот и все.

Дело в том, что я дизайнер и сделав дизайн я должен написать именно
под свой дизайн и никак иначе. Соответственно у меня есть таблица
и место в ней и кроме SSI ничего в голову не приходит. А делать
дизайн средствами PHP, а не например Дрим + HTML – это неудобно.
Хотя думаю, что чего то не знаю. Насовав скриптов в дизайн я теперь
пытаюсь их связать. В итоге вчера связал, но работает нестабильно.
В куках иногда ничего не сохраняется. Редко, но бывает.


 
dmk ©   (2009-04-29 10:55) [31]

А по поводу моего приключения могу сказать следующее. Вчера нашел
на сайте разработчиков именно свою проблему: один в один.
С версии 4 качует и до сих пор не исправили.
Называется "breaks sessions handling".
http://aspn.activestate.com/ASPN/Mail/Message/php-Dev/1290276


 
dmk ©   (2009-04-29 11:28) [32]

Я вот думаю сделать такую связку:
Ссылки рисуются через скрипты PHP. При нажатии вызываю javascript
который читает выбранную ссылку и параметры и передает значения
PHP-скрипту, который обновляет активную ссылку.
Такой вариант лучше?


 
dmk ©   (2009-04-29 19:51) [33]

Ну ничего не получается... епрст...

Неужели никак нельзя сохранить один байт на стороне клиента без куков?
Скрытые поля и все такое, только без SUBMIT!!!

Помогите плз.


 
palva ©   (2009-04-29 20:06) [34]

Вопрос не понятен. Один байт он где находится? в переменной Javascript? Его нужно сохранить на диске клиента? В виде однобайтового файла? Для интернет страницы это криминал - сохранять что-либо у клиента помимо механизма кэша и куков.


 
dmk ©   (2009-04-29 20:22) [35]

У меня есть список. В нем поля со значениями read.php?category=1...20
20 ссылок. Скрипт вставлен как SSI в HTML-страницу.
Соответственно он рисует эти ссылки. Ссылки берутся из базы, поэтому нужен PHP.
Нужно как то реагировать на клики по ссылкам, причем страница должна
обновляться, но переходить по ссылке к PHP-скрипту. Состояние, т.е.
выбранную ссылку нужно сохранять. Куда ее сохранять? Куки не подходят.
Работают нестабильно.
У меня получилось передавать через JS в hidden-поле, а как считать теперь
значение из PHP?
Если нельзя, то как лучше изменить механизм определения на какую
ссылку кликнули? Как по ссылке сделать сабмит.
В общем ничего не работает.
Вариант внедрения огромного HTML-кода в PHP-скрипт не подходит.
Потом исправлять будет тяжело.


 
dmk ©   (2009-04-29 20:23) [36]

>но переходить по ссылке к PHP-скрипту
но НЕ переходить по ссылке к PHP-скрипту в новом окне.


 
dmk ©   (2009-04-29 20:24) [37]

Если на PHP никак, то как передать в JS список из имен файлов, чтобы делать это на машине клиента?


 
dmk ©   (2009-04-29 20:37) [38]

Даже так – упрощу:

есть ссылка со значением 1, щелкаю по другой со значением 2
страница перегружается, но php-скрипт должен узнать,
что щелкнули на 2 ссылке.

Когда он в SSI, то не видит SUBMIT и соответственно параметров
которые ему передали. Где можно сохранить значение "2", чтобы
при перезагрузке страницы, скрипт понял, что щелкнули по ссылке №2.

Запись в файл - не годится (проблема совместного доступа).
Куки не работают должным образом (иногда не сохраняют переменные в файл)
php-скрипт находящийся в SSI не может принимать параметры строки через $_GET.

Вот и проблема.


 
palva ©   (2009-04-29 21:26) [39]

Блин, вроде все слова знакомые, но не понимаю ничего... Кроме последнего предложения.


 
antonn ©   (2009-04-29 22:36) [40]


> А делать
> дизайн средствами PHP, а не например Дрим + HTML – это неудобно.
>

вот отсюда начнутся недопонимания :)
На ПХП не делают дизайн, дизайн верстают в ХТМЛ (макромедии, картинкой в пайнте и тп), а вот сам хтмл - результат работы ХТМЛ. Честно не знаю, как нужно начинающим начинать, сам диз (хтмл) я тренировался делать в блокноте для narod.ru, ну и на пхп перешел с тем же блокнотом, для меня это проще.

По поводу ссылок и их формирования, вот пример, об чем я говорил:
<?
function isNum($value) {
return (preg_match("/^[0-9]+$/", $value));
}

$arr=array();
$arr["1"]["name"]="gal1";
$arr["1"]["0"]="pic0.jpeg";
$arr["1"]["1"]="pic0.png";
$arr["1"]["2"]="pic0.bmp";

$arr["2"]["name"]="gal2";
$arr["2"]["0"]="pic1.jpeg";
$arr["2"]["1"]="pic1.png";
$arr["2"]["2"]="pic1.bmp";

$arr["3"]["name"]="gal3";
$arr["3"]["0"]="pic2.jpeg";
$arr["3"]["1"]="pic2.png";
$arr["3"]["2"]="pic2.bmp";

if(isset($_GET["cat"]) && isNum($_GET["cat"]) && isset($_GET["pic_id"]) && isNum($_GET["pic_id"])){

 if($_GET["cat"]>0 && $_GET["cat"]<4){
  if($_GET["pic_id"]>=0 && $_GET["pic_id"]<3){
   echo "picture: ".$arr[$_GET["cat"]][$_GET["pic_id"]];
  }
 }

}elseif(isset($_GET["cat"]) && isNum($_GET["cat"])){

 if($_GET["cat"]>0 && $_GET["cat"]<4){
  for($i=0; $i<3; $i++){
   echo "<a href=\"?cat=".$_GET["cat"]."&pic_id=".($i)."\">".$arr[$_GET["cat"]][$i]."</a><br>";
  }
 }

}else{
 for($i=0; $i<count($arr); $i++){
  echo "<a href=\"?cat=".($i+1)."\">".$arr[($i+1)]["name"]."</a><br>";
 }
}

?>


а то что делается с записью в сессию, да еще через куки - это костыль. И язык и хтмл придется учить, иначе ничего хорощего (в плане дизайна и кода) врядли получится.

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


 
antonn ©   (2009-04-29 22:36) [41]


> а вот сам хтмл - результат работы ХТМЛ

результат работы ПХП :)


 
dmk ©   (2009-04-29 23:02) [42]

antonn ©   (29.04.09 22:36) [40]

Этот код у меня работает без проблем.
Просто идеально работает, но чтобы совсем просто понять проблему,
приведу сильно сокращенную версию своего кода:

Это test.html


<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Demo</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
<body>
Hello world - PHP include next<BR>
<!--#include virtual="test.php" -->//Никаких параметров не передается
<BR>
that was the PHP include output
<BR>Now include php with a fixed parameter ...<BR>
<!--#include virtual="test.php?a=1" -->//Передается параметр a=1
</script>
</body>
</html>

и test.php

<?php
$a=htmlspecialchars($_REQUEST["a"]);
echo "value of parameter a=".$a;
?>



Когда задаешь параметр в теле HTML, то все прекрасно.
Параметры через SSI передаются нормально.
Вот теперь как средствами HTML заменить строку
<!--#include virtual="test.php?a=1" -->
на
<!--#include virtual="test.php?a=2" --> и т.д.


 
dmk ©   (2009-04-29 23:07) [43]

Через JS не выходит. Apache не понимает внутри поля <script> ничего.
Поэтому формирование строчки

sURL = "test.php?a="+index;
s = "<"+"!"+"--"+"#"+"include virtual="+sURL+" -->";
document.write(sURL);
что в итоге дает правильную строку, но ничего не дает.


 
dmk ©   (2009-04-29 23:09) [44]

извиняюсь, правильно document.write(s);
Все равно ничего не выводится, хотя в Алерт показывается правильно
сформированная строка.


 
antonn ©   (2009-04-30 00:23) [45]

ниче не понял :)
но возможно, что яваскрипт выполняется на клиенте, а страница уже сформировалась на сервере.


 
dmk ©   (2009-04-30 01:27) [46]

В общем SSI это лажа. Прочитал руководство от разработчиков.
Сделать нельзя ничего, только редирект в зависимости от данных сервера.
Логин Пароль Время и т.д. и т.п. Придется делать все на PHP.

А как же делают дизайн в HTML, а потом выводят средствами PHP?
Если у меня объем HTML страницы скажем килобайт 500. Это же такую
массу руками перелопачивать! А если исправить чего надо? В таком коде вообще запутаться можно. Как в этом случае быть?


 
antonn ©   (2009-04-30 01:41) [47]

юзают шаблонизаторы, при этом конечно страничку нужно нарисовать, сверстать, а потом уже бить на подшаблоны :) Я делаю тупо - в переменную загоняю кусок HTML (если надо - заменяю внутри некоторые подстроки через strereplace), а потом делаю echo этому куску, он уходит в ответ :)

получается примерно так:
$T_SMPL="<TR><TD>@text@</TD><TD>@tuxt@</TD></TR>";

function parse_string($template, $array_const, $array_replaces){
 return str_replace($array_const, $array_replaces, $template);
}

//делаю вывод
$pre="переменная, Два";
echo parse_string($T_SMPL,array("@text@","@tuxt@"),array("раз",$pre));

в браузер выведутся ячейки с данными, которые подставил код. Грубо - но работоспособно :)

да и 500кб - это пипец как много.


 
dmk ©   (2009-04-30 01:51) [48]

Это кошмар! У меня почти мегабайт HTML сделано и куда его теперь.
Там одних JS куча. Что же теперь всю логику на сторону сервера
переносить? Жуть!!! Да и не все перенесется.

В общем массив с URL буду сразу в JS передавать. Вариантов просто нет.



Страницы: 1 2 вся ветка

Форум: "Прочее";
Текущий архив: 2009.07.05;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.61 MB
Время: 0.005 c
15-1240991814
tytus
2009-04-29 11:56
2009.07.05
Что-то случилось с Delphi (Delphi 2007)


2-1242664388
copron
2009-05-18 20:33
2009.07.05
Выделение Timage


15-1240884969
dmk
2009-04-28 06:16
2009.07.05
PHP и параметры строки


15-1241410854
TUser
2009-05-04 08:20
2009.07.05
А где в метро гермозатворы?


2-1242388336
fs
2009-05-15 15:52
2009.07.05
TWriter





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский