СообЧа > База Знаний > Интернет > Веб-строительство > PHP

Вопрос

А можно ли в страницу HTML (с расширением *.htm) вставить текстовой счетчик, написанный на php?

Ответ

Почему нет? Возможно. Единственное, что необходимо — это чтобы веб-сервер обрабатывал и файлы *.htm как php. В конфе апача или в файле настроек .htaccess это прописывается так:
AddType application/x-httpd-php3 .php3 .htm .phtm .html
или в случае 4го PHP:
AddType application/x-httpd-php .php .htm .phtm .html

А если есть поддержка SSI, то можно вставить примерно такой код: <!--include file "counter.php"--!>

kosmonavt

Вопрос

Ваш вопрос: в файле php.ini есть раздел настройки функции mail:

[mail function]

SMTP = localhost

sendmail_from = me@localhost.com

На моем сервере нет возможности использовать SMTP сервер (блокируется доменом более высокого уровня). Функция mail, естественно, не работает. Вопрос: будет ли работать mail, если я напишу SMTP = smtp.yandex.ru? Если да, то что надо писать в sendmail_from и на что это влияет?

Ответ

Да, можешь отсылать на любой доступный сервер (и внешний, при условии подключения в интернет — проверено). А sendmail_from это поле отсылаемого письма From:(e-mail отправителя) по умолчанию. Если в скрипте укажешь друггой, этот будет игнорирован.

Из конференции Expert_FAQ

Вопрос

Почему у меня при использовании команды $counter=fgets($fp,10); — считывание идет до ближайшего перевода каретки, дальше нет. — filesize($filename) дает одно значение, а считать возможно только меньше?

Ответ

fgets считывает файл по байту, останавливаясь, если уже считано n символов, файл или строка закончились. fgets удобно использовать для чтения текстового файла построчно, задав заведомо большую длину строки (fgets($fp,256)).

fread читает n символов и останавливается только в случае достижения окончания файла (eof). Попробуйте использовать его.

Вопрос

Где взять справочник по PHP на русском языке в электронном виде?

Ответ

http://www.emanual.ru
Последнюю русскую версию можно найти на сайте:
http://www.php.net.ua.
Можно скачать с http://dezine.ru/progs/
и ftp://ftp.script-info.net.
На http://www.script-info.net
можно скачать переведенный на русский язык мануал по PHP4 в архиве rar, около 2,5 мб.

http://www.php.net/download-docs.php
Есть русская версия, где вводные статьи (и что-то еще) переведено.

Из конференции Inet_Prog.

Вопрос

Пожалуйста, подскажите! Где можно лучше всего почитать и понять механизмы работы session в PHP4 в полном объеме. Честно говоря документацию я проработал, но работать с ними так и не научился из-за отсутствия опыта в этих делах. Хотелось бы видеть примеры использования в системах аутентификации пользователей с использованием cookies и без них, а также механизм шифрования пароля и данных при передаче от пользователя к серверу. И еще правильно ли заявление, что session является наиболее эффективным механизмом (я не имею ввиду маленькие проекты типа домашних страничек, а более серьезные разработки).

Ответ

Если на русском, то сходи на http://php.spb.ru
Если знаешь английский : www.phpbuilder.com www.devshed.com

Вопрос

Где можно скачать дистрибутив PHP и как все это дело установить?

Ответ

Не мудрствуй лукаво… Есть же www.php.net — там парни работают на совесть: заходишь на download, выбираешь то что тебе нужно, качаешь несколько Мег, устанавливаешь (там все просто) и работаешь.

Вопрос

Не подскажете, где можно найти PHP-скрипт, который строит дерево ссылок (уровень ссылки и ее текст берется из mySQL базы) с возможностью сворачивания и разворачивания веток?

Ответ

Посмотри здесь — http://www.eav.vov.ru Именно — меню сайта. Почти то, что тебе нужно. Только я «разворачивание» искусственно убрал, поскольку количество пунктов пока невелико. Как убрал? В скрипте добавил один if. На сайте работает в PHP4, данные в файле. Есть отлаженный вариант под MySQL.

Вопрос

Я читал что если php подключен как модуль к apache то он работает быстрее. Вопрос: Где можно скачать этот модуль и как его установить в среде Windows?

Ответ

На php.net качаешь последнюю версию php, только полной комплекции (это около 4-5 мег), а не урезанную (700Кб), там есть модуль php4apache.dll.

Пропиши в конфиге Апача:

LoadModule php4_module c:/php/sapi/php4apache.dll
AddType application/x-httpd-php .php4


Перезапусти Апач. Должно работать. Если не захочет — попробуй скопировать эту библиотеку в c:\windows\system\, исправив путь в конфиге.

Вопрос

Вопрос по переменным окружения РНР. Если есть у кого полный список, или знаете, где такой можно взять в Интернете?

Ответ

Таковой список способен выдавать сам PHP. Для этого необходимо написать простенький скрипт:

<? phpinfo(); ?>

затем обратиться к нему из броузера. Получите массу полезной информации, в том числе и список переменных окружения. Также это добро есть в документации на PHP: Variables — Predefined variables.

Вопрос

Иногда появляется вот такая ошибка: «Parse error: parse error in z:\test\sample.php on line 150» где 150, я так понимаю, номер строки, на которой произошла ошибка. Но, у меня только 149 строчек!

Ответ

Такая ошибка может возникнуть, например, когда не закрыта фигурная скобка. Парсер ее ожидает на 150-й строке, не находит, и ругается.

Вопрос

В РНР я начинающий. Посему, терзают смутные сомнения: как будет индексироваться мой сайт, ежели контент будет находится в базе данных, а включаться в страницу — динамически по запросу пользователя?

Ответ

Поисковые системы работают по тому же принципу, что и твой браузер. Т.е. они получают от сервера страничку (типа www.yoursite.ru) и просматривают ее на наличие ссылок, ключевый слов, мета-тэгов и прочей нужной им ерунды. Затем берут первыю ссылку, идут по ней, снова просматривают и т.д. Они пользуются только теми ссылками, которые прописаны в коде, получаемом от сервера, а сервер им выдает страницу, содержащую только HTML.

Он так устроен: PHP и прочие CGI скрипты обрабатываются сначала им, затем генерируется HTML, который и отправляется клиенту, т.е. мне, тебе или поисковому роботу. И все мы видим только результат работы сервера, а не исходную программу. Поэтому использование скриптов на стороне сервера не влияет на индексацию, а вот использование клиентских скриптов (типа Java-скриптов) очень сильно влияет, и в большинстве случаев не дает поисковику нормально индексировать страницу.

Резюме: даже не думай об этой проблеме, все будет работать!

Из конференции Expert_FAQ

Вопрос

Из таблицы бд считывается содержимое и выводится в форму в виде таблицы. Одним из элементов каждого ряда является чекбокс. При субмите этой формы, скрипт, если чекбокс отмечен, выполняет некий запрос. Имя каждого чекбокса также генерируется автоматически и выглядит так: check0, check1, … checkn, где n — число текущей строки, не является постоянным.
Споткнулся же я вот на чем: как обработать форму на наличие отмеченных чекбоксов?

Ответ

Я делал похожее, но с лист-боксами. Используй массив: сделай имена чекбоксов элементами массива check[0], check[1], check[2], а в скрипте:

foreach ($check as $k => $v)
{
if ($v = 'on')
{
// вроде ж 'on' там передается? не помню точно…
// можно этой проверки и не делать, по большому счету.
// do something with $k
}
}

Таким образом, в массиве окажутся номера строк, у которых поставлена птичка.

Андрей, Андрей Переводчик

Вопрос

Можно ли снять(удалить) cookie принудительно, до времени истечения срока или до конца сессии. То есть, если я ставлю cookie на одну сессию, могу я ее как-нибудь удалить, не закрывая браузер?

Ответ

SetCookie("MyCookie") — кукис «MyCookie» удаляется.

Слава

Кстати, для того что бы удалить ВСЕ куки достаточно сделать вот что:
while (list($key, $value) = each ($HTTP_COOKIE_VARS)) {
setcookie($key,"");
}

alesh.ru

Вопрос

Мне нужно решить вот такую задачу:
Есть папки с именами, например, 140, 141, 142 и т.д. Мне нужно узнать программным путем какая из этих папок носит самый большой номер. И еще, как можно подсчитать количество директорий?

Ответ

Если в папке есть только такие директории, то можно сделать так:

<?php $dir=dir("."); //сделали объект директории
$dir->rewind(); //указатель на начало директории
while($fails=readdir($dir->handle)) //считывает все файлы из
//директории
{ While($fails=$dir->read())
{
if(is_dir($fails))
{
masiv[]=$fails;
}
}
}
?>


По идее, все элементы в массиве будут идти по именам, и думаю что сортировать массив по имени не надо будет! А потом проверяешь сколько в массиве элементов (кол-во директорий) и считываешь последний!

Из конференции Inet_prog

Вопрос

Переменная $a содержит текст. Подскажите, как удалить из переменной все теги HTML.

Ответ

Я пользуюсь функцией, которая дана в официальном руководстве по РНР, и пока все ок, только поменяла ее в одном месте — помечено двумя звездочками:

function del_tags($page)
{
/* $page — лучше строка, но может передаваться и массив строк, return $page без тегов
*/

/*$page=file($addr);*/

$search = array ("'<script[^>]*?>.*?</script>'si", // Strip out javascript
"'<[\/\!]*?[^<>]*?>'si", // Strip out html tags
"'([\r\n])[\s]+'", // Strip out white space
"'&(quote|#34);'si", // Replace html entities
"'&(amp|#38);'si",
"'&(lt|#60);'si",
"'&(gt|#62);'si",
"'&(nbsp|#160);'si",
"'&(iexcl|#161);'si",
"'&(cent|#162);'si",
"'&(pound|#163);'si",
"'&(copy|#169);'si",
"'&#(\d+);'e"); // evaluate as php
$replace = array (" ", // **
" ", // **
"\\1",
" ",
"&",
"<",
">",
" ",
chr(161),
chr(162),
chr(163),
chr(169),
"chr(\\1)");

$page = preg_replace ($search, $replace, $page);
return $page;
}


Ирина Гришанова

$a=strip_tags($a);

strip_tags
(PHP 3>= 3.0.8, PHP 4 >= 4.0b2)

strip_tags — Strip HTML and PHP tags from a string Description

string strip_tags (string str [, string allowable_tags])

This function tries to return a string with all HTML and PHP tags stripped from a given str. It errors on the side of caution in case of incomplete or bogus tags. It uses the same tag stripping state machine as the fgetss() function.

You can use the optional second parameter to specify tags which should not be stripped.

Note: Allowable_tags was added in PHP 3.0.13, PHP4B3.

Вопрос

В HTML странице есть форма, там есть текстовое поле. Как введенные пользователем данные (этот текст) передать PHP скрипту, чтобы, например, записать в txt файл, хранящийся на моем хосте?

Ответ

Вот простейший пример:

<?php
if(!empty($_POST["name"])&&!empty($_POST["email"])){
echo 'Вот, что ввел посетитель в форме:<BR>Ваше имя: '.$_POST["name"].'<BR>Ваш e-mail: '.$_POST["email"];
} else {echo 'Посетитель не соизволил заполнить форму! :(';}
?>

А вот код странички form.htm:

<HTML>
<HEAD>
<TITLE>Форма</TITLE>
</HEAD>
<BODY>
<FORM method=post action=echo_var.php>
Ваше имя: <INPUT type=text name=name><BR>
Ваш e-mail: <INPUT type=text name=email><BR>
<INPUT type=submit>
<FORM>
</BODY>
</HTML>

Из конференции Expert_FAQ

Вопрос

Как войти в строку mysql?

Ответ

Если вы имеете в виду утилиту типа SQLPlus (Oracle), то это x:\mysql\bin\mysql.exe.

$row=mysql_fetch_row($res) где $res — результат запроса:
$res=mysql_query("SELECT … FROM …");

sasha-s

Вопрос

Подскажите как вставить с помощью РНР в html-страничку картинку gif или jpg сохраненную в базе MySQL. С помощью include/require не получается из-за header.

Ответ

Я пробовал сделать так: написать скрипт img.php, который принимает в качестве GET переменных параметры картинки. Допустим, это значение поля id в таблице с именем images.

<?php
if (isset($HTTP_GET_VARS["id"])) {
$id = $HTTP_GET_VARS["id"];
/*Достаем из базы картинку с кодом $id в $img_source*/
$img = ImageCreateFromString($img_source);
/*Допустим, будем выводить jpeg.*/
$type = "jpeg";
header("Content-type: image/" . $type);
$func_name = "image" . $type;
$func_name($img);
} else {
/*Обработка ошибок.Можно создать картинку с сообщением об ошибке.*/
}?>

Вопрос

Как можно в html-страничку встроить свой шрифт? То есть идея в том, что сам шрифт (который я сам нарисовал) кидается на сервер вместе с документом. Вот как его прописать нужно, чтоб текст писался именно моим шрифтом?

Ответ

Надо сконвертировать шрифт .ttf в формат .eot, все это делается с помощью Microsoft WEFT. Потом с помощью CSS можно объявить свой шрифт:

@font-face {
font-family: Goudy Stout;
font-style: normal;
font-weight: 700;
src: url(GOUDYST0.eot);


Из конференции Inet_prog

Вопрос

Можно ли на PHP написать нечто, выведящее содержимое некоторого файла формата текст или хтмл, лежащего на сервере в рабочем www-каталоге?

Ответ

Можно просто включить этот файл в текущий.

include("dir1/dir2/file.txt");

Вопрос

Вопрос касается PHP. Необходимо писать в начало (или середину) файла причем не удаляя содержимого (как бы раздвигая содержимое файла). Приведенный ниже фрагмент не работает :-(

<? $st=fopen("p.txt", "a+"); //открыли для записи
fseek($st,0,SEEK_SET); //устанавливаем указатель на начало файла со смещением 0
fputs($st,"something"); //пишем в файл (по идее в его начало)
fclose($st); //закрыли ?>


В результате все равно запись появляется в конце файла.

Ответ

Дело в том, что Вы открыли файл в режиме для добавления, и если Вы указатель смещаете в 0, то он смещается на нулевую позицию добавления. Т.е. в конец первоначального файла.
Для того, чтобы записать в начало, потребуется загрузить файл в переменную, вывести во вновь созданный файл сначала нужную строку, а потом остальное содержимое, сохраненное в переменной.
Это не ограничение какого-либо языка программирования. Просто таков принцип хранения информации на дисках.

BSP

Дело не в принципе хранения информации на диске. Эта задача вполне разрешима, если заменить строку
$st=fopen('p.txt', 'a+') на $st=fopen('p.txt', 'r+')

SiMM

Вопрос

Как из изображения, загружаемого пользователем через форму, сгенерить маленькие превьюшки?

Ответ

Как вариант, воспользуйся функцией GetImageSize(<путь к картинке>,<массив параметров>).
Элемент 0 массива содержит значение ширины картинки в пикселях, Элемент 1 — высоту.
Для создания тумба просто подели эти значения на одно и тоже число и не забудь округлить.

:
<?


$pic_size = GetImageSize("pic/picture.jpg");


$scale_factor = <Необходимое число>;
$small_w = round($pic_size[0]/$scale_factor);
$small_h = round($pic_size[1]/$scale_factor);


?>

<img src="pic/picture.jpg" width="<?echo"
$small_w";?> height="<?echo"$small_h";?>>, где




В предыдущем примере размер картинки в Кб остается одним и тем же. Есть такие функции, как:

$im = ImageCreateFromJPEG ($imgname);

потом получаем размеры загруженной картинки, потом создаем новую с уменьшенными размерами и копируем исходную картинку в нее такой командой:

ImageCopyResized int imagecopyresized (resource dst_im, resource src_im, int dstX, int dstY, int srcX, int srcY, int dstW, int dstH, int srcW, int srcH)

*******

function img_kastr($path, $file_name, $width, $alt, $align){
// уменьшитель картинок: $file_name — имя файла, $path путь, $width желаемая ширина картинок. $pth = $path.$file_name;
if (ereg("^(.*)\\.(jpg|jpe|png)$", "$pth")){
$f=GetImageSize("$pth");
if ($f[0]>$width){
$heigth = intval(round($width*$f[1]/$f[0]));
}
else {
$heigth = $f[1];
$width = $f[0];
}
$dst_im = imageCreate($width, $heigth);
switch($f[2]) {
case 1:
$src_im = imageCreateFromGIF($pth);
break;
case 2:
$src_im = imageCreateFromJPEG($pth);
break;
case 3:
$src_im = imageCreateFromPNG($pth);
break;
}
imageCopyResized($dst_im, $src_im, 0, 0, 0, 0, $width, $heigth, $f[0], $f[1]);
$replace = "\\1_".$width.".jpg";
$file_name =
eregi_Replace('([[:alnum:]])(\\.[[:alnum:].]*)?$', $replace, $file_name);
// Header("Content-type: image/jpeg");
imageJPEG($dst_im, 'files/'.$file_name);
?><img src="/files/<?echo $file_name?>" alt="<?echo
$alt?>" border=0 align=<?echo $align?>><?
}
}


antua

Вопрос

Как к IIS прикрутить PHP?

Ответ

Ставите 4.20 или выше — он сам прикручивается Или запустите файл C:\PHP\sapi\pws-php4isapi.reg C:\PHP — папка, куда поставили PHP

******

Обычно это PHP прикручивают к IIS.

Вопрос

Есть вопрос по поводу организации поиска на РНР. Мне достался сайт на корректировку. Есть список авторов, есть их статьи, у одного одна, у другого несколько. Весь настоящий вариант исполнен в виде: поисковая форма, в которой необходимо вводить точные фамилии, а по ним открывается заведомо готовый файл, представляете, какой бардак? Подскажите, как реализовать лучше всего? В базу не впихнуть, так как статьи некоторые очень громоздкие. Может, лучше через обычные текст-файлы, но как осуществить поиск?

Ответ

Значит, делаешь статьи в виде обыкновенных HTML-файлов и добавляешь такие META-теги:

<META author="фамилия">

а поиск делаешь так: читаешь файл, проверяешь его МЕТА-тег, если фамилия совпадает, то выводишь ссылку на статью. Наверное, лучше будет добавить еще и

<META title="название"><META description="описание">

так как тебе, скорее всего, придется выводить список статей искомого автора и с этими тегами будет легче искать. Этот алгоритм я прочитал на
http://www.softm.vov.ru
Только там они проверяют мета-теги через регулярные выражения, а вообще-то есть специальная команда get_meta_tegs(filename), которая возвращает ассоциативный массив мета-тегов.

Вообще, достаточно хороший вариант создания поиска по сайту был предложен Дмитрием Смирновым:
http://spectator.ru/issues/278
http://spectator.ru/issues/279

Альтернативным решением данной проблемы, может явится использование одного из бесплатных сервисов удаленной индексации:
http://decibel.dtn.ru/?r=practice&f=1

Вопрос

Вопрос такой: каким образом можно избавиться от повторной посылки данных скрипту? Пример: пользователь заполнил форму, щелкнул на кнопке, скрипт отработал… но если пользователь щелкнет "Refresh", то скрипт отработает повторно… Чего я уже не делал — и редирект, и через куки отслеживал… но может есть вариант через переменные окружения CGI? Ну там типа HTTP_VARIABLES_POST или еще как-то?

Ответ

Используй GET вместо POST…

******

Как вариант, после обработки добавить:
header("Location: thanks.php");
И уже на thanks.php писать, мол, "спасибо, что заполнили нашу формочку…" :)

info

Вопрос

Почему когда программа считывает информацию с файла с помощью fgets в переменную записывается только 256 символов, как можно расширить ее объем?

Ответ

Функция fgets в качестве второго параметра принимает максимальный размер в байтах считываемой строки, то есть достаточно указать $str = fgets($file, 4096); и fgets сможет считать из файла 4096 байт.

Вопрос

Как можно с помощью reg файла удалить информацию из реестра полностью ветку или просто параметр в ветке? Или другим способом, например через сценарий на сервере.

Ответ

Для того, чтобы полностью удалить раздел (ключ) реестра с помощью reg-файла, надо перед именем раздела поставить "-" ( без кавычек).
Например:

REGEDIT4
[-HKEY_CURRENT_USER\ Software\ Microsoft\ Windows\ CurrentVersion\ Policies\ System]

Чтобы удалить только параметр из реестра, нужно после знака "равно" поставить знак "минус".
Например:

REGEDIT4
[HKEY_CURRENT_USER\ Software\ Microsoft\ Windows\ CurrentVersion\ Policies\ System]
"NoDispBackgroundPage"=-


Из конференции Expert_FAQ

Вопрос

Есть строчка такого вида: 2003-11-03 22:26:47
Как на php убрать время, а дату оставить?
То есть чтобы осталось: 2003-11-03.

Ответ

$date1=substr($date,$start,$length);
где $date — исходная строка
    $start — Сколько сиволов пропустить с начала строки
    $length — сколько сиволов оставить от строки

В твоем случае:

$date1 = substr($date,0,10);

Есть еще один вариант решения поставленной вами задачи:

<?php
$date="2003-11-03 22:26:47";
$date=explode(' ', $date);
echo $date[0];
?>


Serg, php-coder.

Вопрос

Как настроить PHP-интерпретатор, чтобы можно было «отправлять почту».

Ответ

В PHP.INI необходимо указать smtp сервер, через который будет отправляться почта и адрес с которого это все будет происходить:

SMTP = localhost ;for win32 only
sendmail_from = me@localhost.com ;for win32 only
;sendmail_path = ;for unix only, may
supply arguments as well (default is 'sendmail -t -i')



Дмитрий Макаров

Вопрос

Для определения IP посетителя я использую getenv(«REMOTE_ADDR»);

А если компьютеры «висят» на одном IP (например, в локальной сети с Proxy), то можно ли их как-то различить?

Ответ

Когда кто то лезет через проксю, то REMOTE_ADDR будет содержать айпишник прокси, а айпишник клиента будет в переменной HTTP_X_FORWARDED_FOR про проксю сможешь еще посмотреть в строке HTTP_VIA там его имя, порт… типа:

HTTP_VIA = 1.0 proxy.server.ru:1080 (squid/2.5.STABLE1-20021021)

Из конференции Expert_FAQ

Вопрос

В зависимости от типа браузера на страницу, с помощью include, надо вставить различные фрагменты HTML кода. Как определить, какой браузер у клиента?

Ответ

Можешь попробовать вот так:

function brow_type() {
$brow = getenv("HTTP_USER_AGENT");
if((ereg("Nav", $brow)) || (ereg("Gold", $brow)) || (ereg("X11", $brow)) ||
(ereg("Mozilla", $brow)) || (ereg("Netscape", $brow)) AND (!ereg("MSIE", $brow))) $browser =
"Netscape";
elseif(ereg("MSIE", $brow)) $browser = "MSIE";

else $browser = "Other";
return $browser;
}//End of function brow_type()


Вопрос

Как организовать аутентификацию пользователя с помощью механизма сессий?

Если пользователь делает попытку зайти на страницу, ему возвращается форма с полями ЛОГИН, ПАРОЛЬ, которые отправляются и проверяются скриптом. После опознания зарегистрированного пользователя скрипт выводит нужную ему информацию. Как сделать такой скрипт (желательно с примерами) или хотя бы где почитать?

Ответ

Делаешь хтмл файл с формой

форма акшн=скрипт.пхп
логин name=log
пароль name=pas
субмит
/форма
скрипт.пхп
в нем ты получаешь эти переменные и регистрируешь их в сессии

<?
SESSION_START();
SESSION_REGISTER("log","pas");

?>


и с этого файла какие сылки будут — везде будет передаваться сешшн ид там тоже делаешь сешшн старт и получаешь все те переменные, которые были в сешшн_регистер

смотри Session handling functions мануала пхп
session_start — Initialize session data
session_destroy — Destroys all data registered to a session
session_name — Get and/or set the current session name
session_module_name — Get and/or set the current session module
session_save_path — Get and/or set the current session save path
session_id — Get and/or set the current session id
session_register — Register one or more variables with the current session
session_unregister — Unregister a variable from the current session
session_unset — Free all session variables
session_is_registered — Find out if a variable is registered in a session
session_get_cookie_params — Get the session cookie parameters
session_set_cookie_params — Set the session cookie parameters
session_decode — Decodes session data from a string
session_encode — Encodes the current session data as a string
session_set_save_handler — Sets user-level session storage functions
session_cache_limiter — Get and/or set the current cache limiter
session_end — Write session data and end session
session_readonly — Begin session — reinitializes freezed variables, but no writeback on request end

Из конференции Expert_FAQ

Вопрос

Как организовывать закачку файла на сервер с помощью PHP?

Ответ

Часть 1. HTML форма

form enctype="multipart/form-data" action="upload.php" method="post">
<input type="hidden" name="MAX_FILE_SIZE" value="1000">
Send this file: <input name="userfile" type="file">
<input type="submit" value="Send File">
</form>


Часть 2. upload.php

<?
if (is_uploaded_file($userfile))
{
copy($userfile, "/place/to/put/uploaded/file");
}
else
{
echo "Possible file upload attack: filename '$userfile'.";
}
/* …or… */
move_uploaded_file($userfile, "/place/to/put/uploaded/file");
?>


Немного комментария.
upload.php вызывается уже после upload'а как такового. При этом автоматически определяются 4 переменные (вместо userfile будер стоять то, что вы напишете в форме HTML):
a.. $userfile — Имя временного файла, где содержится файл, который проаплодили. Этот файл физически размещен на сервере, где у вас PHP.
b.. $userfile_name — Настоящее имя аплоднутого файла. Передается броузером.
c.. $userfile_size — Размер аплоднутого файла. Передается броузером. Можно использовать для проверки — Размер файла $userfile д.б. равен этому значению. Если нет — был какой-то глюк, либо кто-то пытается вломиться на сервер хакерским способом.
d.. $userfile_type — MIME тип аплоднутого файла, например, "image/gif".

Передается броузером. Следует заметить, что если клиент аплодит, скажем, Word document, но на его компе нет самого Word'а, то здесь будет не application/msword, а что-то типа application/octet-steam — точно не помню — проверьте сами.

Обратите внимание, что PHP ограничивает максимальный размер файла для аплода — параметр upload_max_filesize файла php.ini. По умолчанию — 2 метра. Если проаплодите больше — будет нулевой размер. Лучше всего устанавливать в это значение параметр MAX_FILE_SIZE (в байтах!) в форме, тогда это будет контролировать броузер, и клиент не будет с недоумением спрашивать после аплода 20 мегабайт, почему проаплодилось 0 байт.

И еще — временный файл автоматически убивается по завершении upload.php. Так, что если аплоад требуется где-то сохранить, делайте это ручками в скрипте.

Павел

Вопрос

Как переводить вот такое "%C3%E0%E7%E5%F2%E0+%E1%E5%F1%EF%EB%E0%F2%ED%FB%F5+%EE%E1%FA%FF%E2%EB%E5%ED% E8%E9" в нормальный текст?

Ответ

<?
$t="%C3%E0%E7%E5%F2%E0";
echo urldecode($t) ;
?>

Вопрос

На форме есть набор checkbox-ов., формируется автоматически. Количество заранее неизвестно. Имя общее, например kod. Value разные, например 52, 63, 75 и т.д., определяются при создании формы. Надо выделить несколько!!! и передать, например методом POST для обработки. В результате получаю только одно значение, а надо бы все. Самая большая проблема в том, что заранее не известно, ни сколько checkbox-ов будет на форме, ни их значения. Возможен вариант что в форме будут меняться и/или имя checkbox-а.

Ответ

Используй в имени тега INPUT массивы, например следующим образом:

<input type="radio" name=form[kod52]>какой-то текст
<input type="radio" name=form[kod52]>какой-то текст
<input type="radio" name=form[kod63]>какой-то текст
<input type="radio" name=form[kod75]>какой-то текст
<input type="radio" name=form[kod88]>какой-то текст


Атрибут name можешь генерировать скриптом,
Далее для разбора введенной информации можешь использовать следующую конструкцию:

<?php
while(list($key,$value)=each($form)){
if ($key = "kod63") {
выполнить что-то;
}
и т.д.
}
//скипт не тестировал, но после обработки напильником должно работать!
?>


******

Правильное решение:
<INPUT TYPE="CHECKBOX" NAME="name[]" VALUE="1">
<INPUT TYPE="CHECKBOX" NAME="name[]" VALUE="5">
<INPUT TYPE="CHECKBOX" NAME="name[]" VALUE="20">…
Иначе говоря, к имени переменной надо добавить пустые квадратные скобки. При этом все значения складываются в массив, по которому можно уже по человечески пробегать.

nospam

Вся примочка с чекбоксами в том, что если он «чекнутый», то передается в POST или GET как любой input, но если он НЕ «ЧЕКНУТЫЙ», то НЕ ПЕРЕДАЕТСЯ ни имя ни значение.
Скажем я сабмитаю форму, на которой <input type=text name=ttt..
и
<input type=checkbox name=ccc..
Если оба заполнены, то в POST уйдет, скажем,
ttt="qwewqewqe" и ccc="YesForSomething",
а если оба пустые — то только
ttt=""
Эта особенность описана в хелпе по хтмл

Parfilko2

Вопрос

Как передать параметры формы скрипту по EMail и как он их обрабатывает.

Ответ

Нет такого скрипта, который получает параметры формы по мылу, есть только наоборот.

Юзер заполняет форму и сабмитит, данные идут на сервер, а скрипт формирует и отсылает на определенный адрес(обычно админа)письмо с данными этой формы.

Так делают 99% скриптов,в названии/описании которых есть слова «form» и «mail».

Если нужно что-то большее — пиши на личку, есть наработки… ruhsat@dinet.ru

Из конференции Expert_FAQ

Вопрос

Как в php подключить библиотеки для работы с изображениями и флеш?

Ответ

В файле php.ini (c:\windows\) ищи строчки:
extension_dir = ./
ее нужно заменить на тот путь, где у тебя находятся расширения, у меня в папке c:\usr\local\php4\extensions\ значит пишешь:
extension_dir = c:\usr\local\php4\extensions\
далее, если ты хочешь GD и SWF библиотеку, то у тебя в этой папке должны быть файлы: php_gd.dll и php_swf.dll если нет последнего, то ищи его здесь http://reality.sgi.com/grafica/flash/
Опять же в файле php.ini ищешь строчки:
; Dynamic Extensions ;
и т.д. далее перечислены модули, которые нужно загружать… убирай комментарии перед ними и все.

Вопрос

В одной из книг, которую я читаю, написан перечень «функций уровня абстракции баз данных (dbm-style)». При попытки их использовать в своих файлах ( локально на компьютер при запущенном апаче ) выводится сообщение: "Fatal error: Call to undefined function: dbase_create() in d://data-base.php on line 5". ( вызов неизвестной функции ? ). Значит ли это, что для их использования надо установить еще какую-нибудь программу ?

Ответ

Попробуйте:

В системном каталоге Windows (c:\windows, C:\winnt) есть файл php.ini. Раскомментарьте строчку extension=php_dba.dll и проверьте путь к extensions в этом же файле: extension_dir = j:\php\extensions\ Путь мой, впишите свой. Вы написали, что вызываете dbase_create(). Эта функция не из "функций уровня абстракции баз данных (dbm-style)", а из раздела "dBase Functions", а для них нужен extension=php_dbase.dll.

Вопрос

Подскажите пожалуйста каким образом мне произвести анонимный HTTP запрос через прокси к www серверу?

Ответ

Анонимность зависит от прокси. А в общем виде (для неCGI прокси): коннектимся к прокси на нужный порт (fsockopen) и шлем запрос (в простейшем виде):

GET http://server.ru/page.htm HTTP/1.0\n\n

Либо:

GET /page.htm HTTP/1.0
Host: server.ru:80\n\n

Первый вариант обычно срабатывает. Все остальные заголовки по вкусу.

praw2003

Вопрос

Как работать с сессиями (php 4.3.1 ), пришлите плиз примеры с подробным описанием, точнее интересует как вообще передавать переменные с одной страницы на другую (username, password и другое не через формы со скрытыми полями!!! т.е. не через методы POST и GET!!!), это типа как в форуме.

Ответ

Например так

file1.php <?php session_start();
$_SESSION['varname']=$varname;
<какой-то код> ?> file2.php <?php session_start();
$newvar=$_SESSION['varname'];
<какой-то код>
?>


Из конференции Expert_FAQ

Вопрос

Как распознать IP-адрес клиента?

Ответ

Просто и элементарно:

$ip = getenv("REMOTE_ADDR");
или

$ip = $_SERVER['REMOTE_ADDR']

Правда не совсем понятно зачем тебе нужны только ip человека? Тебе не помешало бы посмотреть документацию на тему session.

Вопрос

Нужен скрипт, который аутентифицирует пользователя, и отправляет его на соответствующую страничку.

Ответ

<?php
if(!isset($PHP_AUTH_USER)) {
Header("WWW-Authenticate: Basic realm=\"My Realm\"");
Header("HTTP/1.0 401 Unauthorized");
echo "Text to send if user hits Cancel button\n";
exit;
} else {
echo "Hello $PHP_AUTH_USER.

";
echo "You entered $PHP_AUTH_PW as your password.

";
}

Вопрос

Подскажите, пожалуйста, как сделать проверку адреса e-mail на корректность (у меня на JavaScript не получается, а как это сделать на PHP, я не знаю)

Ответ

Можно отслеживать при помощи такого регулярного выражения:

function is_email ($email)
{
if (preg_match('/^[a-z0-9_=%\.-]+\@[a-z0-9_\.-]+\.[a-z]{2,4}$/i', $email))
{
return true;
}
return false;
}


Чтобы быть уверенным, что такой адрес существует: в PHP есть функция getmxrr(), которая проверяет хост на предмет возможности отправки на него почты. For example:

// Проверить почтовый адрес
$email = explode('@',$email);
$emailhost=$email[1];
if (!getmxrr($emailhost, $mxhostarr))
{
echo "Такого адреса не существует";
exit;
}


Этот пример взят из книги «Разработка Web-приложений на PHP и MySQL», авт. Лаура Томсон, Люк Веллинг; изд-во DiaSoft, 2001

Pocherk

Вопрос

Как сделать редирект на PHP или JavaScript, если посетитель, имеющий русский язык, должен попасть на indexru.html, а если любой другой, то на index.html.

Ответ

Анализируй значение HTTP_ACCEPT_LANGUAGE. Если есть подстрока "ru" — значит инклудишь один файл, если нет — другой. Для реализации нада писать движок на PHP. Кстати, если будешь делать, тебе придется весь сайт обрабатывать таким образом, а не только стартовую страничку.

На самом деле инклудить или писать Header("Location:http://notrus.html") не имеет принципиального значения. Это на любителя. Кстати, вариант с инклудом работает быстрее, чем редирект.

Из конференции Inet_prog

Вопрос

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

Ответ

Это можно делать так:
Файл Index.html:

<?php include "File_Name.php";
// Подключаем файл какой надо, и его имя не отображается в строке
?>
<html>
… — хтмл код, если надо
</html>


Из конференции Expert_FAQ

Вопрос

У меня возникли проблемы во время создания одного проекта. Для него я использую динамическм создаваемые страницы с помощью языка PHP (4.x.x). Так вот, есть некий файл (index.php) — в нем находятся основные ф-ции и html шаблон. Выглядит это примерно так:

//index.php
<?
здесь скрипты
?>
<html>
<head><title></title></head>
<body>
<? include('up.inc') ?>
<? include('ЭтоИмяБеретсяИзQueryString.inc') ?>
<? include('footer.inc') ?>
</body>
</html>
//конец index.php

Суть в том, что с файлом 'ЭтоИмяБеретсяИзQueryString.inc' подключаются также и некоторые функции. Все *.inc файлы лежат у меня в папке '_inc' и если обратиться к сайту запросом типа 'sait.ru/_inc/incfile.inc' то в браузере отобразиться его исходник на php.

Как сделать так, чтобы доступ к этим файлам имел только скрипт и эти файлы не пришлось бы переименовывать. conf файл апачки не доступен — т.к. бесплатный хостинг (hoha.ru). .htacces доступен.

Ответ

Все можно сделать с помощью .htaccess. Создаешь файл с таким названием и пишешь в нем:

<Files *.inc>
order allow,deny
deny from all
</Files>

Из конференции Expert_FAQ

Ответ подходит только для сервера Apache, только с опцией AllowOverride и только, если специальный файл в настройках называется ".htaccess"

bolk

Вопрос

Есть небольшая домашняя страница, на которой собственно страницы собираются при помощи технологии SSI, расширение страниц, естественно, *.SHTML.

Но вот в одну из них необходимо вставить страницу, в которой есть РНР-код. Так вот каким образом сделать такую "двойную" вставку? Меня смущает, что страницы, имеющие расширение *.SHTML, не парсятся на присутствие РНР-кода. Или я не прав?

Ответ

Нужно прописать в httpd.conf что-то вроде этого
AddType application/x-httpd-php .shtml

Из конференции Expert_FAQ

Вопрос

Как сделать, чтобы при отправке формы строка запроса скрывалась? Нужно скрыть пароль. Чтобы вместо http://host.ru/script.php?user=me&password=pass в строке браузера было просто http://host.ru/script.php

Коллега сделал, у меня код практически тот же! в чем дело?

Ответ

<form … method=post>

Андрей Переводчик

Вопрос

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

Ответ

Вот, написал небольшую функцию для преобразования размера в байтах в удобочитаемую строку. Выводит строки вида «9 килобайт», «1.2 мегабайта», «53 байта» и т.п., т.е. с учетом окончаний.

// string nice_size (integer size_in_bytes)
function nice_size ($size) {
if ($size < 900){
if (ereg("(^|[2-9])[2-4]$",$size)) return $size." байта";
return $size." байт";
}
$size = ceil($size/1024);
if ($size < 900) {
if (ereg("(^|[2-9])[2-4]$",$size)) return $size." килобайта";
return $size." килобайт";
}
$size = ceil($size/102.4)/10;
if (ereg("(^|[\.2-9])[2-4]$",$size)) return $size." мегабайта";
return $size." мегабайт";
}


Андрей Переводчик

Вопрос

У меня такой вопрос: При запуске сценариев на PHP в броузере в верхней части страницы (перед тегом <HTML>) вставляется строка X-Powered-By: PHP/4.0.0 Content-type: text/html. Как от нее избавиться? А если при этом PHP — модуль Apache?

Ответ

Необходимо запускать PHP.exe c ключом -q т.е.

php.exe -q scriptname

А если при этом PHP — модуль Apache… Ну, ладно. Если есть желание таким образом искалечить свой Апач — тогда ищем в системной директории файл php.ini (или в другой — если вы используете альтернативный .ini файл)

* Ищем в нем строчку default_mimetype = "text/html"
* Комментируем ее символом ; и заменяем ее на default_mimetype = none
* Ищем строку expose_php = On и заменяем на expose_php = Off

В таком варианте он продолжает писать "content-type:"
Есть еще в апачевом конфе такое, как

TypesConfig conf/mime.types
DefaultType text/plain

Похоже на искомое, но ручаться не буду.
Но зачем вам такое горе? Поставьте ПХП отдельно и юзайте как скриптовый движок черех .ехе

Nomad Rain

Вопрос

Как удалить из массива повторяющиеся записи(элементы массива)? Например, у меня в массиве числа : 1,5,12,5,4,10.а надо получить: 1,5,12,4,10.т.е. выбросить вторую 5.

Ответ

Попробуй так:

<?php $a=array(1,2,2,5,12,7,12,55,45,45);
$b=array();
for($i=0;$i {
if(!in_array($a[$i],$b)) $b[]=$a[$i];
}
$a=$b; unset ($b);
print_r($a); ?>


Проверено, работает.

Из конференции Expert_FAQ

Есть в ПХП такая функция array_unique(). Возвращает массив, составленный из всех уникальных значений. Пример:

$Arr1=array('a'=>'green','red','b'=>'green','blue','red');
$Arr2=array_unique($Arr1);
//Теперь $Arr2===array('a'=>'green','red','blue');


Или здесь смотри:
www.php.net

akoptev

Вопрос

Имеется текстовый файл. Как узнать кол-во строк в нем?

Ответ

1. Можно циклом — gets()
2. $f=file("1.txt");
$count=count(f);

Plazmer

Вопрос

Какие применяются методы против тупого скачивания (читай кражи)содержимого сайта всевозможными teleportami?

Ответ

Ну например если говорить о скачивании файлов типа зип, мп3 и тдт — можно делать не прямую ссылку на файл, а на скрипт, которому как аргумент передается имя файла, тот анализирует — если на него пришли со странички даунлоада — отдать, если нет — не пущать :)

Так же на любой странице можно сделать — тока надо будет все писать на пхп или перле — например — если на эту страницу пришли с той (с которой можно, на которой ссылка на эту) — то отдать, если нет — … :)

Из конференции Expert_FAQ

Вопрос

У меня установлено PHP 4.0.4 и Interbase 5.5, каким образом организовать их взаимодействие?

Ответ

Выкачайте с
www.php.net PHP 4.0.5 и соответствующую доку. Interbase там поддерживается, правда не знаю какой версии.

Note: Full support for InterBase 6 was added in PHP 4.0

У меня правда Interbase 6, но по-моему разница невелика. Единственной проблемой было то, что мне пришлось перекомпилировать PHP, так как бинарный дистрибутив PHP, который шел у меня в SuSE Linux 7.0 не поддерживал Interbase по умолчанию. После перекомпиляции с добавлением соответствующих ключей все заработало.
Список функций PHP по работе с Interbase находится здесь:
http://www.php.net/manual/en/ref.ibase.php

Вопрос

Какое программное обеспечение необходимо, чтобы программировать на PHP? Если нужно что-то особенное, подскажите где его можно скачать?

Ответ

Из софта нужен Web сервер, например Apache http://httpd.apache.org и сам PHP http://www.php.net/ . Они совершенно бесплатно выкачиваются с указанных сайтов. И конечно, текстовый редактор, чтобы писать странички на HTML и php.
Кроме того можно использовать готовый, уже предварительно сконфигурированный сервер для его простой установки под Windows, например MyServer (с русскоязычной поддержкой), в состав которого включены Apache, PHP, MySQL, phpMyadmin и некоторые скрипты. Адрес: www.webheim.com

Gv

Вопрос

Например, в textarea человек вводит длинное сообщение, не разделяя его при этом Enter'ом и это очень сильно портит дизайн? Может у кого-нибудь есть код разбиения таких длинных записей? Стоит PHP 4.0. а функция wordwrap работает только с 4.0.2

Ответ

А зачем разделять сообщение? — просто надо ограничить рамки его вывода следующим образом: <table width=70% cellspacing=0 cellpadding=0><tr><td>сообщение</td></tr></table> 70% я выбрал просто так — можно поставить любое число…(html надо знать;)

а если HTML здесь не поможет, то можно так:
$message=ereg_replace("([^ \n\t]{35})[^\n\t]*","\\1",$message);
35 — количество обрезаемых символов

Вопрос

Можно ли в пхп нормально вычитать даты? Или только грабить из строки числа и самому дальше их вычитать?

Ответ

Прочитайте, пожалуйста, про функции date, localtime, mktime.

Пример:

<?php
lt = localtime(time(), 0);
$start_time = mktime(0, 0, 0, $lt;[4] + 1, $lt;[3]-1, 1900+$lt;['5']);
?>


этот пример присваивает переменной $start_time время 00 часов 00 минут 00 секунд вчерашнего дня.
А вообще, время хранится в формату unix_timestamp, то есть в секундах прошедших с начала 1970 года, то есть, если у ваc известен какой-то момент времени, то получить время ровно на 24 часа более ранне можно вычитанием 60 * 60 * 24 = 86400.

Вопрос

Можно ли на PHP уменьшить картинку до определенных размеров?

Ответ

$im1 = ImageCreateFromJPEG ("c:\pic.jpg"); #открыть картинку
$sx=ImageSX($im1); #определить
$sy=ImageSY($im1); #ее размеры
if ($sx > $sy){ #для горизонтальных
    $im2 = imagecreatetruecolor(500, 375); #создать новую картинку с новыми размерами
    $a=imagecopyresized($im2, $im1, 0, 0, 0, 0, 500, 375 , $sx, $sy); #вставить в новую — большую с уменьшением
    $pic2=imagejpeg($im2,"$dst"); #создать файл с новой картинкой
    echo "<img src=$dst border=0><br><border=0><br><br>"; #показать его
    }
else { # для вертикальных
    $im2 = imagecreatetruecolor(375, 500);
    $a=imagecopyresized($im2, $im1, 0, 0, 0, 0,375,500 , $sx, $sy); #вставить в новую — большую с уменьшением
    $pic2=imagejpeg($im2,"$dst");
    echo "<img src=$dst border=0><br><br>";
        }


Требует GD2.

Sergey

Вопрос

Я пишу скрипт, обрабатывающий данные такого формата, например: «2 489.00» или — «48 985 362.00» .
Т.е. в качестве разделителя между тысячами, миллионами и т.п. выступает пробел. Как его убрать? Вопрос обусловлен тем, что эти цифры надо потом просуммировать, а способы преобразования в int или float дают только то, что идет перед пробелом (в примерах это — «2» и «48», вместо желаемого.

И еще вопрос, который вам, наверное, уже надоел: я «гоняю» скрипты на рабочей станции. У нас стоит обычная сетка Windows. Возможен ли просмотр PHP страниц на других станциях рабочей группы?

Ответ

Дело в том, что PHP рассматривает переменные по контексту и автоматом приводит к соответствующему типу. Т.е. вы можете спокойно применять строковые функции к числам — они будут рассматриваться как строковое представление числа.

В Вашем случае:

$a="43 251 300.25";
$b="251 300";
$a=str_replace(" ","",$a);//Просто удаляем пробелы
$b=str_replace(" ","",$b);// Если они потом понадобятся, number_format() Вам поможет
$c=$a+$b;
echo "Сумма а и б = $c\r\n<br>";

Из конференции Expert_FAQ

Вопрос

Имеется ли возможность подключать к основному коду на странице код в отдельном файле, содержащем мои процедуры? Наподобие использования css или javascript.

Ответ

include('/path/to/file.php');

Вопрос

Необходимо полностью удалить теги html средствами PHP.

Ответ

$fp=fopen($dir.$fname,"r");
$html=fread($fp,filesize($dir.$fname));
fclose($fp);
$text=preg_replace("'(<P\s[\w\W]*?>[\w\W]*?</P>)'i","",$html);
//тута все подчистили. P можно заменить на любой тэг по вкусу :)
$fp=fopen("_".$fname.'.html',"w");
fwrite($fp,$text);
fclose($fp);


Лучше всего будет несколько таких замен поставить друг за другом, если тебе несколько тэгов чистить.

Plazmer

Вопрос

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

Ответ

Прежде всего, на том, где установлен Cron (или анологичное) и тебя допустят к нему. Справка: Cron — это программка, которая два раза в день будет запускать твой скрипт. Планировщик задач, то есть.
Скрипт может быть таким:

$f=fopen("http://…","r");
$out=fopen("my_file","a");
fputs("\n\n\n",$out);
while(!feof($f))
fputc(fgetc($f),$out);


Random

Вопрос

Нужен скрипт PhP для определения броузера и в зависимости от его версии и типа (IE, Netscape, Opera) вставлять в Index.php два разных файла (file1.php и file2.php)?

Ответ

Вот здесь: http://virtual.bresttelecom.by/php/index.phtml?php/rass/9.htm уже есть ответ. Правда, я не особо напрягался по поводу объяснений, но там и так все должно быть понятно. Тебе останется только «прикрутить» свои странички в зависимости от определенного браузера.

Вопрос

Объясните, как правильно прикрутить PHP к IIS 4.
Я файлы pws-php4cgi.reg и pws-php4isapi.reg с прописанными в них реальными путями зарегестрировал. Надо еще где-то в политике безопасности что-то разрешить…

Ответ

В php.ini:
cgi.force_redirect = 0

A.Z.

Вопрос

Объясните начинающему, откуда в нижеследующем коде лезут ошибки типа:

Notice: Undefined index: 'location' in E:\HTTP\Apache2\htdocs\my\redirect.php on line 2
Warning: Cannot modify header information — headers already sent in E:\HTTP\Apache2\htdocs\my\redirect.php on line 2
redirect.html
<html><head><title>Перенаправление</title></head><body>
<form action="redirect.php" method="POST">

Перенаправить меня к:

<select name="location">
<option value="http://www.prima-tech.com/">Prima-Tech</option>
<option value="http://www.thickbook.com/">thickbook.com</option>
<option value="http://www.php.net/">PHP.net</option>
<option value="http://www.zend.com/">Zend Technologies</option>
</select><input name="submit" type="Submit" value="Перейти">
</form></body></html>
redirect.php
<?php if ($_POST['location']==""){header ("Location: redirect.html");exit;}
else {header ("Location: $_POST['location']");exit;} ?>

Ответ

Зачем было привлекать $_POST?
Нужное тебе значение доступно как $location, будь проще.

К тому же перенаправление твое просто не работает. Обычно это делается на уровне хидера _страницы_ хтмл, а не заголовка HTTP-ответа.

Из конференции Expert_FAQ

Вопрос

Необходимо поставить авторизацию на определенную страницу. Прочитал, что необходимо послать заголовок типа:

<?
if(!isset($PHP_AUTH_USER)){
Header( "WWW-Authenticate: Basic realm="имя зоны");
Header( "HTTP/1.0 401 Unauthorized");
echo "<H1>Authorization Required</H1>\n";
exit;}
else{
Header( "WWW-Authenticate: Basic realm="имя зоны");
Header( "HTTP/1.0 401 Auth Required");
echo "<H1>Authorization Required</H1>\n";
exit;} ?>
<html>
</html>


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

Ответ

Realm — есть область аутентификации для директории, этот параметр виден пользователю в окне запроса браузера. С помощью него юзер и определяет, куда это он попал и какие ему следует ввести реквизиты.

Пароли для этого могут храниться в зависимости от типа аутентификации в разных местах (TXT, BDB, MDB,md5).

<Directory /home/*/public_html/private>
AuthType Basic
AuthName MyPrivateFile
AuthUserFile /usr/local/apache/etc/.htpasswd-allusers
Satisfy All
Require file-owner
</Directory>


Здесь, где лежит файл, указывает директива AuthUserFile. Создаются юзер\пароль с помощью специальных утилит (htaccess, dbmanage) т.к. хранятся в зашифрованном виде.
http://httpd.apache.org/docs/mod/

кОстя С. иванОв

Вопрос

Подскажите, как пользоваться сессиями в PHP, где можно найти информацию по ним и т.п.

Ответ

Загляни на http://code.com.ua
Там в первом выпуске журнала как раз была статься про это.

http://myphp.net.ru
http://phpclub.net

trash_v2, Andrew Perevodchik.

Вопрос

Есть апач 1.3.28 и PHP 4.3.3.
Распаковал архив с PHP, покидал нужные dll'ы в winnt\system32 , подправил php.ini (хотя может не то подправлял.. подскажите что именно обязательно там прописывать) и в httpd.conf добавил следующее:

AddType application/x-httpd-php php
Action application/x-httpd-php "F:\web\php4\php.exe"

Создал в папке "f:\web\home\localhost\www\" файл test.php со следующим содержимым:

<?php
echo "It works!<br>\n";
phpinfo();
?>

При попытке набора в адресной строке браузера
http://localhost/twst.php вываливается "Невозможно найти страницу…"

В чем причина этого может быть?

Ответ

Можешь попробовать настроить PHP не как Perl через exe файл, а как модуль сервера.
Это взято из конфига сервера Apache с
http://php.spb.ru.

# ======= PHP в качестве модуля =======
#
# Примечание:
# 1. файл php4apache.dll должен быть в
c:/server/apache/modules/php4apache.dll
# 2. файл php4ts.dll — в c:/server/apache/php4ts.dll
#
AddType application/x-httpd-php phtml php php3 php4
AddType application/x-httpd-php-source .phps
LoadModule php4_module modules/php4apache.dll
#
# =====================================

ВиС

Вопрос

Я скачал свежую версию php и после инсталляции при попытке запустить файл php.exe получил ошибку «Cannot find oleaut32.dll», хотя она лежит у меня в c:\windows\system\ и ее копирование в каталог с php ни к какому результату не приводит, ошибка по-прежнему выскакивает. Попробовал настроить апач — получаю
«php4ts.dll is linked to missing or corrupted oleaut32.dll»
Что делать?

Ответ

Переименуй файл php.ini-dist, который находится в директории c:\php, в php.ini. Затем скопируй вышеупомянутый файл в директорию Windows (например, с:\windows или с:\winnt).Скопируй файлы динамических библиотек MSVCRT.DLL (этот файл уже может быть установлен) и PHP4TS.DLL в системную директорию (с:\windows\system для Windows95/98, c:\winnt\system32 для Windows2000/NT)
Далее в настройках апача:

ScriptAlias /php/ "C:/php/"
<Directory "C:/php">
AllowOverride None
Options None
</Directory>
Action application/x-httpd-php "/php/php.exe"
AddType application/x-httpd-php .phtml
AddType application/x-httpd-php .php3
AddType application/x-httpd-php .php
Action application/x-httpd-php-source "/php/php.exe"
AddType application/x-httpd-php-source .phps

DirectoryIndex index.html index.phtml index.php3 default.php default.php3 default.phtml

Теперь можешь порадоваться и пускать все подряд на PHP

Dexter Holland

А еще советую распаковать ручками из дистрибутива каталог sapi и скопировать его в директорию c:\php\sapi

Vital

Вопрос

Прошу помощи! Сделал один к одному по инструкции выставленной на сайте, по установке Apache версии 1.3.6, но команда http://localhost/index.html вызывает только, что «веб страница не доступна в в автономном режиме» и на этом молчок , страница не вызывается.

Ответ

Думаю, что нужно покопаться в настройках браузера. Как проверить? — Делаешь 'telnet localhost 80' или 'telnet 127.0.0.1 80' (это под Win-2000) или же 'telnet localhost:80' или 'telnet 127.0.0.1:80' (под Win-9x). Если коннект есть — набери какую нибудь лажу типа 'GET/HTTP/1.0', ENTER x2 раза. Должно выкатиться что-то типа 'отвали, такой страницы нет и не было никогда'. Значит все нормально, устанавливай в своем IE свойства подключения так, чтобы оно (энто Чудо) не использовало ни удаленный доступ, ни сетевое подключение к локальным адресам. Не мешает проверить и наличие файла hosts в каталоге /system32/drivers/etc/ (Win-2000) или /windows/ (не Win-2000). А в файле том должно быть прописано '127.0.0.1 localhost' как минимум. И все получится. А если уж telnet не цепляется за твоего Апачу, то посмотри, все ли нормально в httpd.conf — там можно заставить его откликаться на конкретный адрес и порт в секции Listen… С Коммуникатором таких проблем у меня не было, так что извини.

Вопрос

У меня PHP 4.0.3pl1, бинарники под win32 (брал на php.net), WinNT и apache. Подключил библиотеку php_gd.dll (для работы с GIF); при вызове любой функции этой библиотеки выдается сообщение "<functionName>: No GIF support in this PHP build", где <functionName> — имя вызываемой функции. Неужели PHP под win32 не умеет работать с GIF? Тогда зачем же включать в бинарники эту библиотеку?

Ответ

Так как они вырезали поддержку GIF из последних версии, зато там есть PNG, JPEG, SWF, WBMP…

Вопрос

Установил себя Apache и дистрибутив PHP. Проблема: не запускаются файлы с расширением phtml (php3 — работают) и не работают вставки в HTML. При запуске HTML странички в теле ничего не происходит.

Ответ

Необходимо в конфигурационных файлах внести некоторые изменения :), а именно:

1. а) либо в httpd.conf, по умолчанию там есть следующие строки:
#AddType application/x-httpd-php3 .phtml
#AddType application/x-httpd-php3-source .phps
Раскомментируй их и дополни так:
AddType application/x-httpd-php3 .phtml .php3 .php
AddType application/x-httpd-php3-source .phps

Если используешь PHP4, то подправь …x-httpd-php3 на …x-httpd-php4.
Если используешь и PHP3 и PHP4 одновременно (и такие «гурманы» есть), то скопируй эти строки и отредактируй соответственно.

б) либо в mime.types — отредактируй строки:
application/x-httpd-php phtml php3 php
application/x-httpd-php-source phps

2. Под Windows нужно еще и проверить наличие в httpd.conf следующей директивы:

<Directory "f:/usr/local/php">
Options ExecCGI
</Directory>
ScriptAlias "/__php_dir__/" "f:/usr/local/php/"
Action application/x-httpd-php "/__php_dir__/php.exe"

Здесь "f:/." — путь к каталогу твоего PHP. И повнимательнее со слешами в конце. Можно, конечно, и поэкспериментировать, но в Руководствах по Apache и PHP это оговорено _однозначно_.

Вопрос

Почему не получается открыть удаленную страницу для чтения?

Пробовал делать так:
$f_address = fopen("http://www.yahoo.com/","r");
или
$f_address = fopen("http://www.mysite.com/index.html","r");
Результат один и тот же для различных адресов.

Ответ

Разве? У меня вроде все заработало.
$f_address = fopen("http://www.ya.ru/","r");
$f = fread($f_address, 1024);
echo $f;

Из конференции Expert_FAQ

Вопрос

Написал скрипт для вывода случайного текста:
<?php
$l[1]="text 1";
$l[2]="text2";

$l[30]="text30";
$n=rand(1,30);
echo $l[$n];
?>
на моем домашнем компьютере все получается нормально (у меня стоит Small HTTP server и php4), выгружаю скрипт на сервер и в результате выводится один и тот же текст.

Ответ

Согласно руководства по PHP: Remember to seed the random number generator before use with srand().
Что, собственно, означает: не забудьте активизировать генератор случайных чисел. например:

// seed with microseconds since last "whole" second
srand ((double) microtime() * 1000000);
$randval = rand();

Вопрос

WIN98+APACHE.1.3.6.+PERL+MYSQL+PHP4
Не работает функция crypt()
Warning: crypt() is not supported in this PHP build in d:\usr\local\www\shop\admin\index.php on line 36
Как установить эту функцию?

Ответ

В таком наборе софта crypt() действует только в версиях PHP до 4.0b3 включительно. Выше — только под *NIX-ами. (Это — мой небогатый опыт).

Вопрос

При вставке в скрипт dll("php_mcrypt.dll"); окно браузера выдает сообщение: Warning: Unable to load dynamic library 'd:\usr\local\php4\extensions\php_mcrypt.dll' — Присоединенное к системе устройство не работает. in d:\usr\local\www\shop\admin\index.php on line 5 extension=php_mcrypt.dll — тоже не помогает

Ответ

Дело в том, что функционирование модуля php_mcrypt.dll базируется на основе использования библиотеки libmcrypt. Библиотека написана для использования в системах *x (UNIX, Linux и тп.), поэтому, если Вы хотите использовать этот пакет, то есть два пути:
— перенести пакет на платформу Win32 своими силами, т.е. скомпилировать пакет на Win (автор библиотеки, похоже, делать этого не планирует).
Работать в Linux.

******

А еще есть сайт munitions.vipul.net там и для форточек есть библиотеки.

Вопрос

Пытаюсь создать счетчик посещений. Значение счетчика предполагается считывать из файла, прибавлять 1 и записывать обратно в файл. Однако, при открытии файла на запись появляется сообщение:

Warning: fopen("count.txt", "a+") — Permission denied in [адрес].

В чем может быть дело?

Ответ

Насчет именно PHP не уверен, так как предпочитаю Perl (он быстрее и удобнее), а там такая ошибка означала бы нарушение прав доступа. Проверьте, какие права стоят у файла, который открывается на запись (должны быть 666). Но учитывая fopen — посмотрите внимательно, закрыт ли файл перед открытием его на запись. Кстати, кроме непосредственно значения счетчика советую так же записывать IP и текущее время (в Perl это $ENV{REMOTE_ADDR} и time), для того, чтобы при перегрузке страницы счетчик не прибавлял значение еще на единицу. Учитывая схожий синтаксис Perl и программных ставок PHP, позволю себе привести пример:

$oldIP, $oldTime, Count — берем из файла

if($oldIP != $ENV{REMOTE_ADDR}) {Count++} elsif (time — $oldTime < 600)

{Count++}

Если IP последнего посетителя и нынешнего не совпадают, увеличиваем значение, а если совпадают, то увеличиваем, если только прошло более 600 секунд.

Из конференции Expert_FAQ

Вопрос

Хочу сделать такую ссылку:
http://www.microflora.ru/open.php?d=microflora&f=gkb1
такой:
http://www.microflora.ru/microflora/gkb1/
для этого пишу в .htaccess

RewriteEngine On RewriteRule ^/([a-z])/([a-z0-9_]+) open.php?d=$1&f=$2

Но почему то вылезает 404 ошибка. В чем могут быть проблемы? Может, модуль не загружен?

Ответ

Если б модуля не было, вылезла бы 500-я, вероятно (хотя на всякий случай посмотри в phpinfo() ).
Насколько я помню, этот модуль сильно придирается к синтаксису команд. У меня вот такая строка работала:

RewriteRule ^([a-z0-9]+)/([a-z0-9]+)/? /open.php?d=$1&f=$2

А вообще, если выполнять подмену ^([a-z0-9]+)/([a-z0-9]+)/?, ты лишаешься возможности работы с подкаталогами первого уровня как минимум. Так что какие-то рамки срабатывания правил установить нужно.

Андрей Переводчик

Вопрос

Помогите найти русский справочник по PHP.

Ответ

Подпишись на рассылку:
win.subscribe.ru там скоро будет.

Из конференции Expert_FAQ

Вопрос

С каким расширением, на ваш взгляд, предпочтительнее создавать файлы в которых есть код PHP: как .php .php3 .phtml?

Ответ

Если говорить о предпочтении и web-server настраивается Вами, вы можете ассоциировать любое расширение для обработки интерпретатором PHP. Хоть .asp или .exe, или даже .my_name. Такой подход также применяется для «сбивания с толку» в целях «безопасности», что как полезно так и не очень. Другое дело, что скрипты труднее переносить и нарушается этика программиста.

Различные провайдеры конфигурируют сервера так, что например скрипты .phtml работают с одними правами на сервере, a .php с другими или же эти файлы интерпретируются разными или по разному настроенными интерпретаторами.
Лучше будет если: phtml (html страницы c небольшими php включениями), php3 (PHP версии 3), php4 или php (PHP версии 4).

По умолчанию в конфигурационном файле «апача» .php3 — для версии 3, php — для версии 4.

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

hotcooler

Вопрос

Если я открываю соединение функцией mysql_connect, то оно закрывается после отработки скрипта или нужно вызывать mysql_close? И вообще, стоит ли пользоваться mysql_pconnect или она ест много ресурсов при увеличении посетителей?

Ответ

Да, оно закрывается сервером, так что об этом волноваться не нужно. А вообще стоит пользоваться библиотекой db_mysql.php она намного лучше, найти ее можешь в библиотеке phplib.

Вопрос

У меня есть переменная $num. Как из нее убрать кусок текста/цифры, скажем начиная с hello т.е. $num="Manhello!" а после преобразования остается "Man"

Ответ

Загляните в фирменную доку по PHP, раздел «String functions». Например в функцию substr — дальше — в зависимости от того, что Вам требуется.

Вопрос

Что лучше использовать для организации счетчика: MySQL, куда будут заноситься IP-адреса входивших, или текстовый файл .dat?

Ответ

Зависит от предназначения твоего сайта, если он весь построен на технологии MySQL то да, а если ты просто хочешь сделать track user то в файл dat легче, зачем сервак нагружать…

Если решишь использовать MySQL то вот пример таблы:

CREATE TABLE ip ( ip varchar(25) NOT NULL, );

и вот код…

$ip = getenv("REMOTE_ADDR");

$result = mysql_query("SELECT * FROM ip WHERE ip='$ip'");
if ($row != mysql_fetch_array($result))
{
mysql_query("INSERT INTO ip (ip) VALUES ('$ip')");
}

Вопрос

Я пишу информацию в файл. Что произойдет если к файлу обратятся несколько человек сразу? Неужели все перепутается? Как этого избежать?

Ответ

Первый вариант, перейди на mysql… второй, блокируй файл (flock) но это изврат, т.к. когда файл заблокирован, то к нему не могу обращаться др. пользователи, а если их будет 1000 ? плохо… хотя это зависит от сайта…



Copyright © 2000-2004 Сообщество Чайников
Контактная информация