|
|
|
| Доброго всем времени суток!
Обращаюсь ко всем кто читает или читал книгу "РНР практика создания Web-сайтов" Кузнецов М.В., Симдянов И.В.
Книга произвела на меня огромное впечатление. Открываю тему на обсуждение по книге. И хотелось бы чтобы общение было с теми кто читает или читал книгу.
Спасибо за понимание. | |
|
|
|
|
|
|
|
|
для: muravey
(29.12.2010 в 10:10)
| | Начну с того, на что я натыкался при чтении, это некоторые моменты в листингах.
Листинг 1.24.
(в книге код написан так)
<?php
class minmax
{
private function __call($method, $arg)
{
if (!is_array($arg))
{
return false;
}
$value = $arr[0];
if ($method == "min")
{
for ($i=0; $i < count($arg); $i++)
{
if ($agr[$i] < $value) $value = $agr[$i];
}
}
if ($method == "max")
{
for ($i=0; $i < count($arg); $i++)
{
if ($agr[$i] > $value) $value = $agr[$i];
}
}
return $value;
}
}
?>
|
Сначала я не заметил ошибки, набрал код запустил и код работал не корректно. Я значит пригледелся в него и нашел в нем несколко переменных $arr, $arg, $agr. Переименовал все переменные в $arr и все заработало.
Какой я молодец, подумал я тогда. И еще я подумал, может авторы специально делают ошибки чтобы читатель не тупо копировал листенги, а еще разбирал их строчку за строчкой. И мне понравилась эта мысль, с тех пор сам набираю код и разбираю каждую строчку. Так даже лучше усваивается. :)))
Продолжение следует... | |
|
|
|
|
|
|
|
для: muravey
(29.12.2010 в 10:23)
| | И такой подход мне помогал в дальнейшем изучении книги.
Когда я дошол до класса form (в книге from стр.392), в коде класса ошибка:
...
public function print_form()
{
$enctype = "";
if (!empty($this->fields))
{
foreach ($this->fields as $obj)
{
//назначаем всем эл упр единый стиль
if (!empty($this->css_fld_class))
{
$obj->css_class = $this->css_fld_class;
}
if (!empty($this->css_fld_class)) нужно $this->css_fld_style
{
$obj->css_style = $this->css_fld_style;
}
//проверяем нет ли среди эл упр поля file
if ($obj->type == "file")
{
$enctype = "enctype=\"multipart/form-data\"";
}
}
}
...
|
будте внимательны... | |
|
|
|
|
|
|
|
для: muravey
(29.12.2010 в 10:48)
| | Дальше еще интересней, авторы молодцы, что заставляют читателя думать и разбираться в коде...
Дошол до расширенной регистрации пользователей.
создаю класс
...
$pass_again = new field_text_password ("pass_again",
"Повтор пароля",
true,
$_POST['pass_again']);
...
|
и т.д. как в книге.
Но браузер выдает исключительную ситуацию:
...
Произошла исключительная ситуация (ExceptionMember) - попытка обращения к несуществующему члену класса field. Член field::value не существует.
Ошибка в файле Z:\home\localhost\www\muraveynik\class\class.field.php в строке 48.
...
Дальше ищу в чем ошибка и смотрю HTML код в браузере:
...
<td class="field" valign=top><input
type="password"
name="passiagain"
value=""
size=41 maxlength=255>
</td>
...
|
И вижу что name="passiagain", а не name="pass_again". Странно?
Но если меняю pass_again на pass2 то все работает. Почему так?
Спасибо Ирбису, ответ:
Откройте файл /class/class.field.php
В конструкторе:
<?php
$this->name = $this->encodestring($name);
?>
|
Определение метода encodestring()
<?php
protected function encodestring($st)
{
// Сначала заменяем "односимвольные" фонемы.
$st=strtr($st,"абвгдеёзийклмнопрстуфхъыэ_",
"abvgdeeziyklmnoprstufh'iei");
$st=strtr($st,"АБВГДЕЁЗИЙКЛМНОПРСТУФХЪЫЭ_",
"ABVGDEEZIYKLMNOPRSTUFH'IEI");
// Затем - "многосимвольные".
$st=strtr($st,
array(
"ж"=>"zh", "ц"=>"ts", "ч"=>"ch", "ш"=>"sh",
"щ"=>"shch","ь"=>"", "ю"=>"yu", "я"=>"ya",
"Ж"=>"ZH", "Ц"=>"TS", "Ч"=>"CH", "Ш"=>"SH",
"Щ"=>"SHCH","Ь"=>"", "Ю"=>"YU", "Я"=>"YA",
"ї"=>"i", "Ї"=>"Yi", "є"=>"ie", "Є"=>"Ye"
)
);
// Возвращаем результат.
return $st;
}
?>
|
Обратите внимание на этот участок кода:
<?php
$st=strtr($st,"абвгдеёзийклмнопрстуфхъыэ_",
"abvgdeeziyklmnoprstufh'iei");
$st=strtr($st,"АБВГДЕЁЗИЙКЛМНОПРСТУФХЪЫЭ_",
"ABVGDEEZIYKLMNOPRSTUFH'IEI");
?>
|
Как видно, нижнее подчеркивание заменяется на i
Измените этот участок кода таким образом, чтобы нижнее подчёркивание ничем на заменялось(в нём нет ничего опасного):
<?php
$st=strtr($st,"абвгдеёзийклмнопрстуфхъыэ",
"abvgdeeziyklmnoprstufh'ie");
$st=strtr($st,"АБВГДЕЁЗИЙКЛМНОПРСТУФХЪЫЭ",
"ABVGDEEZIYKLMNOPRSTUFH'IE");
?>
|
Все изменил и заработало... | |
|
|
|
|
|
|
|
для: muravey
(29.12.2010 в 11:04)
| | Дошел до расширенной регистрации пользователей (Л.6.23.)
...
//проверка эл. ящ.
$query = "SELECT COUNT(*) FROM system_accounts
WHERE email = '{$form->fields[email]->value}'";
$mal = mysql_query($query);
if (!$mal)
{
throw new ExceptionMySQL(mysql_error(),
$query,
"Ошибка регистрации пользователя!");
}
if (mysql_result($mal, 0))
{
$error[] = "Пользователь с электронным адресом
{$form->fields[email]->value} уже зарегистрирован!";
}
...
|
Почему когда оставляю все поля пустыми и нажимаю на кнопку Добавить выдает, что пользователь с таким емайлом есть. Тоже самое выдает когда в поле E-mail набираю различный текст.
Вариант1
Поле "Имя" не заполнено!
Поле "Пароль" не заполнено!
Поле "Повтор пароля" не заполнено!
Введите e-mail в виде admin@mail.ru
Пользователь с электронным адресом уже зарегистрирован!
|
Вариант2
Поле "Имя" не заполнено!
Поле "Пароль" не заполнено!
Поле "Повтор пароля" не заполнено!
Введите e-mail в виде admin@mail.ru
Пользователь с электронным адресом ййййй уже зарегистрирован!
|
Сам нашел ошибку...
опечатка...
В книге так
class field_textarea extends field
{
protected $cols;
protected $rows;
protected $disabled;
protected $readonly;
protected $wrap;
//конструктор класса
function __construct($name,
$caption,
$id_required = false,
$value = "",
$cols = 35,
$rows = 7,
$disabled = false,
$readonly = false,
$wrap = false,
$parameters = "",
$help = "",
$help_url = "")
{
parent::__construct($name,
"textarea",
$caption,
$id_required,
$value,
$parameters,
$help,
$help_url);
$this->cols = $cols;
$this->rows = $rows;
$this->disabled = $disabled;
$this->readonly = $readonly;
$this->wrap = $wrap;
}
...
if ($this->is_required) $this->caption .= " *";
...
|
нуно исправить $id_required на $is_required
и заработало... | |
|
|
|
|
|
|
|
для: muravey
(29.12.2010 в 10:23)
| | я не заметил ошибки, набрал код
....
с тех пор сам набираю код
====================================
сначала сам, а потом сам. нелогично как-то. | |
|
|
|
|
|
|
|
для: elenaki
(29.12.2010 в 10:50)
| | Я с вами согласен, что не логично. Вы правы!
И что дальше, может что нибудь по теме скажите или будем говорить что логично, а что нет.
Так то и в книгах в 1000000 тиражами опечатки есть...
Спасибо что поправили! | |
|
|
|
|
|
|
|
для: muravey
(29.12.2010 в 11:08)
| | Да, ошибки в книге есть. На те грабли, что вы описали, думаю, все внимательные читатели наступали.
Как вы правильно написали в одном из первых постов - весь код нужно обязательно разбирать по косточкам, т.к. ошибки присутстуют. Если нашли - исправляйте.
Собственно тема создана с какой целью? Хотите выявить все ошибки из книги или хотите пообсуждать её: актуальность подхода изложенного в книге сегодня, его плюсы и минусы? | |
|
|
|
|
|
|
|
для: Ирбис
(29.12.2010 в 12:02)
| | Как в теме написано
...изучение, заметки и применение данных знаний в своих проектах...
можно и
... актуальность подхода изложенного в книге сегодня, его плюсы и минусы ...
если что то свое есть интересное, то пишите... но только то что относиться к этой книге... | |
|
|
|
|
|
|
|
для: Ирбис
(29.12.2010 в 12:02)
| | Не могу разобраться...
есть класс:
class field_paragraph extends field
{
function __construct($value = "",
$parameters = "")
{
parent::__construct("",
"paragraph",
"",
false,
$value,
$parameters,
"",
"");
}
//имя поля и сам тег элемента управления
function get_html()
{
$tag = htmlspecialchars($this->value, ENT_QUOTES);
$pattern = "#\[b\](.+)\[\/b\]#isU";
$tag = preg_replace($pattern, '<b>\\1</b>', $tag);
$pattern = "#\[i\](.+)\[\/i\]#isU";
$tag = preg_replace($pattern, '<i>\\1</i>', $tag);
$pattern = "#\[url\][\s]*((?=http:[\S])*)[\s]*\[\/url\]#si"; // 26
$tag = preg_replace($pattern, '<a href="\\1" target=_blank>\\2</a>', $tag); // 27
$pattern = "#\[url[\s]*=[\s]*((?=http:)[\S]+)[\s]*\][\s]*([^\[]*)\[/url\]#isU";
$tag = preg_replace($pattern, '<a href="\\1" target=_blank>\\2</a>', $tag);
if (get_magic_quotes_gpc()) $tag = stripcslashes($tag);
return array($this->caption, nl2br($tag));
}
//метод проверяющий корректность переданных данных
function check()
{
return "";
}
}
|
при работе с ним в коде выдает ошибку:
Warning: preg_replace() [function.preg-replace]: Compilation failed: nothing to repeat at offset 26 in Z:\home\localhost\www\muravey-nik\class\class.field.paragraph.php on line 27
|
Кто знает что ни так? | |
|
|
|
|
|
|
|
для: muravey
(10.01.2011 в 20:40)
| | строку ссылки могли бы и указать.
пустой символьный класс с повторителем в последнем шаблоне. | |
|
|
|
|
|
|
|
для: Trianon
(10.01.2011 в 20:53)
| | >строку ссылки могли бы и указать.
Указана в комментарии | |
|
|
|
|
|
|
|
для: cheops
(10.01.2011 в 20:54)
| | ага . точно. слепой.
тогда значит
это утверждение вроде. И повторитель после него?
Утверждение ведь не сопоставляется с текстом, только проверяется? | |
|
|
|
|
|
|
|
для: cheops
(10.01.2011 в 20:54)
| | Что за ошибка? Как исправить? | |
|
|
|
|
|
|
|
для: muravey
(10.01.2011 в 20:40)
| | 26 строку исправьте следующим образом
<?php
$pattern = "#\[url\][\s]*((?=http:)[\S]*)[\s]*\[\/url\]#si"; // 26
?>
|
| |
|
|
|
|
|
|
|
для: cheops
(10.01.2011 в 21:00)
| | Спасибо все получилось!
Скажите, что это такое ни где в книге наити не мог? Где поизучать побольше про это? | |
|
|
|
|
|
|
|
для: muravey
(10.01.2011 в 21:03)
| | Фридла читайте. | |
|
|
|
|
|
|
|
для: muravey
(10.01.2011 в 21:03)
| | Это специализированный язык - регулярные выражения, предназначен для работы с текстом и последовательностями (более подробно об них можно почитать в аннотации к книге Фридла, посвященной им). Достаточно сложный, но чрезывычайно эффективный язык. Здесь ему посвящен отдельный форум. | |
|
|
|
|
|
|
|
для: cheops
(10.01.2011 в 21:11)
| | Спасибо, интересно буду изучать! | |
|
|
|
|
|
|
|
для: cheops
(10.01.2011 в 21:11)
| | Проработал регистрацию пользователей, сейчас работаю над фотогаллерей, но возникла ситуация:
- в ситеме адм галлереи добавляю галлерею все добавляется
- когда хочу отредактировать в поле подставляется имя которое я регистрирую на сайте
$_GET['id_catalog'] = intval($_GET['id_catalog']);
if(empty($_POST))
{
$query = "SELECT * FROM $tbl_photo_catalog
WHERE id_catalog=$_GET[id_catalog]
LIMIT 1";
$cat = mysql_query($query);
if(!$cat)
{
throw new ExceptionMySQL(mysql_error(),
$query,
"Ошибка при обращении
каталогу");
}
$_REQUEST = mysql_fetch_array($cat);
if($_REQUEST['hide'] == 'show') $_REQUEST['hide'] = true;
else $_REQUEST['hide'] = false;
}
echo"<pre>";
print_r($_REQUEST);
echo"</pre>";
$name = new field_text("name",
"Название",
true,
$_REQUEST['name']);
$description = new field_textarea("description",
"Описание",
false,
$_REQUEST['description']);
$hide = new field_checkbox("hide",
"Отображать",
$_REQUEST['hide']);
$id_catalog = new field_hidden_int("id_catalog",
true,
$_REQUEST['id_catalog']);
$form = new form(array("name" => $name,
"description" => $description,
"hide" => $hide,
"id_catalog" => $id_catalog),
"Редактировать",
"field");
|
решил отладить массив $_REQUEST
Array
(
[0] => 2
[id_catalog] => 2
[1] => muravey
[name] => muravey
[2] => Обои
[description] => Обои
[3] => show
[hide] => 1
[4] => 2
[pos] => 2
)
|
в поле name=muravey
а должно быть имя фотогаллереи
т.е. дело в том что в массиве $_REQUEST хроняться данные зарегистрированного пользователя.
Как устранить ошибку без изменения имени полей? | |
|
|
|
|
|
|
|
для: muravey
(11.01.2011 в 00:01)
| | А в таблице что $tbl_photo_catalog поле name какое значение имеет? | |
|
|
|
|
|
|
|
для: cheops
(11.01.2011 в 09:21)
| | $tbl_photo_catalog [name] = muravey | |
|
|
|
|
|
|
|
для: muravey
(11.01.2011 в 09:28)
| | Нет имеется в виду в самой таблице базы данных? Посмотрите через phpMyAdmin, если не сложно. | |
|
|
|
|
|
|
|
для: cheops
(11.01.2011 в 09:30)
| | Через phpMyAdmin и смотрю. Это значение автоматом подставляется при редактировании каталого галлереи, чтобы я туда не вводил. | |
|
|
|
|
|
|
|
для: muravey
(11.01.2011 в 09:32)
| | Проверьте состояние массива $_REQUEST сразу после строки
<?php
$_REQUEST = mysql_fetch_array($cat);
?>
|
Что в дампе массива? | |
|
|
|
|
|
|
|
для: cheops
(11.01.2011 в 09:34)
| | файл catedit.php //редактирование каталога галлереи
...
$_REQUEST = mysql_fetch_array($cat);
if($_REQUEST['hide'] == 'show') $_REQUEST['hide'] = true;
else $_REQUEST['hide'] = false;
}
echo"REQUEST";
echo"<pre>";
print_r($_REQUEST);
echo"</pre>";
...
|
REQUEST
Array
(
[0] => 1
[id_catalog] => 1
[1] => muravey
[name] => muravey <--- В ЭТОМ ПОЛЕ ДОЛЖНО БЫТЬ Обои
[2] => Наклеивание обоев
[description] => Наклеивание обоев
[3] => show
[hide] => 1
[4] => 1
[pos] => 1
)
|
оно и подставляется вот так
...
$name = new field_text("name",
"Название",
true,
$_REQUEST['name']);
...
|
| |
|
|
|
|
|
|
|
для: muravey
(11.01.2011 в 00:01)
| | Проделываю еще
echo"SESSION";
echo"<pre>";
print_r($_SESSION);
echo"</pre>";
echo"COOKIE";
echo"<pre>";
print_r($_COOKIE);
echo"</pre>";
echo"REQUEST";
echo"<pre>";
print_r($_REQUEST);
echo"</pre>";
|
выдает
SESSION
Array
(
[name] => muravey
[id_user_position] => 1
)
COOKIE
Array
(
[name] => muravey
[pass] => pass
[PHPSESSID] => dbfc1862871abf5441db41b241310179
)
REQUEST
Array
(
[name] => muravey
[pass] => pass
[PHPSESSID] => dbfc1862871abf5441db41b241310179
)
|
чищу
setcookie("name", $_COOKIE['name'], time() - 600);
setcookie("pass", $_COOKIE['pass'], time() - 600);
|
получаю
SESSION
Array
(
[name] => muravey
[id_user_position] => 1
)
COOKIE
Array
(
[PHPSESSID] => dbfc1862871abf5441db41b241310179
)
REQUEST
Array
(
[PHPSESSID] => dbfc1862871abf5441db41b241310179
)
|
При этом все работает, но приходиться заново регистрироваться.
Как сохранить данные в гл мас, чтобы эти данные не подставлялись ни где в коде? | |
|
|
|
|
|
|
|
для: muravey
(11.01.2011 в 09:26)
| | У вас директива variables_order в php.ini имеет следующее значение?
variables_order = "EGPCS"
|
| |
|
|
|
|
|
|
|
для: cheops
(11.01.2011 в 09:32)
| | Да именно так
variables_order = "EGPCS"
|
| |
|
|
|
|
|
|
|
для: cheops
(11.01.2011 в 09:32)
| | Дело еще в том, что в системе адм. везде где есть обращение $_REQUEST['name'] подставляется имя пользователя в системе предстваления. Например и в каталоге товаров и услуг.
Может быть только одно решение, что изменить в сист. адм. все name на другое название? | |
|
|
|
|
|
|
|
для: muravey
(11.01.2011 в 09:54)
| | >Может быть только одно решение, что изменить в сист. адм. все name на другое название?
Да я получилось, я изменил в регистрационных файлах поле name на name_user
SESSION
Array
(
[name] => muravey
[id_user_position] => 1
[name_user] => muravey
)
COOKIE
Array
(
[name_user] => muravey
[pass_user] => pass
[PHPSESSID] => dbfc1862871abf5441db41b241310179
[vc] => 1
)
REQUEST
Array
(
[name_user] => muravey
[pass_user] => pass
[PHPSESSID] => dbfc1862871abf5441db41b241310179
[vc] => 1
)
|
Но когда я открываю здесь на форуме новое окно, то пишет
Здравствуйте, Посетитель!
|
Почему так? Тоже конфликт с именами? | |
|
|
|
|
|
|
|
для: cheops
(11.01.2011 в 09:32)
| | Дошел до FTP менеджера.
$ftp_handle = ftp_connect($ftp_server, 21);
|
Все подключается, но не передается путь к корневой директории
$file_list = ftp_rawlist($ftp_handle, $directory);
|
ПОЧЕМУ? | |
|
|
|
|
|
|
|
для: muravey
(11.01.2011 в 14:29)
| | Жаль конечно что никто не помогает до конца разобраться!
Но я уже разобрался, все дело в пассивном режиме. Нужно его включить.
Вот пример приложения который работает:
<?php
// Имя пользователя
$ftp_user = "u9796";
// Пароль
$ftp_password = "pass";
// Сервер
$ftp_server = "u9796.netangels.ru";
// Устанавливаем соединение с FTP-сервером
$ftp_handle = ftp_connect($ftp_server);
$login = ftp_login($ftp_handle, $ftp_user, $ftp_password);
if ((!$ftp_handle) || (!$login))
{
die("Ошибка подключения к FTP-серверу");
}
else
{
echo "Успешно подключились к серверу!";
ftp_pasv($ftp_handle, true);//ВКЛЮЧАЕМ ПАССИВНЫЙ РЕЖИМ
}
echo "<p>Выводим содержимое текущего каталога<br>";
$A = ftp_nlist($ftp_handle, ftp_pwd($ftp_handle));
foreach ($A as $a) echo "<br>$a";
ftp_close($ftp_handle);
?>
|
результат скрипта
Успешно подключились к серверу!
Выводим содержимое текущего каталога
.bash_logout
.bash_profile
.bashrc
.profile
bin
etc
log
muravey-66.ru
muravey-nik.ru
tmp
|
Без этой штуки не работает FTP Manager SoftTime.
ftp_pasv($ftp_handle, true);//ВКЛЮЧАЕМ ПАССИВНЫЙ РЕЖИМ
|
Будте внимательны! | |
|
|
|
|
|
|
|
для: muravey
(12.01.2011 в 07:55)
| | >Без этой штуки не работает FTP Manager SoftTime.
Это от настроек сервера зависит, как правило, пассивный режим сейчас не включают. Там где он включен, разумеется его нужно подключать.
>Жаль конечно что никто не помогает до конца разобраться!
Понимаете, в этом и проблема того, что вы задумали. На форуме не принято задавать множество вопросов в одной теме. Один вопрос - одна тема. Это негласное правило введено не спроста, дело в том, что когда в теме накапливается с пол сотни сообщений, остается все меньше и меньше желающих помогать/отвечать, так как для этого нужно прочитать все сообщения в теме, а это отнимает изрядное время. | |
|
|
|
|
|
|
|
для: muravey
(11.01.2011 в 09:26)
| | >При этом все работает, но приходиться заново регистрироваться.
Даже здесь на форуме при открытии нового окна нужно заново заходить в систему. Как это обойти? | |
|
|
|
|
|
|
|
для: muravey
(11.01.2011 в 09:57)
| | сами с собой говорите? )) | |
|
|
|
|
|
|
|
для: lightning.say
(11.01.2011 в 13:37)
| | Да )), иногда помогает, рассуждая вслух.
Но вот последний вопрос так и остается загадкой... | |
|
|
|