Подскажите задания для новичков

Redjik

Джедай-мастер
Фанат
Извиняюсь за частичный оффтоп.
Я тут "мальчику" помогаю обучиться - по мере сил (кто скажет, что это девочка, пусть первым бросит в меня камень(с)).
Сейчас в свободное от работы время делает блог/гостевую - ну очень простенькую.
Условия
- utf-8
- PDO+prepared statments - тут придется к ООП немного обратиться
- css в отдельном файле
- в остальном лапша код - с ООП пока не мучайся
К вашей статье пока он не готов, поэтому пусть просто PDO поковыряет - знаю, что не панацея...
Какое следующее задание дать ему?
 

Фанат

oncle terrible
Команда форума
ФанатИзвиняюсь за частичный оффтоп.
Не надо извиняться. Всякая полезная информация всегда полезна.

В статье есть функция dbget(), которая реализует и плейсхолдеры и хелперы в одном лице %)
Настоятельно рекомендую как раз для таких случаев. И оопэ не нужно и в использовании оно удобнее, чем пидио(!):
PHP:
$posts = dbget(3,"SELECT * FROM blog WHERE user=%d",$_GET['user']);
А по поводу задания - пусть пишет регистрацию. Если регистрация уже есть - пиши список фич тчательнее :)
 

Фанат

oncle terrible
Команда форума
Извиняюсь за частичный оффтоп.
Ты бы хоть какой-то фидбек оставил
К примеру, порекомендуешь ли челу эту функцию и как она тебе самому :)

Чтобы далеко не ходить, вот её код:
PHP:
function dbget() {
  /*
  usage: dbget($mode, $query, $param1, $param2,...);
  $mode - "dimension" of result:
  0 - resource
  1 - scalar
  2 - row
  3 - array of rows
  */
  $args = func_get_args();
  if (count($args) < 2) {
    trigger_error("dbget: too few arguments");
    return false;
  }
  $mode  = array_shift($args);
  $query = array_shift($args);
  $query = str_replace("%s","'%s'",$query); 

  foreach ($args as $key => $val) {
    $args[$key] = mysql_real_escape_string($val);
  }

  $query = vsprintf($query, $args);
  if (!$query) return false;

  $res = mysql_query($query);
  if (!$res) {
    trigger_error("dbget: ".mysql_error()." in ".$query);
    return false;
  }

  if ($mode === 0) return $res;

  if ($mode === 1) {
    if ($row = mysql_fetch_row($res)) return $row[0];
    else return NULL;
  }

  $a = array();
  if ($mode === 2) {
    if ($row = mysql_fetch_assoc($res)) return $row;
  }
  if ($mode === 3) {
    while($row = mysql_fetch_assoc($res)) $a[]=$row;
  }
  return $a;
}
?>
и примеры использования
PHP:
$name = dbget(1,"SELECT name FROM users WHERE id=%d",$_GET['id']); // если нам нужно только имя
$user = dbget(2,"SELECT * FROM users WHERE id=%d",$_GET['id']); // если нужна вся строка

$sql  = "SELECT * FROM news WHERE title LIKE %s LIMIT %d,%d"; 
$news = dbget(3,$sql,"%$_GET[search]%",$start,$per_page); //если нужен массив
 

Redjik

Джедай-мастер
Дак я ему уже статью саму дал и сказал - все как аксиому воспринимай =)
функция хорошая, но статья в любом случае лучше - она учит головой пользоваться
 

Фанат

oncle terrible
Команда форума
Решил, все-таки, вынести в отдельную тему :)

по поводу статьи - у меня есть фидбек, от людей, которые не в теме или немного в теме - пишут, что совсем непонятно :(
 

Redjik

Джедай-мастер
Ну вот и испытаем на полном новичке =)
Она видимо непонятно тем, у кого на клавиатуре кнопки g,o,l,e отсутствуют =)

Я сейчас замахнусь на вильяма, нашего, шекспира, но многие книги нужно читать по несколько раз, в разные периоды жизни, что уж говорить о технических статьях.
Если что-то непонятно, то можно вернуться через полгода к статье...

Я вот недавно Котерова полистал, совсем другие ощущения нежели год назад.
Уже обращаешь внимание на тонкости.
 

AmdY

Пью пиво
Команда форума
Redjik
вот, кстати, хороший пример, пускай сделает обёртку над PDO чтобы делать $db->fetchOne($sql, $params), $db->fetchAll($sql, $params), $db->insert($table, $dataArray), $db->delete($table, $where, $params)
затем рефакторинг, например чтобы прикрутил логер.

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

p.s. Верстку, надеюсь, задал на фреймворке типа Twitter bootstrap, не думаю что новичку стоит вестать на чём-то другом.
 

Redjik

Джедай-мастер
Верстку пока даже не трогал, все извращения по желанию, а так - кончено bootstrap будет...
Да, спасибо, теперь в голове сформировались задачки.

В таком порядке буду задачки давать/проверять
1) Гостевая
2) Регистрация
3) Украшательства twitter-bootstrap
4) Знакомство с Jquery + ajax (регистрация перенесеться в modal бутстрапа + pagination)
5) ООПизация - переписывание в ООП стиле + обертка над PDO
 

AmdY

Пью пиво
Команда форума
Redjik
угу, если ещё что придёт в голову, то пиши здесь, а то переодически тоже помогаю ребятам подтягиваться.
инкрементальное наращивание функционала здесь оченьб важно, тогда человек понимает нафига это всё ооп нужно. сейчас я в это этап добавляю юнит тесты, чтобы ловить регресивные баги, да и код становится нормальным, учится управлять зависимостями. просто если это давать скопом, то вся эта куча технологий вдруг оказывается простой и въезжают гораздо быстрее, чем при изучении по одному.
 

Ragazzo

TDD interested
По-моему такими заданиями вы не научить новичка хотите а отбить у него тягу к программированию
 

AmdY

Пью пиво
Команда форума
Ragazzo
это не размышления, а испробованная техника, которая прекрасно себя зарекомендовала.
 

Ragazzo

TDD interested
AmdY
Суть твоей практики в написании недопсевдоцмс, которая будет обертками над некоторыми классами в php, в итоге просто потеря времени непонятно на что.
 

AmdY

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

Redjik

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

И как я чуть ли не год пытался въехать в ООП.
 

Фанат

oncle terrible
Команда форума
$db->insert($table, $dataArray); $db->delete($table, $where, $params)
Вот кстати.
НИКОГДА не понимал людей, пишущих функцию insert() и delete().
Экономя ДВА слова, мы имеем КУЧУ проблем.
Что делать с INSERT IGNORE? А REPLACE куда девать? Что делать со вставкой NOW()? INET_ATON()? Что делать с делитом по джойну? Писать многоэтажные $options и вместо простого и читабельного практически на натуральном английском запроса иметь несколько строк винегрета из SQL и PHP?

Это хороший пример того, что я называю нубоинжинирингом.
(Ещё пример такого нубоинжиниринга - предыдущая версия функции dbget, в которой не было параметра mode, а которая сама пыталась определять тип возвращаемого результата по формату полученных из БД данных. И тут я налетел на случай, когда я ждал двумерный массив, а в базе была только одна строка - и функция вернула мне одномерный.)

при этом я не верю, что за время эксплуатации никто не натыкался на проблемы функций insert() и delete(). Но все равно продолжаете пропагандировать. что это за слепота?
Как раз об этой слепоте и двойных стандартах я писал недавно - советуем одно, а делаем другое.

Ребяты, двайте жить реальностью!
 

AmdY

Пью пиво
Команда форума
Фанат
Вот видишь, какое прекрасное задание, как раз есть что дорабатывать. Решение с mysql функциями делается введением объекта Expression и одного ифа, выглядит так
https://github.com/AmdY/SimplePhpFramework/blob/master/vendor/Frm/Db.php#L147
https://github.com/AmdY/SimplePhpFramework/blob/master/test/vendor/Frm/DBTest.php#L76
Можно и вовсе хреначить SQL https://github.com/AmdY/SimplePhpFramework/blob/master/test/vendor/Frm/DBTest.php#L23
Так что никаких ограничений реализация не должна наклыдывать, она лишь представляет удобный и краткий синтаксис, который легко расширать.типа сделать
PHP:
public function insert($table, array $data) {
        if (isset($this->_plugins['timing'])) {
            $data['created_at'] = empty($data['created_at']) ? time() : $data['created_at'];
            $data['updated_at'] = empty($data['updated_at']) ? time() : $data['updated_at'];
        }
.......
}
Собственно цель задания не написать работающий код, а научиться писать так, чтобы его можно было расширять.
 

Ragazzo

TDD interested
Фанат
НИКОГДА не понимал людей, пишущих функцию insert() и delete().
Это хороший пример того, что я называю нубоинжинирингом.
Какая чушь... то что ты думаешь что работа с БД это только пихнул строку в какую-то обертку и пусть заработает это зря. Наверняка авторы популярных фреймворков такие прям нубы, что сделали так, а не как великий Фанат. Вообще многое работает через схему бд которая строится один раз и потом кешируется, и да наверняка и там где MVC не такой как у тебя, тоже писали нубы :D Фанат проснись.
 

Beavis

Banned
Вот кстати.
НИКОГДА не понимал людей, пишущих функцию insert() и delete().
можно же написать эти функции, но нормально, передавая в них просто sql, а возвращать соответственно или вставленный id, или количество удаленных записей
 
Сверху