Хай март!


Как изменить порядок вывода из базы MySQL

2017-07-23 17:07:22
Сейчас у меня выводятся посты пол порядку, начиная с первого, заканчивая последним. Для этого я использую ретроградную конструкцию while($mmm = $result->fetch()) {}
Я думал, что надо как-то поколдовать с массивами+циклом, чтобы сделать вывод в обратном порядке
Я бы наверное часа три еще на это потратил, но Вова подсказал, что можно всего лишь исправить SQL запрос
Было:
$query = "SELECT * FROM posts";

Стало:
$query = "SELECT * FROM posts ORDER BY post_date DESC";

И делов!
В процессе словил ошибку №10 - почему-то не выводилась самая первая строка из объекта PDO. Ну почему???? Вова так и сказал
потому что фечишь как ебанат )
Но довольно быстро сам нашел причину ошибки - у меня до цикла while был зачем-то сделан один лишний вызов $mmm = $result->fetch(). А каждый вызов этого фетчка сдвигает массив на новую строку. Поэтому while у меня получается выводился со 2 строки.

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

Запуск PHP+MySQL на сервере: форма+вывод

2017-07-23 16:41:33
Я перенес все файлы .php с локалки на сервак. Переименовал ссылки на базу. Итак, пробую запустить http://mozgovik.com/connect.php и...
Ошибка №6
: Error 500. Страница не найдена.
Гружу файл index.php, пытаюсь его открыть.
Ошибка №7:
Открывается пустая страница
Забегу вперед. Спустя какое-то время я понял, что PHP сервер настроен таким образом, что ошибки он не пишет в окно броузера, как это было на локалке. Поэтому если PHP работает некорректно, то он просто выдает пустую страницу. Конечно я потратил время, чтобы найти это. Выводил страницу по чуть-чтуь, по строке. Озадачился вопросом - где найти консоль сервера PHP на хостинге. Начал искать по helpу на хостинге. В общем, есть раздел Логи в личном кабинете, и там можно включить все:


Из логов я обственно и понял, что PHP содержит ошибки, и я их исправил. Ошибок на самом деле было две.
Ошибка №8:
Не нравится аттрибут строчки $pdo = new PDO($dsn, $user, $password,[PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]);
Я в общем уже сразу сообразил, что в PDO есть нечто, что понимает только сервер PHP 7, а PHP5.5 не понимает. В данной конкретной ошибке он не понимал почему там вдруг встречается квадратная скобка.
Из помощиa> я понял, что переключить версию PHP на серваке гораздо проще, чем я полагал


Смена версий - злобная ошибка пропала.
Ошибка №9:
SQLSTATE[28000] [1045] Access denied for user ‘timmartynov‘@‘vh78.timeweb.ru‘ (using password: YES)
Ну опять-таки внимательно прочитав хелп хостинга я понял, что ошибка была тут:
- Имя пользователя: совпадает с названием базы данных.
Переименовав имя пользователя в запросе, ошибка пропала. Какая ошибка будет следующей?
АААААААААААААААААААААААААААААААААААААААААААААААА ААААААААААААААААААААААААААААААААААААААААААААААААААААА АААААААААААААААААААААААААААААААААААААААААААААААААААА яя СДЕЛАЛ ЭТО!!!!!!!!!!!!
Нет ошибки! Содержимое базы вывелось в виде ленты постов!!!!
23.07.2017 11:45
ПЕРВЫЙ РАЗ ВСЯ ГЛАВНАЯ СТРАНИЦА ЗАГРУЗИЛАСЬ ИЗ БАЗЫ!
Я БОГ PHP SQL МАТЬ МЕНЯ!

Перенос локальной базы данных MySQL на сервер (HeidiSQL)

2017-07-23 15:44:07
Сразу скажу, что я пока не нашел нормального способа это сделать, и сделал все через жопу.
В теории как-то можно сохранить дамп на локалке, загрузить его на сервак и там восстановить. Если две базы на серваке то вроде можно использовать такой код:
mysqldump -u user -p password db1 | mysql -u user -p password db2

Но нам не подходит. Чо делать?
Я откопал в HeidiSQL экспорт. Экспортнул файлик в .sql файл. Однако при попытке его импортировать через phpmyadmin на хостинге получил ошибку №4:


Дальше я тупо удаляю таблицу из БД на хостинге и хочу создать такую же как и на локале при помощи SQL команд, которые создали локальную таблицу. Вставляю в форму "Запрос" в Heidi код, нажимаю "Выполнить" и получаем такую ошибку №5:



Короче в одном месте работает а в другом нет. Наверное сервер SQL у локалки и хостинга разный. Я меняю значение CURRENT_TIMESTAMP на NULL и теперь аналогичная пустая табличка создается. Потом я сохранил код таблицы в файл .sql:


Нажал кнопку "Выполнить" и таким образом при помощи тупого CTRL+C/CTRL+V SQL-запросов таблица из локальной БД перекочевала на хостинг. В общем, все таки кое-как перенес:


Заодно чуть лучше понял как устроен SQL)) Думаю дальше книжку по PHP/SQL будет читать несколько понятнее.

Перенос содержания HTML в локальную базу MySQL

2017-07-23 14:53:33
Итак, прежде чем все заработало (а я забежал немного вперед), я еще раз 250 наступил на грабли и я расскажу об этом по порядку.
Что мне надо было сделать?
* Построить главную страницу по содержанию, которое php-код вытаскивает из БД
* для этого надо по очереди для всех строк базы вывести post_id, post_date и post_text
* для этого надо чтобы на серваке была моя база с написанными постами
* а для этого, мне надо занести посты/заголовки из html в локальную БД

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


Ошибка №1
(решил с этого момента нумеровать ошибки): заголовок почему-то не выводится.
Упростил запрос, исполнил - понял, что для вывода и заголовка и текста их надо в фигурные скобки поставить))

Выводить данные заголовка и поста мы научились.
Но сначала надо все содержание перенести с локалки на сервак. Используя форму localhost/mozgopost.php я начал вставлять данные из html в локальную базу.
Ошибка №2
Когда я копировал один из заголовков в форму, оказалось, что он длиннее 40 символов и сервер выдал:
SQLSTATE[22001]: String data, right truncated: 1406 Data too long for column ‘post_header ‘ at row 1

Поправил тип данных столбца post_header базы данных с varchar(50) на varchar(100) и ошибка пропала. Надо потом вставить проверку длины вводимых сообщений с уведомлением пользователю об ошибке
Все посты вставились нормально, а последний выдал ошибку №3:
SQLSTATE[HY093]: Invalid parameter number: mixed named and positional parameters

Мол, Перепутаны именованные параметры и позиционные параметры. Может это потому что какие-то спецсимволы передаются через запрос? Сокращение текста до 1 слова привело к тому, чот пост отправился в базу. Сначала я подумал, что раскусил причину! Типа в тексте встречается имя самого заголовка столбца post_text и post_header, и думал, что это из-за использования ключевых слов SQL в передаваемом запросе. Наверное около получаса возился, пока не понял, что причина в содержащейся в тексте кавычке ‘. Ты передаешь вложенное в эти кавычки ее через "SQL почту", а внутри сообщения встречается такая кавычка и SQL сервер думает что сообщение закончилось а все остальное - это команды "почтальону".

Первый пост, полностью написанный в броузере

2017-07-23 13:59:35
В ЭТО ТРУДНО ПОВЕРИТЬ, НО ЭТО МОЙ ПЕРВЫЙ ТЕКСТ, НАПИСАННЫЙ ЧЕРЕЗ ФОРМУ БРОУЗЕРА. ТЕКСТ ОТПРАВЛЯЕТСЯ В БАЗУ MYSQL ПОСЛЕ ЧЕГО ВЫВОДИТСЯ НА ГЛАВНУЮ СТРАНИЦУ САЙТА СВЕРХУ

Подключение PHP к MySQL наконец состоялось!

2017-07-22 19:21:03
Кажется я понял, что знать PHP и не знать SQL не получится) Т.к. PHP - это все лишь способ доставки в SQL-сервер соответствующего SQL запроса. PHP - это почтальон, а содержимое письма - это SQL.

Итак, я сделал HTML форму при помощи 2 тегов input и 1 textarea. HTML ожидает ввода заголовка, текста, и нажатия кнопки submit. Задача - сделать обработчик PHP, который собирает эти поля и передает их базу MySQL.

Вопросы на которые не было ответа:
??? при обращении к базе данных, heidi как-то реагирует? Можно посмотреть в нем запросы выполненные из php?
??? можно ли из хейди просмотреть содержание таблицы?
??? как сделать чтобы такой код не отправлял в http адрес строку: "http://localhost/addpost.php?post_header=заголовок12...."


Ответ на последний вопрос нашелся быстро - в тег form надо вписать method="POST"
Дальше я пытался обратиться из PHP к базе MySQL следующей командой, которую взял из книги:
$query="INSERT INTO posts (post_header, post_text, post_date) VALUES (:header, :text, NOW())";
, где header и post - названия тех полей, которые я получаю при отправке формы.
Данная запись вызывала неисправимую ошибку:
SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens
Кстати говоря, в строке запроса можно и не указывать куда именно ты хочешь вставить posts (post_header, post_text, post_date), но прогер рекомендовал указывать, т.к. число полей в базе может измениться и тогда если ты н указываешь куда конкретно ты хочешь сделать запрос, такая сокращенная запись выдаст ошибку.
Далее, я попытался упростить запрос и заменить переменные, к-е я пытаюсь передать в базу, на просто значения
Окей, сделал, что-то вроде бы передалось. А как проверить? В Heidi непонятно как просматривать содержимое базы. Решил вывести на экран, написав микро-код show.php
Для этого переписал из книжки вот такой код:

Естественно с первого раза ничего не бывает. Опять ошибка!
30 минут потратил только на то, чтобы наконец найти что в выражении query($query) надо использовать круглые скобки, а не квадратные
. Ок, поправил. Какая ошибка следующая?
“Fatal error: Uncaught PDOException: SQLSTATE[42S02]: Base table or view not found: 1146 Table ‘m1.m1‘ doesn‘t exist in F:PHP2show.php:4”
Это еще что такое?? В общем вроде все по учебнику, а ошибка. Еше минут 30 соображал (ну тугодум я!), что у меня m1 это название базы а не название таблицы. Ок.
Следующая ошибка? Есть у меня строка:
echo "новая строка: = ".$mmm[‘name‘];
Ошибка: Notice: Undefined index: name in F:PHP2show.php on line 8
Ну тут надо было имя name соответственно изменить на имя заголовка таблицы. Это я быстро сообразил
Далее запуск show.php наконец вывел одну единственную запись, которая была в таблице. Кайф! Значит в базу-таки что-то записалось.
Теперь надо понять, как отправить в базу не фиксированные строки, а переменные, получаемые с формы. Еще минут 20 мучений и синтаксис был найден:


4 часа прошло!
Короче вывод в формате VALUES (:header, :text, NOW()) не получился, а получился так:
$header=$_POST[‘header‘];
$text=$_POST[‘text‘];
$query="INSERT INTO posts (post_header, post_text, post_date) VALUES (‘$header‘,‘$text‘, NOW())";

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


Что будем делать дальше?
Теперь надо подумать, как засунуть содержание этого сайта в базу данных.

Uncaught Error: Call to a member function query()

2017-07-22 18:38:02
Супер! Наконец-то мой PHP научился видеть базу данных. Теперь можно ее протестить, отправив из PHP ей SQL-запросик, например: "расскажи какая у тебя версия". Подключение к БД вынесли в отдельный поключаемый файлик connect.php и пишем следующий код.
Как вы поняли, ничего не бывает просто в первый раз в программировании. Грабли-грабли-грабли. На сей раз странная ошибка:
Uncaught Error: Call to a member function query()
Примерно минут 40-50 я пытался понять в чем дело. Материл авторов книги на чем свет стоит. Гуглил ошибку. Вводил код по строкам. Терзал Вову. А потом как-то бах, и самого внезапно осенило, что чето не то с объектом $pdo. Залез в connect.php, и оказалось что он у меня называется там не $pdo а $dbc, как в одном из примеров, что я брал из сети. В результате получили:


Завтра буду делать форму, которая будет впервые в моей истории пытаться отправить содержимое в базу.

PDO: could not find driver

2017-07-22 18:37:25
Муторная возьня с подключением PHP к локальному MySQL продолжается. Сформулирую проблему. Я пытаюсь запустить подключение к базе при помощи следующего кода. На локальном компьютере не могу подключить, выходит ошибка
could not find driver
SQL сервер на локалке я вчера все-таки запустил. Клиенты HeidiSQL или Workbench его видят и подключаются к нему.
Мой код, загруженный на хостинг, подключается к базе. А локалка - нет.
Вова подсказал, что не подрубается PDO driver, заодно поинтересовавшись, на кой я вообще использую pdo а не mysqli... Блин, да потому что в книге так написано!!!!

Сделал info.php который выводит инфу о сервере. Оказалось, что на локалке в разделе PDO в строке drivers ниче нет:


Оказывается, установить PHP недостаточно.
НАДО ЕГО ЕЩЕ И НАСТРАИВАТЬ.

Прошло где-то часа два, как сел за PHP с этой проблемой. Меня уже разрывает. Я теперь понял, зачем держат сисадминов и платят им зарплату.
Откопал инструкцию по установке драйвера PDO.
Оказалось, что для того, чтобы врубить драйвер, надо было залезть в php.ini и "освободить" строчку "extension=php_pdo_mysql.dll", убрав перед ней ";".

В рот мне ноги! Но и этого оказалось недостаточно! Еще минут 15 поисков и я понял, что PHP ищет драйвер по адресу C:/PHP, - это я прочел в консоли, из которой я запсукаю PHP. А у меня то PHP лежит на диске F. Поправил снова php.ini, вписав строчку "extension_dir=f:/php/ext. Далее перезапуск PHP сервера в консоли и... info.php увидел PDO драйвер:

АЛИЛУЙЯ! Сообщение "could not find driver" исчезло из файла "testim-bazu.php"

ОРГАЗМ.

Установка сервера MySQL на локальную машину

2017-07-22 18:36:41
Итак, я кажется начинаю понимать, почему помимо программиста нужен еще сисадмин. Возня с сервером, с сервером базы данных - это просто какой-то дремучий лес, требующий целого космоса компетенций.
К чему я пришел на данный момент?

Вроде как подключаться с локалки к удаленной базе данных сервера нецелесообразно.
Вместо этого надо установить у себя на домашнем компе сервер MySQL. Инструкцию я нашел тут
Сервер MySQL на хостинге уже установлен и настроен провайдером
Далее запускаешь клиент на локальном компе, вроде HeidiSQL или тот же Workbench.
В клиенте надо создать 2 соединения: localhost, с локальным сервером MySQL и удаленное с MySQL на хостинге.
А дальше перетаскиваешь базу туда-сюда. А серверную БД надо периодически бэкапить.
Как это делать я пока не знаю.

Не могу подключить PHP к удаленной базе данных MySQL

2017-07-22 18:35:44
Еще ~2 часа хождения по граблям. Итак, что мы имели на начало дня сегодня?
Запущенный на моем домашнем компе PHP7 сервер
Виртуальный хостинг от timeweb с созданной на нем бд MySQL
У меня есть ip сервера, username и database name - этого всего должо было хватить для подключения из PHP.

Сначала я прогуглил фразу примерно как в заголовке. Нашел пример кода, который для соединения использовал функцию mysqli_connect(). Однако запуск такого кода выдал ошибку:
Fatal error: Uncaught Error: Call to undefined function mysqli_connect() in F:PHP2 estim-bazu.php:21
Погуглив ошибку, понял, что в PHP7 эта функция была упразднена. Теперь модно использовать объект:
PDO::__construct ( string dsn [, string username [, string password [, array driver_options]]] )
Использовал этот код. Вот что получилось

Ошибок нет, но к БД нет подключения:
Подключение не удалось: could not find driver

Что я дальше делал?
В панели хостинга прописал новую точку доступа к базе данных - ip своего компьютера. F5. Не помогло.
Почитал help Подключение к бд на сайте хостера. Поменял имя в запросе. F5. Не помогло.
Загрузил файл на хост и запустил оттуда: http://mozgovik.com/testim-bazu.php. F5. Ошибка пропала.

В результате небольшой консультации с Вовой программистом выяснилось, что
для того, чтобы с локали подключиться к удаленной базе MySQL, надо поставить себе на компьютер драйвер базы данных.
За этим делом я был отправлен по адресу: https://dev.mysql.com/downloads/installer/. Попытка установить это привела к тому, что я вдруг выяснил, что ставил эту штуку себе на комп несколько дней назад, но так и не понял, что с ней делать. Теперь стало понятно. PHP на локалке как-то соединяется с этой прогой, а прога соединяетя с удаленной БД.
В программе MySQL Workbench можно установить соединение с базой. Насколько я понял, это программа-клиент - аналог phpmyadmin при помощи которого я собственно и создал свою БД.

На страничке Client Connections почему-то написано, что

There is no connection to the MySQL Server
The account you are using does not have sufficient privileges to view the client connections.



Какие сейчас есть вопросы?
?? Что надо сделать в клиенте MySQL Workbench, чтобы я все таки мог с локальном PHP использовать удаленную БД??
?? Если не подключаться с локального PHP к рабочей базе на сервере, то как ее запустить теперь на своем компе?
Вова говорит, что
ну ок. в YUI есть такая хуета - миграции. вообщем все просто - ты проектируешь базу. в Heidi есть вкладки типа create - там прям код создания таблицы - ебашишь и таблица поднялась. Если правишь таблицу с данными - там в Heidi он ебашит запросы которые отработали - ты потом когда все надрочишь - хуячишь их на живую базу предварительно забакупив и получаешь такой же структуры базу...

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

хейди просто клиент графический. он юзает клиент mysql который юзает сервер... ну чтобы в пхп май админ не дрочиться. для виндузятников удобнее иногда. особенно когда базы в разных местах и их много
для пхп май админа надо поднимать пхп, апач и т.п. а для хейди ничего не надо.
Кажется, мне нужен переводчик. Ситуация, казавшаяся уже понятной, становится совершенно непонятной.
Единственное что я сейчас могу, чтобы работать с базой - грузить любую рабочую php программу прямо на сервер и смотреть что он будет делать с базой.
12345