класс регистрации
Свернутый текст
<?php
class Registration {
private $login; // login - начинается с символа @
private $name; // name - имя
private $surname; // surname - фамилия
private $day; // date - дата рождения
private $month; // month - месяц рождения
private $year; // year - год рождения
private $sex; // male - пол
private $email; // email - реальный email
private $pass; // pass - пароль
private $confirmPass; // confirmpass - пароль еще раз
private $encodedPass; // encodedpass - зашифрованный пароль
protected $salt1 = '!@#$'; // salt1 - в начало пароля
protected $salt2 = '%^&*'; // salt2 - в конец пароля
private $errors; // errors - массив? ошибок
private $token; // token - уникаьный токен для каждого запроса
public function __construct(){
$this->errors = array();
$this->login = $this->filter($_POST['login']);
$this->name = $this->filter($_POST['name']);
$this->surname = $this->filter($_POST['surname']);
$this->day = $this->filter($_POST['day']);
$this->month = $this->filter($_POST['month']);
$this->year = $this->filter($_POST['year']);
$this->sex = $this->filter($_POST['sex']);
$this->email = $this->filter($_POST['email']);
$this->pass = $this->filter($_POST['pass']);
$this->confirmPass = $this->filter($_POST['confirmPass']);
$this->token = $_POST['token'];
$this->encodedPass = md5($this->salt1.$this->pass.$this->salt2);
}
public function process(){
if($this->validToken() && $this->validData())
$this->register();
return count($this->errors) ? 0 : 1;
}
public function filter($var){
return htmlspecialchars($var);
}
public function register(){
// connect to db
mysql_connect("localhost", "root", "") or die();
mysql_select_db("wyd") or die();
mysql_query("INSERT INTO `user` SET
`login` = '".mysql_real_escape_string($this->login)."',
`name` = '".mysql_real_escape_string($this->name)."',
`surname` = '".mysql_real_escape_string($this->surname)."',
`dayOfBirth` = '".mysql_real_escape_string($this->day)."',
`monthOfBirth` = '".mysql_real_escape_string($this->month)."',
`yearOfBirth` = '".mysql_real_escape_string($this->year)."',
`sex` = '".mysql_real_escape_string($this->sex)."',
`email` = '".mysql_real_escape_string($this->email)."',
`pass` = '".mysql_real_escape_string($this->pass)."',
`encodedPass` = '".mysql_real_escape_string($this->encodedPass)."'
") or die("Ошибка - ".mysql_error());
if(mysql_affected_rows() < 1)
$this->errors[] = 'Could not precess the form';
}
public function showErrors(){
echo '<h1>ERRORS</h1>';
foreach($this->errors as $key=>$value){
echo $value.'<br />';
}
}
public function validData(){
if(empty($this->login))
$this->errors[] = 'Invalid login';
if(empty($this->name))
$this->errors[] = 'Invalid name';
if(empty($this->surname))
$this->errors[] = 'Invalid surname';
if(empty($this->day))
$this->errors[] = 'Invalid day';
if(empty($this->month))
$this->errors[] = 'Invalid month';
if(empty($this->year))
$this->errors[] = 'Invalid year';
if(empty($this->sex))
$this->errors[] = 'Invalid sex';
if(empty($this->email))
$this->errors[] = 'Invalid email';
if(empty($this->pass))
$this->errors[] = 'Invalid pass';
if(empty($this->confirmPass))
$this->errors[] = 'Invalid confirmPass';
return count($this->errors) ? 0 : 1;
}
public function validToken(){
if(!isset($_SESSION['token']) || $this->token != $_SESSION['token']){
$this->errors[] = 'Invalid submission';
}
return count($this->errors) ? 0 : 1;
}
}
?>
Ах да, соединение с БД тоже тут.... но это я в курсе что нельзя.... просто для наглядность....
Ну и форма (а вдруг понадобиться)
Свернутый текст
<?php session_start();
error_reporting(E_ALL);
function __autoload($classname){
include './class/class.'.$classname.'.php';
}
if(isset($_POST['send'])){
$reg = new Registration();
if($reg->process())
echo 'Success';
else
$reg->showErrors();
}
$token = $_SESSION['token']= md5(uniqid(mt_rand(), true));
?>
<form action="" method="post">
<table cellpadding="7" class="reg-content" cellspacing="0" width="700px" align="center" border="0">
<tr>
<th>
Логин:
</th>
<td>
<input type="m4a1fox" class="log-left-part" readonly="readonly" value="@" />
<input type="text" name="login" rel="login" maxlength="30" />
</td>
</tr>
<tr>
<th>
Имя:
</th>
<td>
<input type="text" name="name" rel="input" maxlength="30" />
</td>
</tr>
<tr>
<th>
Фамилия:
</th>
<td>
<input type="text" name="surname" rel="input" maxlength="30" />
</td>
</tr>
<tr>
<th>
День рождение:
</th>
<td>
<select name="day" id="day">
<option value="1">День:</option>
<?php
for($i=1; $i<=31; $i++){
echo '<option value="'.$i.'">'.$i.'</option>';
}
?>
</select>
<select name="month" style="border:1px;" id="day" style="width: 100px;">
<option value="">Месяц:</option>
<option value="01">Январь</option>
<option value="02">Февраль</option>
<option value="03">Март</option>
<option value="04">Апрель</option>
<option value="05">Май</option>
<option value="06">Июнь</option>
<option value="07">Июль</option>
<option value="08">Август</option>
<option value="09">Сентябрь</option>
<option value="10">Октябрь</option>
<option value="11">Ноябрь</option>
<option value="12">Декабрь</option>
</select>
<select name="year" id="day">
<option value="">Год:</option>
<?php
for($i=date('Y'); $i>=1901; $i--){
echo '<option value="'.$i.'">'.$i.'</option>';
}
?>
</select>
</td>
</tr>
<tr>
<th>
Пол:
</th>
<td>
<select name="sex" id="day" style="width: 150px;">
<option value="">Выберите пол:</option>
<option value="male">Мужской</option>
<option value="female">Женский</option>
</select>
</td>
</tr>
<tr>
<th>
Email:
</th>
<td>
<input type="text" name="email" rel="input" maxlength="30" />
</td>
</tr>
<tr>
<th>
Пароль:
</th>
<td>
<input type="password" name="pass" rel="input" maxlength="30" />
</td>
</tr>
<tr>
<th>
Пароль еще раз:
</th>
<td>
<input type="password" name="confirmPass" rel="input" maxlength="30" />
<input type="hidden" name="token" value="<?php echo $token;?>" />
</td>
</tr>
<tr>
<th>
</th>
<td>
<input type="submit" name="send" value="Регистрация" />
</td>
</tr>
</table>
</form>
Наверно... мое предположение, можно вынести ошибки в отдельный файл, Ну это так, выстрел наугад... и все.... больше просто не вижу... опыта нет... а теория суха.... так что шишки свои себе сам ставить буду. Спасибо все кто откликнеться... ибо надо правильно делать или не делать ни как.
Спустя 28 минут, 4 секунды (31.10.2011 - 19:20) Семён написал(а):
Говнокод)))))
Спустя 7 минут, 26 секунд (31.10.2011 - 19:27) m4a1fox написал(а):
Семён
Согласен! полностью индуский но все же... как реализовать систему авторизации - правильно согласно концепту ООП. Гугл на эту тему молчит, в сети только процедуры - но это не интересно... интересно правильно сделать...
Согласен! полностью индуский но все же... как реализовать систему авторизации - правильно согласно концепту ООП. Гугл на эту тему молчит, в сети только процедуры - но это не интересно... интересно правильно сделать...
Спустя 22 секунды (31.10.2011 - 19:28) Семён написал(а):
1) Класс нужно использовать примерно в таком ключе:
2) Не имеет смысла жёстко привязываться к передаваемым данным:
Предоставь это валидатору, которому ты передашь правила для переменных, тогда класс станет не привязанным к передаваемым данным
$reg = new Registration($_POST['form']);
$reg->validate(array(
'user_password'=>array('digits','not_empty'),
'user_email'=>array('email','not_empty')
));
if($reg->process()) : $reg->save();
else:
echo $reg->showErrors();
endif;
2) Не имеет смысла жёстко привязываться к передаваемым данным:
private $login; // login - начинается с символа @
private $name; // name - имя
private $surname; // surname - фамилия
private $day; // date - дата рождения
private $month; // month - месяц рождения
private $year; // year - год рождения
Предоставь это валидатору, которому ты передашь правила для переменных, тогда класс станет не привязанным к передаваемым данным
Спустя 1 минута, 52 секунды (31.10.2011 - 19:30) Игорь_Vasinsky написал(а):
Семён
чёт я не понял почему говнокод? добавь комментов.
чёт я не понял почему говнокод? добавь комментов.
Спустя 40 секунд (31.10.2011 - 19:30) alex12060 написал(а):
m4a1fox
http://www.google.com/search?client=ubuntu...=utf-8&oe=utf-8
Гугл не молчит, просто поискать нужно.
http://www.google.com/search?client=ubuntu...=utf-8&oe=utf-8
Гугл не молчит, просто поискать нужно.
Спустя 11 секунд (31.10.2011 - 19:30) imbalance_hero написал(а):
m4a1fox
А теперь тебе надо добавить 1 поле, что ты предлагаешь? ПОЛНОСТЬЮ класс переписывать? Особенностью работы классов заключается в том, что создание онного занимает 90% всего времени, а вот весь класс упрощает добавление и удаление элементов форм. Допустим вставить на страницу инпут должен быть в 1-2 строчки не задевая класс в целом.
Вроде 1000 раз о безопасности говорили, SQL-inj на лицо, где защита от mysql_real_escape_string ?
htmlspecialchars - не подходит! К тому же обработку mysql_real_escape_string (и (или) htmlspecialchars) можно использовать прям ВНУТРИ запроса, тем самым сократишь данный код в 100 раз!
А теперь тебе надо добавить 1 поле, что ты предлагаешь? ПОЛНОСТЬЮ класс переписывать? Особенностью работы классов заключается в том, что создание онного занимает 90% всего времени, а вот весь класс упрощает добавление и удаление элементов форм. Допустим вставить на страницу инпут должен быть в 1-2 строчки не задевая класс в целом.
Вроде 1000 раз о безопасности говорили, SQL-inj на лицо, где защита от mysql_real_escape_string ?
htmlspecialchars - не подходит! К тому же обработку mysql_real_escape_string (и (или) htmlspecialchars) можно использовать прям ВНУТРИ запроса, тем самым сократишь данный код в 100 раз!
Спустя 5 секунд (31.10.2011 - 19:30) m4a1fox написал(а):
Семён
Цитата |
$reg->validate(array( 'user_password'=>array('digits','not_empty'), 'user_email'=>array('email','not_empty') )); |
Ага... теперь бы логически допереть это... и понять что к чему...
Спустя 1 минута, 36 секунд (31.10.2011 - 19:32) m4a1fox написал(а):
imbalance_hero
Цитата |
Вроде 1000 раз о безопасности говорили, SQL-inj на лицо, где защита от mysql_real_escape_string ? htmlspecialchars - не подходит! К тому же обработку mysql_real_escape_string (и (или) htmlspecialchars) можно использовать прям ВНУТРИ запроса, тем самым сократишь данный код в 100 раз! |
точняк. Извините, мое упущение.... уже правлю....
Цитата |
А теперь тебе надо добавить 1 поле, что ты предлагаешь? ПОЛНОСТЬЮ класс переписывать? Особенностью работы классов заключается в том, что создание онного занимает 90% всего времени, а вот весь класс упрощает добавление и удаление элементов форм. Допустим вставить на страницу инпут должен быть в 1-2 строчки не задевая класс в целом. |
тут полностью и однозначно согласен с Вами...
Спустя 3 минуты, 37 секунд (31.10.2011 - 19:36) m4a1fox написал(а):
Семён
Цитата |
Предоставь это валидатору, которому ты передашь правила для переменных, тогда класс станет не привязанным к передаваемым данным |
Я так понимаю просить расшифровать - бессмысленно... поэтому - ссылочкой, где про это сказано - не поделитесь?
Спустя 10 минут, 23 секунды (31.10.2011 - 19:46) RCuPeR написал(а):
Цитата (m4a1fox @ 31.10.2011 - 16:30) | ||
Семён
Ага... теперь бы логически допереть это... и понять что к чему... |
Судя по всему, с валидацией во фреймворках никогда не работал ?
Спустя 54 секунды (31.10.2011 - 19:47) m4a1fox написал(а):
RCuPeR
Цитата |
Судя по всему, с валидацией во фреймворках никогда не работал ? |
Да нет, не работал Судя по всему - зря...
Спустя 3 минуты, 5 секунд (31.10.2011 - 19:50) RCuPeR написал(а):
Цитата (m4a1fox @ 31.10.2011 - 16:47) | ||
RCuPeR
Да нет, не работал Судя по всему - зря... |
Верно подметил.
Не знаю, как в других, но в Kohana и ZendF (могу ошибаться) схожая система валидации.
Спустя 1 минута (31.10.2011 - 19:51) Игорь_Vasinsky написал(а):
RCuPeR
в Yii роюсь щась - аналогичная карусель.
в Yii роюсь щась - аналогичная карусель.
Спустя 6 секунд (31.10.2011 - 19:51) Семён написал(а):
m4a1fox
Ну блин, валидатор - объект который отвечает за проверку данных, сама проверка данных называется валидацией. (вики)
Ты указываешь классу (не в классе, а именно при создании класса) имена ключей, которые тебе нужно использовать при регистрации, т.е.
Создаёшь и указываешь передаваемый массив
Указываешь какие данные ты будешь использовать (массив колонка=>значения) (грубый пример привожу)
ну или просто, если совпадает с базой.
Затем делаешь подкласс (может просто сделай функцию для проверки данных по определённым фильтрам и правилам: не пусто, только_цифры, емейл, только буквы и т.д.
Затем вызываешь её и указываешь правила для каждого значения которое ты передал
Смысл понятен?
Ну блин, валидатор - объект который отвечает за проверку данных, сама проверка данных называется валидацией. (вики)
Ты указываешь классу (не в классе, а именно при создании класса) имена ключей, которые тебе нужно использовать при регистрации, т.е.
Создаёшь и указываешь передаваемый массив
$reg = new Registration($_POST['form']);
Указываешь какие данные ты будешь использовать (массив колонка=>значения) (грубый пример привожу)
$reg->values = array("login", "username"); //указал что в post данных придёт login и его нужно в таблице присвоить колонке username
$reg->values = array("password", "pass");
ну или просто, если совпадает с базой.
$reg->values = array("login","password","email")
Затем делаешь подкласс (может просто сделай функцию для проверки данных по определённым фильтрам и правилам: не пусто, только_цифры, емейл, только буквы и т.д.
Затем вызываешь её и указываешь правила для каждого значения которое ты передал
$reg->validate(array(
'login'=>array('char','not_empty'),
'password'=>array('digits','not_empty')
));
Смысл понятен?
Спустя 1 минута, 12 секунд (31.10.2011 - 19:52) RCuPeR написал(а):
Вот, посмотри. Очень толково сделано. Если нужно будет - смогу скинуть класс $post = new Validation($_POST);
Спустя 43 секунды (31.10.2011 - 19:53) m4a1fox написал(а):
Блин.... очень жаль... что ж, тогда, судя по всему - возвращаемся к мат. части, ибо, знаний, как оказалось - блин, ноль однако! Ладно, как говорят злые гении, я еще вернусь.
Спустя 4 минуты, 41 секунда (31.10.2011 - 19:58) m4a1fox написал(а):
RCuPeR
Спасибо, пробежался по тексту, более подробно - ночью рассмотрю, ибо нужно вникать, а на работе это вряд-ли получится. Но все. Как я считаю, мой ступор, ну кроме кода конечно , заключается в том что я не могу сформировать в голове 2 позиции. То есть это то, что тормозит меня до ужаса - 1. Как выводить ошибки при не заполненных полях. 2 - заносить данные в БД...
Спасибо, пробежался по тексту, более подробно - ночью рассмотрю, ибо нужно вникать, а на работе это вряд-ли получится. Но все. Как я считаю, мой ступор, ну кроме кода конечно , заключается в том что я не могу сформировать в голове 2 позиции. То есть это то, что тормозит меня до ужаса - 1. Как выводить ошибки при не заполненных полях. 2 - заносить данные в БД...
Спустя 19 минут, 13 секунд (31.10.2011 - 20:17) RCuPeR написал(а):
Цитата |
1. Как выводить ошибки при не заполненных полях |
Так не пропускай пустые поля еще "на подходе к серверу". Проверяй средствами JS валидацию, тут можно опустить ООП.
Спустя 1 минута, 58 секунд (31.10.2011 - 20:19) imbalance_hero написал(а):
RCuPeR
Что за глупый совет... а как же спам-боты? Ручная отправка? JS - это лишь красивая оболочка, ему доверять нельзя.
Что за глупый совет... а как же спам-боты? Ручная отправка? JS - это лишь красивая оболочка, ему доверять нельзя.
Спустя 45 секунд (31.10.2011 - 20:20) Семён написал(а):
+ imbalance_hero
Спустя 2 минуты, 49 секунд (31.10.2011 - 20:23) m4a1fox написал(а):
RCuPeR
Извините, но imbalance_hero прав. А еще, если отрубить js на компе.... тю тю... тогда уж красиво можно сделать и применив jQuery.
Извините, но imbalance_hero прав. А еще, если отрубить js на компе.... тю тю... тогда уж красиво можно сделать и применив jQuery.
Спустя 16 минут, 7 секунд (31.10.2011 - 20:39) RCuPeR написал(а):
Не подумал. Прошу прощения.
Спустя 2 минуты, 51 секунда (31.10.2011 - 20:41) m4a1fox написал(а):
Ладно, хватит работать. Я домой (просто что бы были в курсе если не буду отвечать), но эту тему буду развивать, пока не добьюсь правильного решения....
Спустя 27 минут, 30 секунд (31.10.2011 - 21:09) Игорь_Vasinsky написал(а):
вот ещё инфо http://yiiframework.ru/doc/guide/ru/form.model
Спустя 22 минуты, 29 секунд (31.10.2011 - 21:31) RCuPeR написал(а):
Ну вот, в Yii, в принципе, такая же проверка. Я бы даже сказал, проще чем в Kohana.
Спустя 1 час, 25 минут, 19 секунд (31.10.2011 - 22:57) bodja написал(а):
m4a1fox
Ну не принимайте ,так близко к сердцу вышесказаное ;)
Вот моя проверка ,некритичных данных.
Как видим ,юзеру ,мы кое в чем поможем заполнить правильно поля.
Ну а, что пришло в обход,это уже проблемы ботов и хацкеров,
просто убираем горячо любимые символы и обрезаем до нужного размера.
Ну не принимайте ,так близко к сердцу вышесказаное ;)
Вот моя проверка ,некритичных данных.
function adduser() {
var sub=true;
if (!document.getElementById('check_add_user').checked) {
alert('Вы не приняли правила !');
sub=false;
}
var len=document.getElementById('login').value.length;
if ((len<3)||(len>20)) {
alert('Длина логина должна быть не менее 3 и не более 20 символов !');
sub=false;
}
if (document.getElementById('pass').value!=document.getElementById('pass2').value) {
alert('Несовпадение паролей !');
sub=false;
}
var len=document.getElementById('pass').value.length;
if ((len<3)||(len>20)) {
alert('Длина пароля должна быть не менее 3 и не более 20 символов !');
sub=false;
}
var email=document.getElementById('email').value;
email = email.replace(/^\s+|\s+$/g, '');
if (!(/^([a-z0-9_\-]+\.)*[a-z0-9_\-]+@([a-z0-9][a-z0-9\-]*[a-z0-9]\.)+[a-z]{2,4}$/i).test(email)) {
alert('Неверно заполнен e-mail !');
sub=false;
}
if(sub) {document.getElementById('formadduser').submit();}
}
Как видим ,юзеру ,мы кое в чем поможем заполнить правильно поля.
Ну а, что пришло в обход,это уже проблемы ботов и хацкеров,
просто убираем горячо любимые символы и обрезаем до нужного размера.
Спустя 6 минут, 58 секунд (31.10.2011 - 23:04) imbalance_hero написал(а):
bodja
Данный код надо дублировать так же и на ПХП, на всякий случай, если человек обойдет эту защиту.
Данный код надо дублировать так же и на ПХП, на всякий случай, если человек обойдет эту защиту.
Спустя 17 минут, 21 секунда (31.10.2011 - 23:21) bodja написал(а):
Зачем?
Если человек захочет обойти эту защиту,для него как и для нас эти поля все равно будут фиктивными.
Смысл рассказывать им например ,что они неправильно ввели емайл ?
У спамера все равно найтется пару сотен валидных ящиков,ну а хакер вообще преследует совсем другую цель.
Ну естественно ко всему этому никто не отменял ,проверку на уже зарегеный логин и мыло,
капчу и\или подтверждение через мыло.
Если человек захочет обойти эту защиту,для него как и для нас эти поля все равно будут фиктивными.
Смысл рассказывать им например ,что они неправильно ввели емайл ?
У спамера все равно найтется пару сотен валидных ящиков,ну а хакер вообще преследует совсем другую цель.
Ну естественно ко всему этому никто не отменял ,проверку на уже зарегеный логин и мыло,
капчу и\или подтверждение через мыло.
Спустя 4 минуты, 27 секунд (31.10.2011 - 23:26) Семён написал(а):
bodja, кто-то отключил JS и нет проверок.
Спустя 2 минуты, 45 секунд (31.10.2011 - 23:28) Игорь_Vasinsky написал(а):
ну тогда можно submit() и return false на submit...
хотя чё мудрить...
хотя чё мудрить...
Спустя 4 минуты, 20 секунд (31.10.2011 - 23:33) m4a1fox написал(а):
И так. Я дома и я снова про регистрацию...
bodja
Хм... Ну это только не обязательные поля.... Кажется?!
bodja
Хм... Ну это только не обязательные поля.... Кажется?!
Спустя 3 минуты, 6 секунд (31.10.2011 - 23:36) bodja написал(а):
Да,ладно - это уже холиварский спор.
Цитата |
document.getElementById('formadduser').submit() |
отправки тоже не будет,параноики идут гулять на другой сайт.
Спустя 1 минута, 35 секунд (31.10.2011 - 23:37) Игорь_Vasinsky написал(а):
m4a1fox
Давай вместе познавать Yii, он полностью ООПэшный, а то чёт одному не прёт...
http://phpforum.su/index.php?showtopic=52995
там целый набор валидаторов
Давай вместе познавать Yii, он полностью ООПэшный, а то чёт одному не прёт...
http://phpforum.su/index.php?showtopic=52995
там целый набор валидаторов
Спустя 1 минута, 18 секунд (31.10.2011 - 23:39) imbalance_hero написал(а):
bodja
То есть ты предлагаешь открыть спамерам прямой доступ, пусть спамят тебя на здоровье, забивают БД пустыми записями, без паролей, без логинов с кривыми е-мейлами, а потом будешь плакать, когда на 10 000 записей - надо будет почистить сайт от 5 000 пустышек.
То есть ты предлагаешь открыть спамерам прямой доступ, пусть спамят тебя на здоровье, забивают БД пустыми записями, без паролей, без логинов с кривыми е-мейлами, а потом будешь плакать, когда на 10 000 записей - надо будет почистить сайт от 5 000 пустышек.
Спустя 1 минута, 3 секунды (31.10.2011 - 23:40) bodja написал(а):
Цитата |
Хм... Ну это только не обязательные поля.... Кажется?! |
Ну вы сами решайте ,какие для вас обязательны.
Это проверка,что бы чисто не гонять шарика между тупым юзером и серваком
Спустя 4 минуты, 4 секунды (31.10.2011 - 23:44) bodja написал(а):
imbalance_hero
Ну я же писал
Ну я же писал
Цитата |
Ну естественно ко всему этому никто не отменял ,проверку на уже зарегеный логин и мыло, капчу и\или подтверждение через мыло. |
Просто не всегда есть смысл всю банальщину вешать на сервак.
Спустя 4 минуты, 3 секунды (31.10.2011 - 23:48) m4a1fox написал(а):
И все таки думаю что правильно использовать класса ибо все равно это необходимо да и хочется познать... Так что буду мучаться дальше...
Спустя 9 часов, 23 минуты, 3 секунды (1.11.2011 - 09:11) VolDroN написал(а):
я не читал все ответы, но:
смысл этого?:
лучше вынести из конструктора в объявление:
Поля легче вынести в массив, т.е. будет что то наподобие array('login' => 'admin', 'pass' => 'sdfsdfsdf', 'email' => 'email@email.ru');
А потом с помощью foreach проходиться и создавать запрос.
Если нужны какие то специфичные функции для какого то поля, достаточно написать:
смысл этого?:
$this->errors = array();
лучше вынести из конструктора в объявление:
private $errors = array();
Поля легче вынести в массив, т.е. будет что то наподобие array('login' => 'admin', 'pass' => 'sdfsdfsdf', 'email' => 'email@email.ru');
А потом с помощью foreach проходиться и создавать запрос.
Если нужны какие то специфичные функции для какого то поля, достаточно написать:
if(isset($this->fields['phone']))
$this->phoneFormat(&$this->fields['phone']);
Спустя 1 час, 8 минут, 9 секунд (1.11.2011 - 10:19) m4a1fox написал(а):
VolDroN
Спасибо! Буду экспериментировать!
Спасибо! Буду экспериментировать!
Спустя 1 день, 11 часов, 37 минут, 8 секунд (2.11.2011 - 21:56) SlavaFr написал(а):
в глаза сразу бросается то, что этому класу собственно нет не какого применения кроме конкретного случачая. его методы которые содержат глобальные переменные и жостко кодированные соединения с бд. делают его обсалютно бесполезным в других случаях. для меня это просто main метод в котором куски линейного кода распиханы внутри класса. k сожалению будет не возможно в рамках этого подраздела описать все напутствия и пожелания по применению oop.
Спустя 13 дней, 16 часов, 15 минут, 53 секунды (16.11.2011 - 14:12) m4a1fox написал(а):
SlavaFr
Цитата |
в глаза сразу бросается то, что этому класу собственно нет не какого применения кроме конкретного случачая. его методы которые содержат глобальные переменные и жостко кодированные соединения с бд. делают его обсалютно бесполезным в других случаях. для меня это просто main метод в котором куски линейного кода распиханы внутри класса. k сожалению будет не возможно в рамках этого подраздела описать все напутствия и пожелания по применению oop. |
Однозначно Вы тут полностью правы.
Можно просто порассуждать. Не решился создавать отдельную тему, т.к. по сути все тоже самое. А вот что спросить хотел. Как вариант попробовать сделать так. Отделить сперва такие процессы, как класс для проверки значений и работа с ними от класса с ошибками. Т.е. как я это понимаю. Сделать, своего рода - кажется это называется агрегация . Т.е. я смогу отделить ошибки, и когда они появляются, я объявляю класс, передаю в его конструктор - ошибку, класс ее обрабатывает и выдает строку с ошибкой... какие преимущества это мне даст. Как мне кажется, это позволит создать класс ошибок, который будет сам по себе и к которому я смогу обращаться в дальнейшем - изменять - добавлять при этом не затрагивая класс авторизации...
Итак - бред это все, что выше написано, или имеет смысл попробовать, или ваш вариант?!
Можно просто порассуждать. Не решился создавать отдельную тему, т.к. по сути все тоже самое. А вот что спросить хотел. Как вариант попробовать сделать так. Отделить сперва такие процессы, как класс для проверки значений и работа с ними от класса с ошибками. Т.е. как я это понимаю. Сделать, своего рода - кажется это называется агрегация . Т.е. я смогу отделить ошибки, и когда они появляются, я объявляю класс, передаю в его конструктор - ошибку, класс ее обрабатывает и выдает строку с ошибкой... какие преимущества это мне даст. Как мне кажется, это позволит создать класс ошибок, который будет сам по себе и к которому я смогу обращаться в дальнейшем - изменять - добавлять при этом не затрагивая класс авторизации...
Итак - бред это все, что выше написано, или имеет смысл попробовать, или ваш вариант?!
Спустя 6 часов, 25 минут, 35 секунд (16.11.2011 - 20:38) vital написал(а):
Цитата |
Как мне кажется, это позволит создать класс ошибок, который будет сам по себе и к которому я смогу обращаться в дальнейшем - изменять - добавлять при этом не затрагивая класс авторизации. |
Верно. Самостоятельно дошел до давно придуманного Во избежание велосипедов - для этого в пхп есть класс Exception (емнип), от которого можешь наследовать свои классы ошибок.
Спустя 3 часа, 11 минут, 26 секунд (16.11.2011 - 23:49) m4a1fox написал(а):
vital
Цитата |
Самостоятельно дошел до давно придуманного |
Важно было самому понять это! Но есть одно но! Дело в том, что класс Exception делает исключительные ситуации....а пустое поле не есть исключение. Скорее банальной ошибкой! Но попробую сегодня завтра - и отпишусь!
Спустя 1 час, 2 минуты, 36 секунд (17.11.2011 - 00:52) vital написал(а):
Ну вот отнаследуй эксепшн, и в разных ситуациях его при меняй - когда надо throw, когда надо ретурн.
Спустя 13 часов, 45 секунд (17.11.2011 - 13:52) m4a1fox написал(а):
vital
Цитата |
отнаследуй эксепшн |
Отнаследовать не получится Если я правильно понимаю имеется ввиду extends Exception.... а вот инициализировать объект в классе - получится!
Спустя 1 час, 55 минут, 9 секунд (17.11.2011 - 15:48) vital написал(а):
Цитата (m4a1fox @ 17.11.2011 - 12:52) | ||
vital
Отнаследовать не получится Если я правильно понимаю имеется ввиду extends Exception.... а вот инициализировать объект в классе - получится! |
Ccылка раз
наследуем ексепшн ссылка два
Спустя 1 минута, 37 секунд vital написал(а):
try{
//...
}catch(fileModuleException $e){
switch($e->getCode()){//так делать не надо
case 1: echo 'file not found';
case 2: echo 'file not readable';
//...
}
}
кусок кода из второй статьи ^
Твой ведь случай, верно?)
Спустя 1 час, 16 минут, 58 секунд (17.11.2011 - 17:04) m4a1fox написал(а):
vital
Класс по сути полная фигня, он не применим нигде больше, кроме как только для конкретного случая - это факт! И тем не менее.
Вызывается он вот так
vital, я понял что вы хотели сказать. Но навряд ли у меня получится это сделать на данном этапе (знаний по сути ноль). Я думал, что получится сделать отдельный класс для ошибок, а не для исключений (пожалуйста, не думай что я игнорирую твои посты). Просто опыта мало очень... не обессудь. Так вот. Когда появляется ошибка, а именно метод, например вот этот
возвращает TRUE, то происходит, приблизительно следующее
$this->errors[] вернет объект нового класса, кот. в свою очередь, по идее, должен будет вернуть, уже сформулированную строку с ошибкой... в общем где то так. Так можно или нет? Вот что меня интересует. То есть, чисто на программном уровне, это будет считаться ошибкой?
Спустя 52 минуты, 36 секунд m4a1fox написал(а):
Итак, идея провалилась! Надо искать другие варианты!
Свернутый текст
<?php
class Registration extends connectDb {
public $login; // login - начинается с символа @
public $name; // name - имя
public $surname; // surname - фамилия
public $day; // date - дата рождения
public $month; // month - месяц рождения
public $year; // year - год рождения
public $sex; // male - пол
public $email; // email - реальный email
public $pass; // pass - пароль
public $confirmPass; // confirmpass - пароль еще раз
public $encodedPass; // encodedpass - зашифрованный пароль
protected $salt1 = '!@#$'; // salt1 - в начало пароля
protected $salt2 = '%^&*'; // salt2 - в конец пароля
private $errors; // errors - массив? ошибок
private $token; // token - уникальный токен для каждого запроса
public function __construct(){
if(isset($_POST['send'])){
$this->errors = array();
$this->login = $this->filter($_POST['login']);
$this->name = $this->filter($_POST['name']);
$this->surname = $this->filter($_POST['surname']);
$this->day = $this->filter($_POST['day']);
$this->month = $this->filter($_POST['month']);
$this->year = $this->filter($_POST['year']);
$this->sex = $this->filter($_POST['sex']);
$this->email = $this->filter($_POST['email']);
$this->pass = $this->filter($_POST['pass']);
$this->confirmPass = $this->filter($_POST['confirmPass']);
$this->token = $_POST['token'];
$this->encodedPass = md5($this->salt1.$this->pass.$this->salt2);
}
}
public function process(){
if($this->validToken() && $this->validData() && $this->EqualPass())
if($this->validDate())
if($this->checkUser())
$this->register();
return count($this->errors) ? 0 : 1;
}
public function filter($var){
$var = str_replace("`", "", $var);
$var = str_replace("'", "", $var);
return htmlspecialchars($var);
}
public function register(){
$sql = ("INSERT INTO `user` SET
`login` = '".mysql_real_escape_string($this->login)."',
`name` = '".mysql_real_escape_string($this->name)."',
`surname` = '".mysql_real_escape_string($this->surname)."',
`dayOfBirth` = '".mysql_real_escape_string($this->day)."',
`monthOfBirth` = '".mysql_real_escape_string($this->month)."',
`yearOfBirth` = '".mysql_real_escape_string($this->year)."',
`sex` = '".mysql_real_escape_string($this->sex)."',
`email` = '".mysql_real_escape_string($this->email)."',
`pass` = '".mysql_real_escape_string($this->pass)."',
`encodedPass` = '".mysql_real_escape_string($this->encodedPass)."'
") or die("Ошибка- ".mysql_error());
//echo $sql;
connectDb::sql($sql);
if(mysql_affected_rows() < 1)
$this->errors[] = 'Could not precess the form';
}
public function checkUser(){
$sql = "SELECT `id` FROM `user` WHERE `login` = '".$this->login."' AND `email` = '".$this->email."' LIMIT 1";
//echo $sql;
$data = connectDb::sql($sql);
if(mysql_num_rows($data) > 0)
$this->errors[] = 'User is isset on the table';
return count($this->errors) ? 0 : 1;
}
public function showErrors(){
echo '<h1>ERRORS</h1>';
foreach($this->errors as $key=>$value){
echo '<span style="padding:5px; border: 1px solid #2d2d2d; background: #4d4d4d; color: #f6d000;">'.$value.'</span>';
}
}
public function validDate(){
if(empty($this->day) || empty($this->month) || empty($this->year))
$this->errors[] = 'Please, check the date';
return count($this->errors) ? 0 : 1;
}
public function validData(){
if(empty($this->login) || empty($this->name) || empty($this->surname) ||
empty($this->sex) || empty($this->pass) ||
!filter_var($this->email, FILTER_VALIDATE_EMAIL) || empty($this->confirmPass))
$this->errors[] = 'Please fiels all rows to continue';
return count($this->errors) ? 0 : 1;
}
public function EqualPass(){
if($this->pass != $this->confirmPass)
$this->errors[] = 'The password mustn\'t be a equal';
return count($this->errors) ? 0 : 1;
}
public function validToken(){
if(!isset($_SESSION['token']) || $this->token != $_SESSION['token']){
$this->errors[] = 'Invalid submission';
}
return count($this->errors) ? 0 : 1;
}
}
?>
Класс по сути полная фигня, он не применим нигде больше, кроме как только для конкретного случая - это факт! И тем не менее.
Вызывается он вот так
Свернутый текст
<?php session_start();
error_reporting(E_ALL);
function __autoload($classname){
include './class/class.'.$classname.'.php';
}
$con = new connectDb();
$reg = new Registration();
if(isset($_POST['send'])){
if($reg->process()){
header($_SERVER['PHP_SELF']);
}else{
$reg->showErrors();
}
}
$token = $_SESSION['token']= md5(uniqid(mt_rand(), true));
?>
<form action="" method="post">
<table cellpadding="7" class="reg-content" cellspacing="0" width="700px" align="center" border="0">
<tr>
<th>
Логин:
</th>
<td>
<input type="m4a1fox" class="log-left-part" readonly="readonly" value="@" />
<input type="text" name="login" rel="login" maxlength="30" value="<?php echo $reg->login;?>" />
</td>
</tr>
<tr>
<th>
Имя:
</th>
<td>
<input type="text" name="name" rel="input" maxlength="30" value="<?php echo $reg->name;?>" />
</td>
</tr>
<tr>
<th>
Фамилия:
</th>
<td>
<input type="text" name="surname" rel="input" maxlength="30" value="<?php echo $reg->surname;?>" />
</td>
</tr>
<tr>
<th>
День рождение:
</th>
<td>
<select name="day" id="day">
<option value="">День:</option>
<?php
for($i=1; $i<=31; $i++){
if(!empty($reg->day))
echo '<option selected="selected" value="'.$reg->day.'">'.$reg->day.'</option>';
else
echo '<option value="'.$i.'">'.$i.'</option>';
}
?>
</select>
<select name="month" style="border:1px;" id="day" style="width: 100px;">
<option value="">Месяц:</option>
<option value="01">Январь</option>
<option value="02">Февраль</option>
<option value="03">Март</option>
<option value="04">Апрель</option>
<option value="05">Май</option>
<option value="06">Июнь</option>
<option value="07">Июль</option>
<option value="08">Август</option>
<option value="09">Сентябрь</option>
<option value="10">Октябрь</option>
<option value="11">Ноябрь</option>
<option value="12">Декабрь</option>
</select>
<select name="year" id="day">
<option value="">Год:</option>
<?php
for($i=date('Y'); $i>=1901; $i--){
if(!empty($reg->year))
echo '<option selected="selected" value="'.$reg->year.'">'.$reg->year.'</option>';
else
echo '<option value="'.$i.'">'.$i.'</option>';
}
?>
</select>
</td>
</tr>
<tr>
<th>
Пол:
</th>
<td>
<select name="sex" id="day" style="width: 150px;">
<option value="">Выберите пол:</option>
<option value="male">Мужской</option>
<option value="female">Женский</option>
</select>
</td>
</tr>
<tr>
<th>
Email:
</th>
<td>
<input type="text" name="email" value="<?php echo $reg->email;?>" rel="input" maxlength="30" />
</td>
</tr>
<tr>
<th>
Пароль:
</th>
<td>
<input type="password" name="pass" rel="input" maxlength="30" />
</td>
</tr>
<tr>
<th>
Пароль еще раз:
</th>
<td>
<input type="password" name="confirmPass" rel="input" maxlength="30" />
<input type="hidden" name="token" value="<?php echo $token;?>" />
</td>
</tr>
<tr>
<th>
</th>
<td>
<input type="submit" name="send" value="Регистрация" />
</td>
</tr>
</table>
</form>
vital, я понял что вы хотели сказать. Но навряд ли у меня получится это сделать на данном этапе (знаний по сути ноль). Я думал, что получится сделать отдельный класс для ошибок, а не для исключений (пожалуйста, не думай что я игнорирую твои посты). Просто опыта мало очень... не обессудь. Так вот. Когда появляется ошибка, а именно метод, например вот этот
public function validData(){
if(empty($this->login) || empty($this->name) || empty($this->surname) ||
empty($this->sex) || empty($this->pass) ||
!filter_var($this->email, FILTER_VALIDATE_EMAIL) || empty($this->confirmPass))
$this->errors[] = 'Please fiels all rows to continue';
return count($this->errors) ? 0 : 1;
}
возвращает TRUE, то происходит, приблизительно следующее
public function validData(){
if(empty($this->login) || empty($this->name) || empty($this->surname) ||
empty($this->sex) || empty($this->pass) ||
!filter_var($this->email, FILTER_VALIDATE_EMAIL) || empty($this->confirmPass))
$this->errors[] = new errorReport('1041');
return count($this->errors) ? 0 : 1;
}
$this->errors[] вернет объект нового класса, кот. в свою очередь, по идее, должен будет вернуть, уже сформулированную строку с ошибкой... в общем где то так. Так можно или нет? Вот что меня интересует. То есть, чисто на программном уровне, это будет считаться ошибкой?
Спустя 52 минуты, 36 секунд m4a1fox написал(а):
Итак, идея провалилась! Надо искать другие варианты!
Спустя 14 дней, 20 часов, 49 минут, 12 секунд (2.12.2011 - 13:54) minor написал(а):
Мой вариант валидации данных, наверно можно было сделать лучше=)
Создаем обьект валидации (data это данные которые приходят из формы)
Метод проверки валидности
Метод получения сообщения ошибок валидации
Все основанно сделано на неявном вызови функции тоесть
И пишем такой метод под каждую валидацию, на пример на проверку пустоту
Это удобно юзать с ооп оберткой для создания html форм, которую писал по типу zend_form, а то если зендовкую в свой проект подключать тянуть пол фреймверка нужно.
Создаем обьект валидации (data это данные которые приходят из формы)
$valid = new My_Libs_Validator($data);
$valid->setValids('nameElementForm', array('isNumeric', 'notEmpty'),array('message1', 'message2'));
Метод проверки валидности
$valid->isValid()
Метод получения сообщения ошибок валидации
$valid->getMessages();
Все основанно сделано на неявном вызови функции тоесть
call_user_func_array(array($this, $key), array($value, $valParam, $message));
И пишем такой метод под каждую валидацию, на пример на проверку пустоту
protected function notEmpty()
{
$args = func_get_args();
$value = $args[0];
$message = $args[2];
if(!trim($value)) {
$this->setMessage($message);
}
}
Это удобно юзать с ооп оберткой для создания html форм, которую писал по типу zend_form, а то если зендовкую в свой проект подключать тянуть пол фреймверка нужно.
Спустя 9 минут, 18 секунд (2.12.2011 - 14:03) m4a1fox написал(а):
minor
Спасибо за предоставленную информацию. Но сходу понять что у вас происходит в классе, увы не получилось! Меня больше интересует, как данные попадают в ваш класс...
Спасибо за предоставленную информацию. Но сходу понять что у вас происходит в классе, увы не получилось! Меня больше интересует, как данные попадают в ваш класс...
Спустя 15 минут, 23 секунды (2.12.2011 - 14:18) minor написал(а):
Цитата |
Спасибо за предоставленную информацию. Но сходу понять что у вас происходит в классе, увы не получилось! Меня больше интересует, как данные попадают в ваш класс... |
Через конструктор
$valid = new My_Libs_Validator($data);
Передаем в конструктор данные пришедшие от юзера , после на каждый элемент пишем валидацию и сообщение.
public function __construct($dataForm)
{
$this->_dataForm = $dataForm;
}
public function setValid($elementName, $method, $message)
{
if(array_key_exists($elementName, $this->_dataForm)) {
...................
Спустя 7 минут, 27 секунд minor написал(а):
Ну еше раз возможно сделать лучше наверно =) как сделанно в топ фреймверках, я старался как проще и что бы легко добавить методы валидации которые понадобится.
Спустя 8 минут, 47 секунд (2.12.2011 - 14:27) m4a1fox написал(а):
minor
То есть вы массивом обрабатываете?! В конструктор у вас попадает массив?!
То есть вы массивом обрабатываете?! В конструктор у вас попадает массив?!
Спустя 2 минуты, 26 секунд (2.12.2011 - 14:30) minor написал(а):
Да массив прешедший из формы.
Спустя 24 дня, 22 часа, 4 минуты, 9 секунд (27.12.2011 - 12:34) m4a1fox написал(а):
Итак я продолжаю измываться над ооп, или он надо мной :) В общем родилось следующее. Сразу вопрос. Где в логике ошибка.
Итак скрипты.
Первый. Регистрация. Только html. Показываю навсякий.
Далее (даже не знаю как назвать это.) В общем скажем модель.
Что есть в этом классе. Как видим мы подключаем файл controller и вызываем его метод __construct
Класс Controller.php
В конструкторе класса Controoler создается новый объект класса View.
Его код на всякий случай. В принципе тут он не важен.
тут как бы тоже не сложно.
Но вернемся к классу Registration. В нем происходит следующее.
Конкретно интересует метод run. Он из класса RegistrationModel вызывает следующее методы:
$this->model->run();
public function run(){
Session::set('AR', $_POST); // тут в сессию вносятся все пост
}
$this->model->getString($key, $value, true, $_POST[$key]);
public function getString($name, $caption, $is_required, $value){
$this->name = $name;
$this->caption = $caption;
$this->is_required = $is_required;
$this->value = $value;
$this->value = htmlspecialchars($this->value);
// Если поле обязательно для заполнения
if($this->is_required){
// Проверяем, не пусто ли оно
return (empty($this->value)) ? ($this->empty[$this->name] = 'Поле "'.$this->caption.'" не заполнено!') : ($this->full[$this->name] = $this->value);
}
}
$this->model->checkForEmpty();
public function checkForEmpty(){
if(!empty($this->empty)){
header("Location: /registration");
}else{
if($this->full['pass'] == $this->full['confirmPass'])
header("Location: /index");
else
header("Location: /registration");
}
}
Собственно пока что это все. Вывод. Что получилось сделать. Так как все поля обязательны для заполнения, то вот эта конструкция
выполянется правильно. То есть в итоге, стало, на данном этапе, возможно, отделить заполненные поля от не заполненных. Составить массив данных с заполненными полями, где ключ - это поле, а значение - это значение вводимых даных.
А теперь гнобите, и не стесняйтесь. :) Спасибо за выдержку! :)
P.S. Ах да, забыл про вкусное написать. Теперь что бы добавить еще один input достаточно сделать это в html коде, после в массив
добавить его, и создать строку в таблице БД... и все.... она будет обрабатываться и корректно работать.
Итак скрипты.
Первый. Регистрация. Только html. Показываю навсякий.
Свернутый текст
<table cellpadding="0" cellspacing="0" id="reg" align="center" border="0">
<tr class="top">
<td class="reg-logo">
<img src="<?php echo M4A1_HOST?>public/img/logo.png" />
</td>
<td class="registration">
Регистрация
</td>
</tr>
</table>
<table cellpadding="7" class="reg-content" cellspacing="0" width="700px" align="center" border="0">
<form action="<?php echo M4A1_HOST?>registration/run" method="post">
<tr>
<td colspan="2" align="center">
</td>
</tr>
<tr>
<th>
Логин:
</th>
<td>
<input type="m4a1fox" class="log-left-part" readonly="readonly" value="@" />
<input type="text" name="login" rel="login" maxlength="30" value="<?php echo Session::getOne('AR', 'login')?>" />
</td>
</tr>
<tr>
<th>
Имя:
</th>
<td>
<input type="text" name="name" rel="input" maxlength="30" value="<?php echo Session::getOne('AR', 'name')?>" />
</td>
</tr>
<tr>
<th>
Фамилия:
</th>
<td>
<input type="text" name="surname" rel="input" maxlength="30" value="<?php echo Session::getOne('AR', 'surname')?>" />
</td>
</tr>
<tr>
<th>
День рождение:
</th>
<td>
<select name="day" id="day">
<option value="">День:</option>
<?php
for($i=1; $i<=31; $i++){
if(!empty($reg->day))
echo '<option selected="selected" value="'.$reg->day.'">'.$reg->day.'</option>';
else
echo '<option value="'.$i.'">'.$i.'</option>';
}
?>
</select>
<select name="month" style="border:1px;" id="day" style="width: 100px;">
<option value="">Месяц:</option>
<option value="01">Январь</option>
<option value="02">Февраль</option>
<option value="03">Март</option>
<option value="04">Апрель</option>
<option value="05">Май</option>
<option value="06">Июнь</option>
<option value="07">Июль</option>
<option value="08">Август</option>
<option value="09">Сентябрь</option>
<option value="10">Октябрь</option>
<option value="11">Ноябрь</option>
<option value="12">Декабрь</option>
</select>
<select name="year" id="day">
<option value="">Год:</option>
<?php
for($i=date('Y'); $i>=1901; $i--){
if(!empty($reg->year))
echo '<option selected="selected" value="'.$reg->year.'">'.$reg->year.'</option>';
else
echo '<option value="'.$i.'">'.$i.'</option>';
}
?>
</select>
</td>
</tr>
<tr>
<th>
Пол:
</th>
<td>
<select name="sex" id="day" style="width: 150px;">
<option value="">Выберите пол:</option>
<option value="male">Мужской</option>
<option value="female">Женский</option>
</select>
</td>
</tr>
<tr>
<th>
Email:
</th>
<td>
<input type="text" name="email" value="<?php echo Session::getOne('AR', 'email')?>" rel="input" maxlength="30" />
</td>
</tr>
<tr>
<th>
Пароль:
</th>
<td>
<input type="password" name="pass" rel="input" value="<?php echo Session::getOne('AR', 'pass')?>" maxlength="30" />
</td>
</tr>
<tr>
<th>
Пароль еще раз:
</th>
<td>
<input type="password" name="confirmPass" rel="input" maxlength="30" />
<input type="hidden" name="token" value="<?php echo $_SESSION['token']= md5(uniqid(mt_rand(), true));?>" />
</td>
</tr>
<tr>
<th>
</th>
<td>
<input type="submit" name="send" value="Регистрация" />
</td>
</tr>
</form>
</table>
Далее (даже не знаю как назвать это.) В общем скажем модель.
<?php
class Registration extends Controller{
function __construct(){
parent::__construct();
}
function index(){
$this->view->render('registration/index');
}
function run(){
$this->model->run();
$array = array(
'login' => 'Логин',
'name' => 'Имя',
'surname' => 'Фамилия',
'day' => 'День рождения',
'month' => 'Месяц рождения',
'year' => 'Год рождения',
'sex' => 'Пол',
'email' => 'Email',
'pass' => 'Пароль',
'confirmPass' => 'Повтор пароля',
'token' => 'Токен'
);
foreach($array as $key=>$value){
$this->model->getString($key, $value, true, $_POST[$key]);
}
$this->model->checkForEmpty();
}
function sing(){
$this->model->sing();
}
}
Что есть в этом классе. Как видим мы подключаем файл controller и вызываем его метод __construct
Класс Controller.php
Свернутый текст
<?php
class Controller{
function __construct(){
$this->view = new View();
}
public function loadModel($name){
$file = './models/' . $name . '_model.php';
if(file_exists($file)){
require './models/' . $name . '_model.php';
$modelName = $name . 'Model';
$this->model = new $modelName();
}
}
}
В конструкторе класса Controoler создается новый объект класса View.
Его код на всякий случай. В принципе тут он не важен.
Свернутый текст
<?php
class View{
function __construct(){
//echo 'This is view<br />';
}
public function render($name, $noInclude = false){
if($noInclude === true){
require 'views/' . $name . '.php';
}else{
require './views/header.php';
require 'views/' . $name . '.php';
require './views/footer.php';
}
}
}
тут как бы тоже не сложно.
Но вернемся к классу Registration. В нем происходит следующее.
Конкретно интересует метод run. Он из класса RegistrationModel вызывает следующее методы:
- $this->model->run();
- $this->model->getString($key, $value, true, $_POST[$key]);
- $this->model->checkForEmpty();
$this->model->run();
Свернутый текст
public function run(){
Session::set('AR', $_POST); // тут в сессию вносятся все пост
}
$this->model->getString($key, $value, true, $_POST[$key]);
Свернутый текст
public function getString($name, $caption, $is_required, $value){
$this->name = $name;
$this->caption = $caption;
$this->is_required = $is_required;
$this->value = $value;
$this->value = htmlspecialchars($this->value);
// Если поле обязательно для заполнения
if($this->is_required){
// Проверяем, не пусто ли оно
return (empty($this->value)) ? ($this->empty[$this->name] = 'Поле "'.$this->caption.'" не заполнено!') : ($this->full[$this->name] = $this->value);
}
}
$this->model->checkForEmpty();
Свернутый текст
public function checkForEmpty(){
if(!empty($this->empty)){
header("Location: /registration");
}else{
if($this->full['pass'] == $this->full['confirmPass'])
header("Location: /index");
else
header("Location: /registration");
}
}
Собственно пока что это все. Вывод. Что получилось сделать. Так как все поля обязательны для заполнения, то вот эта конструкция
foreach($array as $key=>$value){
$this->model->getString($key, $value, true, $_POST[$key]);
}
выполянется правильно. То есть в итоге, стало, на данном этапе, возможно, отделить заполненные поля от не заполненных. Составить массив данных с заполненными полями, где ключ - это поле, а значение - это значение вводимых даных.
А теперь гнобите, и не стесняйтесь. :) Спасибо за выдержку! :)
P.S. Ах да, забыл про вкусное написать. Теперь что бы добавить еще один input достаточно сделать это в html коде, после в массив
$array = array(
'login' => 'Логин',
'name' => 'Имя',
'surname' => 'Фамилия',
'day' => 'День рождения',
'month' => 'Месяц рождения',
'year' => 'Год рождения',
'sex' => 'Пол',
'email' => 'Email',
'pass' => 'Пароль',
'confirmPass' => 'Повтор пароля',
'token' => 'Токен'
);
добавить его, и создать строку в таблице БД... и все.... она будет обрабатываться и корректно работать.
Спустя 2 часа, 44 секунды (27.12.2011 - 14:34) vital написал(а):
Цитата |
Спасибо за выдержку! |
Не осилил)
Спустя 3 минуты, 20 секунд (27.12.2011 - 14:38) m4a1fox написал(а):
vital
Понимаю! Ладно, чего уж там.
Понимаю! Ладно, чего уж там.
Спустя 2 минуты, 35 секунд (27.12.2011 - 14:40) vital написал(а):
Цитата |
В общем скажем модель. |
Цитата |
class Registration extends Controller{ |
После этого уже пост вызывает когнитивный диссонанс
Спустя 2 минуты, 5 секунд vital написал(а):
Цитата |
public function loadModel($name){ $file = './models/' . $name . '_model.php'; if(file_exists($file)){ require './models/' . $name . '_model.php'; $modelName = $name . 'Model'; $this->model = new $modelName(); } } |
Бред сивой кобылы.
Читай про http://php.net/manual/en/language.oop5.autoload.php
Спустя 1 минута, 18 секунд vital написал(а):
Цитата |
function __construct(){ parent::__construct(); } |
Бред сивой кобылы.
зачем это писать если ты ничего не добавляешь в код? Оно и без тебя само вызовет парент.
Спустя 4 минуты, 17 секунд vital написал(а):
Цитата |
public function render($name, $noInclude = false){ if($noInclude === true){ require 'views/' . $name . '.php'; }else{ require './views/header.php'; require 'views/' . $name . '.php'; require './views/footer.php'; } } |
внутри else бред сивой кобылы.
Посмотри как в нормальных фреймоврках\шаблонизаторах делают layout-ы.
Между прочим - этот код яркая демонстрация того, что перед тем как писать свой велосипед, надо этисамые велосипеды поюзать. Не помню с кем спорил. С инпостом что ли..
Спустя 5 минут, 35 секунд vital написал(а):
Цитата |
function sing(){ $this->model->sing(); } |
Зачем классу петь?
Спустя 7 минут, 22 секунды vital написал(а):
Цитата |
foreach($array as $key=>$value){ $this->model->getString($key, $value, true, $_POST[$key]); } |
Из 15 полей формы, 2 не реквайред, а опциональны. Щито делать?
Спустя 11 минут, 1 секунда (27.12.2011 - 14:51) m4a1fox написал(а):
vital
Цитата |
Бред сивой кобылы. Читай про http://php.net/manual/en/language.oop5.autoload.php |
Согласен! С autoload станет гораздо легче. Исправлю.
Цитата |
Бред сивой кобылы. зачем это писать если ты ничего не добавляешь в код? Оно и без тебя само вызовет парент. |
Так же согласен! Тут без надобности. Но вдруг в будущем пригодится. Хотя стоит убрать.
Цитата |
внутри else бред сивой кобылы. Посмотри как в нормальных фреймоврках\шаблонизаторах делают layout-ы. |
Насчет подключения html шапки и футера, и по поводу того, как это работает в других фреймоврках, полностью прав. Не видел как это в другом месте работает. Надо разобраться.
Цитата |
Зачем классу петь? |
метод просто так написан! Удалю!
Цитата |
Из 15 полей формы, 2 не реквайред, а опциональны. Щито делать? |
Тут не совсем понял, в смысле они не не обязательны для заполнения? Это имеется ввиду?
Спустя 2 минуты, 54 секунды (27.12.2011 - 14:54) vital написал(а):
Цитата |
Тут не совсем понял, в смысле они не не обязательны для заполнения? Это имеется ввиду? |
Да, ты жестко ставишь всем isRequired true в цикле.
Спустя 4 минуты, 41 секунда vital написал(а):
Ну вобщем правь пока. А потом вернемся к архитектуре и перепишем заново
Спустя 8 минут, 45 секунд (27.12.2011 - 15:03) m4a1fox написал(а):
vital
Цитата |
Да, ты жестко ставишь всем isRequired true в цикле. |
Верно! Но! Есть другой вариант, но увеличивается кол-во кода. Вот так
$this->model->getString($login, 'Логин', true, $_POST[$key]);
$this->model->getString($name, 'Имя', true, $_POST[$key]);
........
и так далее до 15 штук.
А можно и так сделать
foreach($array as $key=>$value){
if($value == 'Email')
$this->model->getString($key, $value, false, $_POST[$key]);
else
$this->model->getString($key, $value, true, $_POST[$key]);
}
Как пример!
Спустя 2 минуты, 37 секунд (27.12.2011 - 15:06) vital написал(а):
Цитата (m4a1fox @ 27.12.2011 - 14:03) | ||
vital
Верно! Но! Есть другой вариант, но увеличивается кол-во кода. Вот так
А можно и так сделать
Как пример! |
А можно сделать ваще по другому, как делают нормальные люди
Но ты еще не додумался
Спустя 3 минуты (27.12.2011 - 15:09) m4a1fox написал(а):
vital
Цитата |
А можно сделать ваще по другому, как делают нормальные люди wink.gif Но ты еще не додумался |
Не спорю! Намекни!
Спустя 6 минут, 1 секунда (27.12.2011 - 15:15) vital написал(а):
Ну..
Вот я хочу что бы примерно так:
И т.п.
И еще легко свои кастомные валидаторы добавлять. ;)
Вот я хочу что бы примерно так:
$rules = array(
array('field' => 'name', array('required' => true, 'minlength' => 3, 'maxlength'=>10,'escape_html'=>false)),
array('field'=>'email', array('required' => true, 'minlength' => 3, 'maxlength'=>10, 'filter'=>'email'))
);
И т.п.
И еще легко свои кастомные валидаторы добавлять. ;)
Спустя 5 минут, 25 секунд (27.12.2011 - 15:20) m4a1fox написал(а):
vital
Цитата |
$rules = array( array('field' => 'name', array('required' => true, 'minlength' => 3, 'maxlength'=>10,'escape_html'=>false)), array('field'=>'email', array('required' => true, 'minlength' => 3, 'maxlength'=>10, 'filter'=>'email')) ); |
Все как по учебнику почти все... понятно что собственно происходит, значит нужен новый метод, кот. будет принимать массив и вложенный массив и разбивая работать с полученными данными. Понятно. Спасибо. Буду исправлять. Но думаю, что так как у тебя, навряд ли получится сходу сделать. Поэтому, сначала исправлю ошибки что выше были.
Спустя 1 час, 9 минут, 27 секунд (27.12.2011 - 16:30) vital написал(а):
Цитата (m4a1fox @ 27.12.2011 - 14:20) | ||
vital
Все как по учебнику почти все... понятно что собственно происходит, значит нужен новый метод, кот. будет принимать массив и вложенный массив и разбивая работать с полученными данными. Понятно. Спасибо. Буду исправлять. Но думаю, что так как у тебя, навряд ли получится сходу сделать. Поэтому, сначала исправлю ошибки что выше были. |
Никогда не стоит соимневаться в себе.
Просто бери и делай.
Спустя 2 минуты, 55 секунд (27.12.2011 - 16:32) Oyeme написал(а):
spl_autoload_register() provides a more flexible alternative for autoloading classes. For this reason, using __autoload() is discouraged and may be deprecated or removed in the future.
Спустя 3 минуты, 22 секунды (27.12.2011 - 16:36) m4a1fox написал(а):
Oyeme
Епс.... то есть использовать функцию spl_autoload_register()
Епс.... то есть использовать функцию spl_autoload_register()
Спустя 3 минуты, 29 секунд (27.12.2011 - 16:39) Oyeme написал(а):
Да,это очень практично.Вам не нужно "каждый раз писать что и как подгружать".
http://www.php.net/manual/en/function.spl-...ad-register.php
http://www.php.net/manual/en/function.spl-...ad-register.php
Спустя 4 минуты, 22 секунды (27.12.2011 - 16:44) m4a1fox написал(а):
Oyeme
Ух ты как прикольно! __NAMESPACE__ я еще ни разу не использовал!
Есть тупичок, ну я так думаю. Вот так выглядит index
Знаю что так не делается.... что нужно использовать __autoload() но это поправимо. Вот теперь нужно применить не __autoload(), а spl_autoload_register().
Ух ты как прикольно! __NAMESPACE__ я еще ни разу не использовал!
Есть тупичок, ну я так думаю. Вот так выглядит index
<?php session_start();
/**
* -----M4A1_FOX-----
* site - WWW.WYD.COM
* We establish the charset and level of errors
*/
header("Content-Type: text/html; charset=utf-8");
error_reporting(E_ALL);
require './libs/Bootstrap.php';
require './libs/Controller.php';
require './libs/View.php';
require './libs/Model.php';
require './libs/Database.php';
require './libs/Registry.php';
require './libs/Session.php';
require './libs/Cookie.php';
require './config/paths.php';
require './config/database.php';
Registry::set('DB', new Database());
$app = new Bootstrap();
?>
Знаю что так не делается.... что нужно использовать __autoload() но это поправимо. Вот теперь нужно применить не __autoload(), а spl_autoload_register().
Спустя 14 минут, 49 секунд (27.12.2011 - 16:59) Oyeme написал(а):
Создайте файл для конфигов.И туда выносите все конфигурации.
Example:
Я думаю идея Вам понятна.С путями сами разберитесь.
Example:
define('APP_ROOT',dirname(__FILE__).DIRECTORY_SEPARATOR);
define('APP_LIBS',APP_ROOT.'libs'.DIRECTORY_SEPARATOR);
set_include_path(get_include_path().PATH_SEPARATOR.APP_LIBS);
spl_autoload_register();
Я думаю идея Вам понятна.С путями сами разберитесь.
Спустя 8 минут, 43 секунды (27.12.2011 - 17:07) m4a1fox написал(а):
Oyeme
Едрид мадрид.... спс! И подключив только этот файл (config.php) он вызывает необходимые для работы файлы и подключает их!?
Едрид мадрид.... спс! И подключив только этот файл (config.php) он вызывает необходимые для работы файлы и подключает их!?
Спустя 54 минуты, 29 секунд (27.12.2011 - 18:02) m4a1fox написал(а):
Я тут в сети полазил.... вот что нарыл! Сделал в общем так.
index.php
path.php
И database.php
index.php
<?php session_start();
/**
* -----M4A1_FOX-----
* site - WWW.WYD.COM
* We establish the charset and level of errors
*/
header("Content-Type: text/html; charset=utf-8");
error_reporting(E_ALL);
require './config/paths.php';
require './config/database.php';
spl_autoload_register ('autoload');
Registry::set('DB', new Database());
$app = new Bootstrap();
?>
path.php
<?php
/**
* Establishes a physical path to a root directory of a script
* Устанавливает физический путь до корневой директории скрипта
*/
define('M4A1_ROOT', str_replace('\\', '/', $_SERVER['DOCUMENT_ROOT']) .'/');
/**
* Establishes a path to a script root for HTTP
* Устанавливает путь до корневой директории скрипта
* по протоколу HTTP
*/
define('M4A1_HOST', 'http://'. $_SERVER['HTTP_HOST'] .'/');
spl_autoload_register ('autoload');
function autoload ($className) {
$fileName = APP_LIBS . $className . '.php';
include $fileName;
}
И database.php
<?php
define('M4A1_DB_TYPE', '------');
define('M4A1_DB_HOST', '-------');
define('M4A1_DB_NAME', '-------');
define('M4A1_DB_USER', '-------');
define('M4A1_DB_PASS', '--------');
Спустя 3 минуты, 40 секунд (27.12.2011 - 18:05) m4a1fox написал(а):
А вот когда несколько папок, становится проблематично не использовать include или reqiure
Спустя 18 минут, 50 секунд (27.12.2011 - 18:24) Oyeme написал(а):
Этого не должно быть:
;)
Для установления других папок используйте:
function autoload ($className) {
$fileName = APP_LIBS . $className . '.php';
include $fileName;
}
;)
Для установления других папок используйте:
set_include_path();
Спустя 8 минут, 9 секунд (27.12.2011 - 18:32) m4a1fox написал(а):
теперь index.php имеет вид
<?php session_start();
/**
* -----M4A1_FOX-----
* site - WWW.WYD.COM
* We establish the charset and level of errors
*/
header("Content-Type: text/html; charset=utf-8");
error_reporting(E_ALL);
function autoload ($className) {
$arr = array(M4A1_LIBS.$className . '.php', M4A1_CONTR.$className . '.php', M4A1_MODELS.$className . '.php');
foreach($arr as $val){ if(file_exists($val)) include $val;}
}
require './config/database.php';
define('M4A1_HOST', 'http://'. $_SERVER['HTTP_HOST'] .'/');
define('M4A1_ROOT', dirname(__FILE__).DIRECTORY_SEPARATOR);
define('M4A1_LIBS', M4A1_ROOT.'libs'.DIRECTORY_SEPARATOR);
define('M4A1_CONTR', M4A1_ROOT.'controllers'.DIRECTORY_SEPARATOR);
define('M4A1_MODELS', M4A1_ROOT.'models'.DIRECTORY_SEPARATOR);
spl_autoload_register('autoload');
Registry::set('DB', new Database());
$app = new Bootstrap();
?>
Спустя 3 минуты, 28 секунд (27.12.2011 - 18:36) m4a1fox написал(а):
Уважаемый, Oyeme я прочитал что вы написали, но ситуация такова, что, я практически и теоретически понимаю что должна делать эта строчка
Она устанавливает и переопределяет папку из кот. ведется подключение(include) файлов. Но к сожалению она у меня не работает. То есть у меня постоянно выдает вот такой путь : .;/usr/local/php5/PEAR , насколько я понимаю он должен меняться. А он не меняется. И еще, а как же тогда сделать подключения других файлов не из папки libs?
set_include_path(get_include_path().PATH_SEPARATOR.APP_LIBS);
Она устанавливает и переопределяет папку из кот. ведется подключение(include) файлов. Но к сожалению она у меня не работает. То есть у меня постоянно выдает вот такой путь : .;/usr/local/php5/PEAR , насколько я понимаю он должен меняться. А он не меняется. И еще, а как же тогда сделать подключения других файлов не из папки libs?
Спустя 11 минут, 8 секунд (27.12.2011 - 18:47) m4a1fox написал(а):
То есть так выглядит! :)
<?php session_start();
/**
* -----M4A1_FOX-----
* site - WWW.WYD.COM
* We establish the charset and level of errors
*/
header("Content-Type: text/html; charset=utf-8");
error_reporting(E_ALL);
function autoload ($className) {
$arr = array(M4A1_LIBS, M4A1_CONTR, M4A1_MODELS);
foreach($arr as $val){ if(file_exists($val . $className . '.php')) include $val . $className . '.php';}
}
require './config/database.php';
define('M4A1_HOST', 'http://'. $_SERVER['HTTP_HOST'] .'/');
define('M4A1_ROOT', dirname(__FILE__).DIRECTORY_SEPARATOR);
define('M4A1_LIBS', M4A1_ROOT.'libs'.DIRECTORY_SEPARATOR);
define('M4A1_CONTR', M4A1_ROOT.'controllers'.DIRECTORY_SEPARATOR);
define('M4A1_MODELS', M4A1_ROOT.'models'.DIRECTORY_SEPARATOR);
spl_autoload_register('autoload');
Registry::set('DB', new Database());
$app = new Bootstrap();
?>
Спустя 5 часов, 31 минута, 23 секунды (28.12.2011 - 00:18) Oyeme написал(а):
Сделал для Вас пример.
Подключаем классы из папки libs и models
index.php
libs
class_1.php
class_2.php
Models
class_3.php
class_4.php
Подключаем классы из папки libs и models
index.php
<?php
define('APP_ROOT',dirname(__FILE__).DIRECTORY_SEPARATOR);
define('APP_LIBS',APP_ROOT.'libs'.DIRECTORY_SEPARATOR);
define('APP_MODEL',APP_ROOT.'models'.DIRECTORY_SEPARATOR);
set_include_path(get_include_path().PATH_SEPARATOR.APP_LIBS);
set_include_path(get_include_path().PATH_SEPARATOR.APP_MODEL);
spl_autoload_register();
var_dump(new class_1());
var_dump(new class_2());
var_dump(new class_3());
var_dump(new class_4());
?>
libs
class_1.php
<?php
class class_1 {
function __constructor(){
return this;
}
}
class_2.php
<?php
class class_2 {
function __constructor(){
return this;
}
}
Models
class_3.php
<?php
class class_3 {
function __constructor(){
return this;
}
}
?>
class_4.php
<?php
class class_4 {
function __constructor(){
return this;
}
}
?>
Спустя 13 часов, 19 минут, 22 секунды (28.12.2011 - 13:38) m4a1fox написал(а):
Oyeme
Воспользовался вашей функцией. Честно говоря, она в некотором месте у меня не сработала :( Но в обще - работает! Не могли бы вы описать ее преимущества по сравнению с моей
[more]
Спасибо.
Воспользовался вашей функцией. Честно говоря, она в некотором месте у меня не сработала :( Но в обще - работает! Не могли бы вы описать ее преимущества по сравнению с моей
[more]
<?php session_start();
/**
* -----M4A1_FOX-----
* site - WWW.WYD.COM
* We establish the charset and level of errors
*/
header("Content-Type: text/html; charset=utf-8");
error_reporting(E_ALL);
function autoload ($className) {
$arr = array(M4A1_LIBS, M4A1_CONTR, M4A1_MODELS);
foreach($arr as $val){ if(file_exists($val . $className . '.php')) include $val . $className . '.php';}
}
require './config/database.php';
define('M4A1_HOST', 'http://'. $_SERVER['HTTP_HOST'] .'/');
define('M4A1_ROOT', dirname(__FILE__).DIRECTORY_SEPARATOR);
define('M4A1_LIBS', M4A1_ROOT.'libs'.DIRECTORY_SEPARATOR);
define('M4A1_CONTR', M4A1_ROOT.'controllers'.DIRECTORY_SEPARATOR);
define('M4A1_MODELS', M4A1_ROOT.'models'.DIRECTORY_SEPARATOR);
spl_autoload_register('autoload');
Registry::set('DB', new Database());
$app = new Bootstrap();
?>[/more]
Спасибо.
Спустя 12 минут, 56 секунд (28.12.2011 - 13:51) m4a1fox написал(а):
Прикола ради! Ваш скрипт если вывести вот так
на экран выводит следующее
Если сделать так
То выводится это
То есть как бы пути все на месте. Но вот такой код
Вызывает вот такую ошибку
собственно 14 строчка это объявление класса new Index().
ХЗ почему так, но не хочет правильно работать!
define('M4A1_HOST', 'http://'. $_SERVER['HTTP_HOST'] .'/');
define('M4A1_ROOT', dirname(__FILE__).DIRECTORY_SEPARATOR);
define('M4A1_LIBS', M4A1_ROOT.'libs'.DIRECTORY_SEPARATOR);
define('M4A1_CONTR', M4A1_ROOT.'controllers'.DIRECTORY_SEPARATOR);
define('M4A1_MODELS', M4A1_ROOT.'models'.DIRECTORY_SEPARATOR);
echo set_include_path(get_include_path().PATH_SEPARATOR.M4A1_LIBS);
echo '<br />';
echo set_include_path(get_include_path().PATH_SEPARATOR.M4A1_MODELS);
echo '<br />';
echo set_include_path(get_include_path().PATH_SEPARATOR.M4A1_CONTR);
echo '<br />';
spl_autoload_register();
на экран выводит следующее
.;/usr/local/php5/PEAR
.;/usr/local/php5/PEAR;Y:\home\www.sitename\www\libs\
.;/usr/local/php5/PEAR;Y:\home\www.sitename\www\libs\;Y:\home\www.sitename\www\models\
Если сделать так
define('M4A1_HOST', 'http://'. $_SERVER['HTTP_HOST'] .'/');
define('M4A1_ROOT', dirname(__FILE__).DIRECTORY_SEPARATOR);
define('M4A1_LIBS', M4A1_ROOT.'libs'.DIRECTORY_SEPARATOR);
define('M4A1_CONTR', M4A1_ROOT.'controllers'.DIRECTORY_SEPARATOR);
define('M4A1_MODELS', M4A1_ROOT.'models'.DIRECTORY_SEPARATOR);
//spl_autoload_register('autoload');
echo set_include_path(get_include_path().PATH_SEPARATOR.M4A1_CONTR);
echo '<br />';
echo set_include_path(get_include_path().PATH_SEPARATOR.M4A1_LIBS);
echo '<br />';
echo set_include_path(get_include_path().PATH_SEPARATOR.M4A1_MODELS);
echo '<br />';
echo set_include_path(get_include_path().PATH_SEPARATOR.M4A1_CONTR);
echo '<br />';
spl_autoload_register();
То выводится это
.;/usr/local/php5/PEAR
.;/usr/local/php5/PEAR;Y:\home\www.wyd.com\www\controllers\
.;/usr/local/php5/PEAR;Y:\home\www.wyd.com\www\controllers\;Y:\home\www.wyd.com\www\libs\
.;/usr/local/php5/PEAR;Y:\home\www.wyd.com\www\controllers\;Y:\home\www.wyd.com\www\libs\;Y:\home\www.wyd.com\www\models\
То есть как бы пути все на месте. Но вот такой код
if(empty($url[0])){
//include './controllers/index.php';
$controller = new Index();
$controller->main();
return false;
}
Вызывает вот такую ошибку
Fatal error: spl_autoload() [<a href='function.spl-autoload'>function.spl-autoload</a>]: Class Index could not be loaded in Y:\home\www.wyd.com\www\libs\Bootstrap.php on line 14
собственно 14 строчка это объявление класса new Index().
ХЗ почему так, но не хочет правильно работать!
Спустя 1 час, 58 минут, 8 секунд (28.12.2011 - 15:49) Oyeme написал(а):
There is a comment (anonymous) on http://php.net/manual/en/function.spl-autoload-register.php that may apply to your problem: spl_autoload_register() doesn't seem to play nice with camelcase, and in your case could be trying to find request.class.php instead of Request...
У Вас как раз,смените название класса на маленькие буквы.
У Вас как раз,смените название класса на маленькие буквы.
Спустя 1 час, 4 минуты, 22 секунды (28.12.2011 - 16:53) m4a1fox написал(а):
Oyeme
Цитата |
У Вас как раз,смените название класса на маленькие буквы. |
да уже и менял, и по другому называл! Один результат!
Спустя 19 минут, 13 секунд (28.12.2011 - 17:12) m4a1fox написал(а):
Только что перепроверил! Вот класс
Вот его вызов
Вот код индекс файла
И вот код :( ошибки
<?php
class Main extends Controller{
function __construct(){
parent::__construct();
}
function index(){
$this->view->render('index/index');
}
function details(){
$this->view->render('index/index');
}
}
Вот его вызов
if(empty($url[0])){
//include './controllers/index.php';
$controller = new Main();
$controller->index();
return false;
}
Вот код индекс файла
<?php session_start();
/**
* -----M4A1_FOX-----
* site - WWW.WYD.COM
* We establish the charset and level of errors
*/
header("Content-Type: text/html; charset=utf-8");
error_reporting(E_ALL);
require './config/database.php';
define('M4A1_HOST', 'http://'. $_SERVER['HTTP_HOST'] .'/');
define('M4A1_ROOT', dirname(__FILE__).DIRECTORY_SEPARATOR);
define('M4A1_LIBS', M4A1_ROOT.'libs'.DIRECTORY_SEPARATOR);
define('M4A1_CONTR', M4A1_ROOT.'controllers'.DIRECTORY_SEPARATOR);
define('M4A1_MODELS', M4A1_ROOT.'models'.DIRECTORY_SEPARATOR);
set_include_path(get_include_path().PATH_SEPARATOR.M4A1_CONTR);
set_include_path(get_include_path().PATH_SEPARATOR.M4A1_LIBS);
set_include_path(get_include_path().PATH_SEPARATOR.M4A1_MODELS);
set_include_path(get_include_path().PATH_SEPARATOR.M4A1_CONTR);
spl_autoload_register();
Registry::set('DB', new Database());
$app = new Bootstrap();
?>
И вот код :( ошибки
Fatal error: spl_autoload() [<a href='function.spl-autoload'>function.spl-autoload</a>]: Class Main could not be loaded in Y:\home\www.wyd.com\www\libs\Bootstrap.php on line 14
Спустя 4 часа, 32 минуты, 22 секунды (28.12.2011 - 21:45) Oyeme написал(а):
Проверте ,работает ли у Вас то что я приложил в архиве.
Спустя 2 часа, 20 минут, 2 секунды (29.12.2011 - 00:05) m4a1fox написал(а):
Oyeme
object(class_1)#1 (0) { } object(class_2)#1 (0) { } object(class_3)#1 (0) { } object(class_4)#1 (0) { } object(stdClass)#1 (1) { ["scalar"]=> string(1) "A" }
Спустя 9 часов, 47 минут, 42 секунды (29.12.2011 - 09:52) Oyeme написал(а):
Работает ведь.Теперь смотрите почему у Вас не работает.
Вы указываете папки из которых подгружать классы,и никакого include.
Вы указываете папки из которых подгружать классы,и никакого include.
Спустя 4 часа, 19 минут, 23 секунды (29.12.2011 - 14:12) m4a1fox написал(а):
Oyeme
Цитата |
Вы указываете папки из которых подгружать классы,и никакого include. |
Да, инклюда нет. Все равно с эти заминка...