Хай март!


Долго думал что делать дальше и вот что решил

2017-08-13 15:23:28

Все-таки читать подряд 1000 страниц по PHP, как мне кажется, - не самый эффективный путь развития. Проблема в том, что когда ты читаешь все подряд, то к тому времени когда ты прочитаешь всё, многие важные вещи уже забудутся. Может это косяк этой книги "PHP 7 в подлиннике", но просто читать ее становится уже слишком душно, хотя я и так осилил >400 страниц.

Итак, я решил вновь вернуться к решению практической задачи. А именно, сделать самостоятельно себе онлайн портфель для учета акций. Для начала я разобрался с документацией Московской биржи по их API. Я уже как-то пытался читать их API, и вот что я вам скажу:

разбираться с документацией стало намного проще, после того, как я немного освоил PHP 

Более того, я понял как решается проблема, которую два моих коллеги - профессиональные программисты не могли решить самостоятельно, а грузили меня отсылками на статьи в интернете)) 

Итак, с чего начать решение? Ну во-первых, забрать у юзера информацию об акции, которую он хочет добавить в портфель:

* выбрать акцию по тикеру или названию

* дата покупки 

* цена покупки

* количество

Сделать форму пока не вижу проблем. Забрав данные, сохраняем их в таблицу №1 "состав портфеля". Но чтобы выбрать акцию, надо понять из чего выбирать. Для этого надо сделать запрос на биржу и составить таблицу БД №2 "список акций". Соответственно, читаем файл с биржи со списком акций и записываем в каждую строку всего 2 столбца "SECID", "SECNAME". Впоследствии через SECID я смогу делать запросы на получение рыночных данных.

Задача №2 (необязательная), которую я пока не знаю как делать: надо чтобы при вводе в форму выводились подсказки названий из таблицы №2.

=======================

Мое впечатление о регулярных выражениях

2017-08-10 20:57:41

Я чую, что регулярные выражения важны. В книге "PHP7 в подлиннике" эта жуть занимает 45 страниц. И я читаю все подряд, стараюсь что-то выписывать, записывать примеры. Но чувствую я, как только я столкнусь с необходимостью использовать их на практике, мне придется заново все это перечитывать и гуглить. И язык этих выражений настолько многообразен, что я уже предвижу, как в будущем это может вызвать у меня проблем на много-много часов.

Надеюсь, что то, что я делаю сейчас - не напрасно.

Прости дочь, прости жена, что обменял вас на PHP.

Установка и запуск PHP на локальной машине под Windows

2017-08-10 19:44:35

Вернемся в самое начало и повторим этот момент. PHP - язык серверный. Он не компилируется в отдельную исполняемую программу, и в отличие от html файла не интерпретируется только броузером. Для того, чтобы php программа работала, нужен сервер, к которому мы будем обращаться через броузер. Поэтому вся работа с PHP начинается с того, что его надо установить на домашний компьютер сервер, а потом запустить его. Он выполнять php скрипты в локальном броузере.

1. Пройдем по адресу: http://windows.php.net/download#php-7.1 (где на данный момент лежит последняя версия php 7). На самою 7 Винду я поставил VC14 x64 Non Thread Safe.

2. Лично я установил PHP в папку F:\PHP

3. Теперь надо прописать путь PATH в свойствах Windows. Это надо, чтобы PHP можно было запустить из любой папки компьютера. Для этого идем: Пуск->Панель управления-> Система->Дополнительные параметры системы->Переменные среды->Системные переменные. Ищем переменную PATH и добавляем туда адрес, где у вас лежит установленный php - у меня это F:\PHP


4. Запускаем консоль: Пуск->в поиск ввести cmd и нажать Enter

5. Поскольку мы прописали path в пункте 3, теперь где бы мы не находились, можно запустить сервер командой 

php -S localhost:80

Если все удачно, то выйдет такое сообщение:


6. Далее в папке F:\PHP создаем скрипт filename.php

7. Открываем броузер и пишем в строке: localhost/filename.php и сервер запускает этот код.

Чтобы активировать настройки PHP, необходимо в папке F:\PHP файл php.ini-development переименовать в php.ini

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

Изучаю регулярные выражения

2017-08-09 20:56:25

Я никуда не пропал. В выходные мне приходится уделять время семье, в понедельник я занимаюсь Антикризисом, поэтому программирование идет мое крайне медленно.

Сейчас я сильно увяз в теме "Регулярные выражения PCRE". Кто не знает, грузить не буду. Если в тексте вдруг встретиться такая безобидная шняга:

'/(\S+)@([a-z0-9.]+)/is'

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

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


Что я делаю в последние дни?

2017-08-03 23:40:27

Я продолжаю читать книжку PHP7 в подлиннике. Зачем? Основные глобальные задачи, которые я хочу научиться решать:

* научиться парсить тексты

* научиться парсить данные в JSON формате

* начать обрабатывать запаршенные данные:) 

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

программиста без высшего образования сразу видно по его коду
эта фраза засела у меня в голове. Я понял, что надо не только конкретные инструменты изучать, но и получать общее целостное представление о предмете. Поэтому я читаю книгу PHP последовательно. Точно также я прочел целиком книгу CSS. Мне говорили что я напрасно трачу время. Да я кое-что забыл уже, но зато я получил целостное представление о возможностях таблиц стилей. 

Сегодня решил сделать страничку http://mozgovik.com/navigator.html куда я буду скидывать странички с микропрограммами на PHP, для того, чтобы держать их в одном месте. 

На этой неделе я сделал пару кодов (последние в этом списке) и прочел около 70 страниц книги. Совсем немного(( Медленно иду, - много дел по смартлабу, понедельник потратил на антикризис, в среду болела голова целый день - ничего не делал.  

Дальнейшее изучение PHP

2017-08-02 15:17:43

Итак, mozgovik худо-бедно работает. Дальше передо мной стоял вопрос:

Что лучше делать? Развивать функционал мозговика, пытаясь решать проблемы при помощи Яндекса, или учить матчасть?

Я выбрал второй вариант и вернулся к чтению книги. Всё-таки создать мозговик я решил именно в процессе чтения книги "PHP 7 в подлиннике" как раз для того, чтобы было где описывать мои открытия и реализовывать примеры из книги.

Как я делал комментарии к посту на php?

2017-07-29 21:01:00

Да честно говоря, легко. Комментарии = с точки зрения базы данных комментарии - это все равно что посты. Итак, я сделал в базе данных почти такую же таблицу как и для постов, только с другими именами естественно, и с одним отличием. Надо добавить еще 1 ячейку - post_id, которая будет привязывать комментарий к определенному посту. 

Главная проблема, с которой я столкнулся, - это как отправить в базу данных при отправке формы переменную с номером поста, из которого написан комментарий. 

Ну ответ искался недоолго, опять таки мудрый Вова подсказал: 

<input type="hidden" name="post_id" value="<?=$id;>">

, где $id это
$id=(int)$_GET["id"];
То есть айдишник полученный с url адреса той страницы, на которой была отправлена форма. Вывод комментариев по порядку начиная с самого первого по дате сделал уже сам без больших проблем

            $query = "SELECT * FROM comments WHERE post_id = '$id' ORDER BY cmt_date ASC";
            $result = $pdo->query($query);
            try{
                while($mmm = $result->fetch()) { 
                echo '<div class="cmt_1"><b>'.$mmm['cmt_name']."</b> "; 
                echo $mmm['cmt_date']."<br>";
                echo $mmm['cmt_text']."</div>";
                    }
            }

PHP Warning: Cannot modify header information - headers already sent by что это?

2017-07-29 20:39:05

В общем, столкнулся я с такой тупой ошибкой. У меня на сервере почему-то не работал редирект по адресу url. На локалке нормально редиректил, а на сервере нет. Я посмотрел лог и обнаружил ошибку:

PHP Warning:  Cannot modify header information - headers already sent...

Суть в чем? После отправки комментария мне надо вернуться на страницу поста. Для этого я использую инструкцию

header("Location: /post.php?id=$id");

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

после ?> есть пробелы? До <?php есть пробелы ? попробуй не ставить ?> в конце если не надо тебе точно указать закрытие кода пхп. конец файла будет автоматом закрытием пхп. на то что после ?> следует закрытие пхп и все что будет написано далее воспринимается как вывод хтмл. пхп - сам себе шаблонизатор. пхп в одном файле можно 10 раз открыть и закрыть. то же самое почти что если бы ты сделал echo

Блин, как-то тупо в этом визивиге цитаты отражаются, ну да ладно. В общем, Вова - мощь, опыт не пропьешь.

Короче в этом файле где добавляется комментарий и выполняется редирект была ссылка на файл connect.php

А в connect.php действительно стоял пробел после ?> Я вообще убрал этот закрывающий php символ из файла и ошибка реально пропала. Почему так произошло я так и не понял. Сообщив Вове об этом, и кинув ему штуку на телефон в благодарность за помощь, я получил чуть более развернутый ответ

ок. смотри. есть пхп - он обрабатывает файлы. с начала до конца. ищет <?php или <? если включены short_tags в конфиге пхп, далее выполняет или до ?> или до конца файла, если тег не нашелся. Когда находит ?> выполнение заканчивается и начинается вывод. Вывод у тебя не буферизирован и выводится в буфер вывода вебсервера. Сначала уезжают заголовки, потом этот пробел... потом опять выполняется пхп и потом ты хочешь отправить заголовок. Проблема в том что вывод потоковый и заголовки уже уехали и начался вывод контента. Посмотри структуру протокола http - поймешь что нельзя вывести заголовок, если уже начался вывод контента. Вариант - или не делать такой ебанины или буферизировать. 

Буферизация добавит веселых глюков, если будешь так кодить ;) искать их будет весело по большим проектам )))

Короче я примерно понял. Надо еще книжку почитать о том как устроен сервер и что-такое вывод куда-то и что такое заголовки)

Как защитить форму php для комментариев от SQL инъекций?

2017-07-28 18:03:07

Порвал весь мозг, потратил часа три, но сделал!

Суть в чем? Если передавать содержимое формы напрямую, то через форму комментариев можно отправить SQL-запросы, которые будут выполнены базой. Так например будет, если передавать содержимое запросом

INSERT INTO comments cmt_text VALUES $cmt_name

, где $cmt_name - это как раз полученная с формы строка.

Соответственно надо было как-то сделать, чтобы введенное с формы содержимое не вставлялось в запрос в виде строки. Сначала было не ясно как подступиться к решению этой задачи. Вова сразу сказал, что надо делать при помощи метода pdo::prepare. Я бегло почитал документацию и ничего не понял. Потом Вова сказал, что можно использовать pdo::quote. Я сам набрал в Яндексе вопрос: "как защитить форму php?" и получил наводку на функцию htmlspecialchars(). В процессе поиска ответа понял главную проблему:

***Я НЕ ДО КОНЦА ПОНИМАЮ КАК РАБОТАЕТ PDO ПРИ РАБОТЕ С БАЗОЙ ДАННЫХ***

Я решил для себя расписать алгоритм, - как Мозговик работает с SQL - от нажатия кнопки "Комментнуть" до появления комментария на странице.

Теперь, когда я очень сильно тормозя сопоставил пример из мануала со своей программой, я переписал старый запрос:

$query="INSERT INTO comments (post_id, cmt_name, cmt_text, cmt_date) VALUES ('$id','$name','$text', NOW())";

на новый:

$query="INSERT INTO comments (post_id, cmt_name, cmt_text, cmt_date) VALUES ('$id', :cmt_name, :cmt_text, NOW())";

прямые переменные в которых содержался заголовок ($name) и текст ($text) комментария с формы я заменил на так называемые именованные псевдопеременные :cmt_name и :cmt_name, в которые уже подставляются строчки $name и $text при выполнении метода execute. Но сначала этот самый prepare...

$comments = $pdo->prepare($query, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));

//Эта запись означает: выполнить метод prepare для объекта $pdo и записать полученный объект в переменную $comments

Раньше у меня было записано просто $comments = $pdo->prepare($query), а теперь я передаю массив из 2 псевдопеременных, поэтому в мануале написано, что надо использовать доп параметр , array(PDO..... и т.д. Ну а теперь метод execute:

$comments->execute(array(':cmt_name'=>$name,':cmt_text'=>$text)); 

Здесь мы к объекту comments применяем метод execute, подставляя в него уже переменные, полученные с формы.

Когда я это дело неторопливо подставил, сам был в шоке что все заработало без единой ошибки))


Ну собственно весь код выглядит так:


мозго бриф

2017-07-28 14:47:52

Что сделано?

Что надо сделать?

* закрыть форму комментариев от инъекций

* вывести число комментариев на главную

* сделать нормальный вид мозговика для мобильных устройств

* научиться грузить картинки в виде файла в каталог

12345