Популярные вопросы по MySQL и ответы на них. FAQ MySQL, PHP

Содержание

Популярные вопросы по MySQL и ответы на них. FAQ: MySQL, PHP

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

Общие вопросы:
Q. Что такое MySQL?
MySQL – сервер баз данных. MySQL характеризуется большой скоростью, устойчивостью и легкостью в использовании, является идеальным решением для малых и средних приложений.

Q. Где можно взять MySQL?
На официальном сайте http://www.mysql.com или на http://www.mysql.ru в разделе Download. Рекомендуем брать с сервера последнюю стабильную версию.

Q. Хочу изучать MySQL. С чего начать?
Советуем начать изучение с раздела документация. Из нее вы не только узнаете начальные сведения, но, и самое главное, освоите правильные приемы работы.

Q. Что такое PHP?
PHP – это скрипт-язык (scripting language), который интерпретируется и выполняется на сервере.

Q. Что такое Perl?
Perl — это аббревиатура, расшифровывающаяся как Practical Extraction and Report Language (практический язык извлечений и отчетов).

Технические вопросы:
Q. Как увеличить производительность выполнения mysqldump?
При дампе очень больших таблиц mysqldump пытается использовать очень большой объем ОЗУ.
Чтобы он этого не делал нужно использовать опцию «-q».

Q. Как определить и исправить повреждение MySQL базы?
Для тестирования повреждений рекомендуется выполнять: myisamchk tables[.MYI]
Параметры уровня проверки:
—medium-check — средний
—extend-check — расширенный

В crontab:
35 0 * * 0 /usr/local/mysql/bin/myisamchk —fast —silent /path/to/datadir/*/*.MYI
Внимание, myisamchk нужно запускать при _не_ запущенном mysqld, иначе нужно использовать утилиту mysqlcheck (mysqlcheck —repair —analyze —optimize —all-databases —auto-repair)

Восстановление таблицы:
REPAIR TABLE tbl_name или myisamchk -r table_name или myisamchk —safe-recover table_name

Q. Как произвести оптимизацию хранилища в MySQL?
Почистить «дырки» (дефрагментация), обновить статистику и отсортировать индексы:
OPTIMIZE TABLE имя_таблицы;
или использовать: myisamchk —quick —check-only-changed —sort-index —analyze
Внимание, myisamchk нужно запускать при _не_ запущенном mysqld, иначе нужно использовать утилиту mysqlcheck
(mysqlcheck —repair —analyze —optimize —all-databases —auto-repair)

Апдейт статистики оптимизатора:
ANALYZE TABLE имя_таблицы;
или использовать: myisamchk —analyze

Рекомендуется регулярно выполнять:
isamchk -r —silent —sort-index -O sort_buffer_size=16M db_dir/*.ISM
myisamchk -r —silent —sort-index -O sort_buffer_size=16M db_dir/*.MYI

Q. Как бэкапить данные в MySQL?
Бэкап структуры:
mysqldump —all —add-drop-table [—all-databases] —force [—no-data] [-c] —password=password —user=user [база] [таблицы] > backup_file
( -c — формировать в виде полных INSERT. —all-databases — бэкап всех баз, —no-data — бэкап только структуры таблиц в базах, [таблицы] — бэкапить только указанные таблицы.)

Q. Как обеспечить корректную работу MySQL с русскими символами при сортировке и выборке данных?
В /etc/my.cnf вписать в блоке [mysqld]: default-character-set=koi8_ru (или cp1251)

При работе с базой можно выставить рабочую кодировку через: SET CHARACTER SET koi8_ru

Q. Как добавить нового пользователя или БД в MySQL?
use mysql;
insert into user (host,user,password) values (‘localhost’, ‘пользователь’, password(‘пароль’));

insert into db (Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv,Create_priv, Drop_priv,Grant_priv,References_priv,Index_priv,Alter_priv) values (‘localhost’,’БД’,’пользователь’,’Y’,’Y’,’Y’,’Y’,’Y’,’Y’,’Y’,’Y’,’Y’,’Y’);
flush privileges;

или воспользоваться скриптом mysql_setpermission

Q. Как изменить забытый MySQL административный пароль?
1. перезапустить mysqld с опцией —skip-grant-tables
2. mysqladmin -h хост -u пользователь password ‘новый пароль’

Q. Как работать с базой данных MySQL из Access?
Необходимо скачать MyODBC и установить, после этого в Access в базе данных — «создать / связь с таблицами» — тип файлов указываем ODBC . Для обновления таблиц удобно пользоваться служебной утилитой Access2000 «Сервис / Служебные программы / Диспетчер связанных таблиц».

Q. Как сделать таблицу Excel из таблицы MySQL?
#!/usr/local/bin/perl
use DBI;
$table = «table»; $db = «base»; $db_serv = «192.168.0.1»; $user = «user»; $passwd = «password»;
$c = DBI->connect(«DBI:mysql:$db:$db_serv», $user, $passwd);
$statement = «select count(*) from $table»;
$cc = $c->prepare($statement);
$ccc = $cc->execute;
@row = $cc->fetchrow_array;
$n = $row[0];
$statement = «select * from $table»;
$cc = $c->prepare($statement);
$ccc = $cc->execute;
open F, «$ARGV[0]»;
for ($i=0; $i fetchrow_array;
print F «$row[0];$row[1];$row[3]\n»;
>

Запускаем скрипт:
./mysql_2_exel.pl file
После этого можно открыть файл ‘file’ экселем.

Q. Как поместить время в формате Epoch в MySQL?
from_unixtime(989493919)

Q. Как ограничить число элементов выдаваемых SELECT в MySQL?
Необходимо воспользоваться LIMIT. Первый параметр с какой записи, а второй сколько.
select * from table LIMIT 1,1;

Q. Как использовать базу данных MySQL в своей программе? (под Windows)
Подключите к проекту libMySql.lib, положите заголовочные файлы из поставки MySQL в директорию заголовочных файлов вашего компилятора, либо в каталог с программой, либо вообще куда душе угодно (лишь бы сами их не потеряли), libmysql.dll в каталог с программой, и пользуетесь функциями API MySQL, которые подробнейшим образом описаны в поставляемой вместе с сервером документацией. libmysql.lib и libmysql.dll берутся после установки дистрибутива MySQL в каталоге lib\opt.
libmysql.lib ОБЯЗАТЕЛЬНО должен работать с libmysql.dll ТОЙ ЖЕ поставки/версии. По этой причине НАСТОЯТЕЛЬНО НЕ рекомендуется хранить libmysql.dll в системном каталоге WINDOWS! Храните свою libmysql.dll в каталоге со своей программой.
Для C++ Builder получить libmysql.lib нужно импортом из libmysql.dll:
> implib libmysql.lib libmysql.dll

Из заголовочных файлов требуются:
mysql.h
mysql_com.h
mysql_version.h
В последних версиях ещё и my_alloc.h
Всё это добро берётся после установки дистрибутива MySQL в каталоге include.

Из всех в программе подключается только mysql.h. Перед ним обязательно должно быть подключен windows.h
#include
#include

Особенности Билдеровского VCL: В программах, использующих VCL, компилятор ругается на my_socket, объявленную в mysql.h как #define my_socket SOCKET. Заменяем на #define my_socket UINT_PTR и всё работает. (SOCKET в winsock.h объявлен как typedef UINT_PTR SOCKET).

Q. Как разрешить пользователю доступ к базе данных?
GRANT ALL PRIVILEGES ON *.* TO usernameS@hostname IDENTIFIED BY ‘userpassword’ WITH ALL PRIVILEGES;

Q. Как запретить пользователю операции с базой данных?
Revoke ALL PRIVILEGES on *.* from usernameS@hostname;

Q. Как получить случайный ряд из таблицы MySQL?
SELECT * FROM table ORDER BY RAND() LIMIT 1;

Q. Как выполнить поиск по регулярному выражению?
Вот например так Данный запрос выведет все записи в которых ключевое поле это степень десяти. Обратите внимание на то что регулярное выражение не имеет ограничителей !

Q. Почему при построении запроса с * ничего не выводится?
В документации по языку четко написано правило построения запроса:
mysql_query(«SELECT * FROM Files WHERE FielName LIKE ‘%строка*%'»);

Организационные вопросы:
Q. Не могли бы Вы мне выслать документацию в электронном варианте?
К сожалению нет, мы не высылаем документацию, вы можете ознакомиться с ней на сайте.

Q. У меня возникли вопросы относительно MySQL, на какой e-mail или где их можно задать?
Вы можете задать все вопросы в разделе Форум (Webboard).

Q. Мне нужно разработать софт с использованием MySQL, сам я не программист, не могли бы Вы помочь написать?
К сожалению, нет, Вы можете обратиться по вопросам разработки программного обеспечения в компанию INSIDE — www: www.inside.ru, e-mail: info@inside.ru

Q. Есть к Вам предложение! У меня есть желание сделать на mysql.ru новый раздел и им заниматься (написать статьи разместив их на сайте mysql.ru, и.т.д.), возможно ли это?
Да, конечно, вы можете написать нам.

Q. Я хотел бы допополнить данный раздел своим FAQ. Возможно?
Конечно, присылайте!

MySQL запросы — как единственно верный способ вывода данных

Как только человек начинает работать с множеством данных, возникает необходимость их каким-либо образом упорядочивать и архивировать, поэтому рано, или поздно приходит мысль о создании такого виртуального архива, как база данных, в которой и будет храниться вся необходимая информация. Тогда можно прибегнуть, к примеру, к такой программе, как Microsoft Access .

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

MySQL представляет собой наиболее популярную и распространенную СУБД для сети интернет. Данная СУБД не предназначена для того, чтобы работать с большим количеством информации, но ее возможности позволяют справляться со всеми задачами, необходимыми для работы интернет сайтов как скромных, так и ресурсов приличных размеров.

Чтобы обращаться и собственно работать с БД MySQL существуют определенные команды, которые обычно обозначают как запросы MySQL . Именно с помощью запросов можно выполнять такие манипуляции с базой как удаление, сортировка, изменение, добавление, получение и т.д.

Какими бывают MySQL запросы?

Все существующие команды MySQL можно разделить на простые или легкие для понимания и запоминания и сложные запросы.

Простые запросы MySQL — это команды, для исполнения которых достаточно одной таблицы, так как они производят манипуляции только с одной таблицей из базы.

Сложные запросы MySQL — это команды, которые могут затрагивать одновременно две или даже больше таблиц из одной базы данных.

Чтобы более детально разобраться, в чем же заключается различия между запросами — давайте рассмотрим каждый вид команд по отдельности.

Простые MySQL запросы

Существует два запроса, которые можно назвать максимально или супер простыми.
« Show databases; » — данный запрос выведет на экран список всех имеющихся баз данных.

« Show tables in bd; » — данная команда позволит узнать количество и наименования всех таблиц, которые есть в базе данных под названием bd .

Ну а теперь от супер простых запросов перейдем просто к простым.

Запросы MySQL типа Select

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

« SELECT count(*) FROM cart; » — данный запрос позволит узнать, сколько записей содержится в упомянутой таблице:

Запрос « SELECT * FROM cart; » — позволит просмотреть все данные, которые имеются в таблице cart из базы данных:

« SELECT * FROM cart LIMIT 2,3; » — с помощью данного запроса можно выбрать блок данных и вывести его. В данном случае выбраны 3 записи на вывод, начиная со второй строчки. Такой запрос может быть очень полезен для создания блоков со страницами для навигации:

Илон Маск рекомендует:  Cnsearch использование meta тегов robots

« SELECT * FROM people ORDER BY number; » — данная команда позволит вывести все поля таблицы под названием people в соответствии с полем number в порядке увеличения его значений:

« SELECT * FROM people ORDER BY number DESC; » — данный запрос позволяет выбрать все строки той же таблицы people , только упорядоченные не так как в предыдущем примере, а по убыванию:

« SELECT * FROM people ORDER BY number LIMIT 5; » — этот запрос выбирает из таблицы people только 5 строк, которые располагаются в соответствии с увеличением значения поля number :

« SELECT * FROM people WHERE name=’Anna’; » — данный запрос делает выборку полей таблицы people , в которых в роли значения поля name указана переменная Anna :

« SELECT * FROM people WHERE name LIKE ‘An% ‘;» — выводит только те поля таблицы people , в которых в полях под названием name начинается с букв An :

« SELECT * FROM people WHERE name LIKE ‘%na’ ORDER BY number ;» — запрос выводит данные таблицы people только тогда, когда значение поля name оканчивается буквами na , причем данные выводятся упорядоченными в соответствии с увеличением значения поля number :

« SELECT name, last_name FROM people; » — выводит на экран только данные таблицы people заключенные в полях last_name и name :

« SELECT DISTINCT site FROM cart; » — команда выводит только не повторяющиеся значения поля site из таблицы cart . К примеру, если таблица будет содержать только три значения sit.ru, sit.ru, wi-de.ru , то после работы данной команды будет выведено только два значения — sit.ru и wi-de.ru :

« SELECT * from people where age in (12,15,18); » — данный запрос выведет на экран только те данные из таблицы people , у которых в качестве значения поля под названием age будут указаны цифры 12, 15 или 18:

Запросы MySQL типа Insert

Данные виды запросов к базе данных позволяют вставить необходимую информацию в таблицу. То есть, посредством команд insert можно вставить в таблицу строку, добавив тем самым информацию к базе данных.

« INSERT into cart (sit, des) values (‘sit.ru’, ‘Sit-разработка сайтов’) » — данный запрос позволит вставить в таблицу базы под названием cart еще одну строку, у которой в поле sit будет значение sit.ru а в поле des значение Sit -разработка сайтов.

Запросы MySQL типа Update

Данный вид запросов занимается изменением данных уже имеющихся в базе.

« UPDATE cart set sit = ‘do.com’ where >» — запрос изменит значение, записанное в поле sit таблицы cart , в строке, номер id которой равен 3, на значение do.com .

Запросы MySQL типа Delete

Запросы данного типа позволяют производить удаление записей таблицы, являющейся частью базы данных.

« DELETE from cart where >» — данной командой удаляется вся информация из строки, id которой соответствует 3 в таблице cart .

Сложные запросы MySQL

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

« SELECT DISTINCT name FROM people, address WHERE people.adress_no = ads.addr_no AND city LIKE ‘L%’; » — запрос сортирует и выводит все уникальные значения, записанные в поле name таблицы people , которые проживают по адресу с названием, начинающимся на букву L в соответствии со значением поля addr_no из таблицы баз под названием ads .

Данный запрос иначе может быть введен так:
« SELECT DISTINCT name FROM people p, ads a WHERE p.adress_no = a.addr_no AND city LIKE ‘L%’; ».

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

« SELECT her.char_name, her.cnt, char_temp. >» — Данный запрос позволяет вывести на экран данные из полей char_name , и cnt таблицы базы под названием her и поля ClassName из таблицы char_temp благодаря тому, что значения полей ClassId таблицы char_temp и class_id таблицы her имеют одинаковые идентификаторы. Данные выводятся в упорядоченном виде по полю ClassName таблицы char_temp .

В сокращенном виде данная команда будет выглядеть так: « SELECT char_name, cnt, >».

Если суть построения команд для вас стала понятной, то вы без труда сможете составлять сложные запросы, используя не только команду SELECT , но и команды UPDATE, DELETE, INSERT и другие.

Вложенные запросы MySQL

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

Именно для того, чтобы избежать таких проблем MySQL делает возможным включение одного запроса в состав другого. Такие двойные запросы называются вложенные запросы или подчиненные. В подобных запросах оператор SELECT , который располагается внутри запроса, заключается в круглые скобки.

Сначала выполняется запрос, который располагается в скобках, а затем с теми данными, которые этот запрос предоставил, работает главный запрос.

Рассмотрим на примере. Допустим, в нашей базе данных есть две таблицы. Первая таблица под названием Cat :

И вторая таблица под названием STR :

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

Выглядеть данный запрос будет следующим образом: « SELECT (SELECT COUNT(*) FROM `STR` WHERE STR.category_ >».

Первым будет выполняться запрос в скобках ( SELECT COUNT(*) FROM ` STR ` WHERE STR.category_ >), который предоставит информацию обо всех категориях, а в нем уже сделаем выборку для того, чтобы вычислить количество страниц, предназначенных для указанных категорий, посредством запроса « SELECT (*) as `count`, cat.name FROM cat ».

Быстрота вывода результатов запроса

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

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

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

PHP и MySQL

СУБД MySQL — это одна из множества баз данных, поддерживаемая языком программирования PHP . Запросы к MySQL во время создания веб-страниц это обычное дело, потому что основная информация как раз таки и хранится в таблицах базы данных и чтобы вывести ее на экран, необходимы PHP запросы к MySQL .

Для того чтобы работать с MySQL в документах PHP предусмотрен специализированный алгоритм действий:

  • Установка соединения с базой данных при помощи команды mysql_connect();
  • Выбор необходимой базы данных командой mysql_select_db();
  • PHP запросы к MySQL через команду mysql_query();
  • Обработка результата запроса mysql_fetch_array();
  • Закрытие соединения с базой данных или отключение от сервера БД mysql_close();

Из всего описанного можно понять, что работать с базами MySQL не так то и сложно, главное — суметь понять и правильно строить запросы к нужной информации.

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

Вопросы по MySQL

Как увеличить производительность выполнения mysqldump?

При дампе очень больших таблиц mysqldump пытается использовать очень большой объем ОЗУ.Чтобы он этого не делал нужно использовать опцию «-q».

Как определить и исправить повреждение MySQL базы?

Для тестирования повреждений рекомендуется выполнять: myisamchk tables[.MYI]Параметры уровня проверки:—medium-check — средний—extend-check — расширенный
В crontab:35 0 * * 0 /usr/local/mysql/bin/myisamchk —fast —silent /path/to/datadir/*/*.MYI Внимание, myisamchk нужно запускать при _не_ запущенном mysqld, иначе нужно использовать утилиту mysqlcheck (mysqlcheck —repair —analyze —optimize —all-databases —auto-repair)
Восстановление таблицы:REPAIR TABLE tbl_name или myisamchk -r table_name или myisamchk —safe-recover table_name

Как произвести оптимизацию хранилища в MySQL?

Почистить «дырки» (дефрагментация), обновить статистику и отсортировать индексы:OPTIMIZE TABLE имя_таблицы;или использовать: myisamchk —quick —check-only-changed —sort-index —analyzeВнимание, myisamchk нужно запускать при _не_ запущенном mysqld, иначе нужно использовать утилиту mysqlcheck (mysqlcheck —repair —analyze —optimize —all-databases —auto-repair)
Апдейт статистики оптимизатора:ANALYZE TABLE имя_таблицы;или использовать: myisamchk —analyze
Рекомендуется регулярно выполнять:isamchk -r —silent —sort-index -O sort_buffer_size=16M db_dir/*.ISMmyisamchk -r —silent —sort-index -O sort_buffer_size=16M db_dir/*.MYI

Как бэкапить данные в MySQL?

Бэкап структуры:mysqldump —all —add-drop-table [—all-databases] —force [—no-data] [-c] —password=password —user=user [база] [таблицы] > backup_file( -c — формировать в виде полных INSERT. —all-databases — бэкап всех баз, —no-data — бэкап только структуры таблиц в базах, [таблицы] — бэкапить только указанные таблицы.)
Восстановление: mysql )

Как обеспечить корректную работу MySQL с русскими символами при сортировке и выборке данных?

В /etc/my.cnf вписать в блоке [mysqld]: default-character-set=koi8_ru (или cp1251)
При работе с базой можно выставить рабочую кодировку через: SET CHARACTER SET koi8_ru

Как добавить нового пользователя или БД в MySQL?

use mysql;insert into user (host,user,password) values (‘localhost’, ‘пользователь’, password(‘пароль’));
insert into db (Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv,Create_priv, Drop_priv,Grant_priv,References_priv,Index_priv,Alter_priv) values (‘localhost’,’БД’,’пользователь’,’Y’,’Y’,’Y’,’Y’,’Y’,’Y’,’Y’,’Y’,’Y’,’Y’); flush privileges;
или воспользоваться скриптом mysql_setpermission

Как изменить забытый MySQL административный пароль?

1. перезапустить mysqld с опцией —skip-grant-tables

2. mysqladmin -h хост -u пользователь password ‘новый пароль’

Как работать с базой данных MySQL из Access?

Необходимо скачать MyODBC и установить, после этого в Access в базе данных — «создать / связь с таблицами» — тип файлов указываем ODBC . Для обновления таблиц удобно пользоваться служебной утилитой Access2000 «Сервис / Служебные программы / Диспетчер связанных таблиц».

Как сделать таблицу Excel из таблицы MySQL?

#!/usr/local/bin/perluse DBI;$table = «table»; $db = «base»; $db_serv = «192.168.0.1»; $user = «user»; $passwd = «password»;$c = DBI->connect(«DBI:mysql:$db:$db_serv», $user, $passwd);$statement = «select count(*) from $table»;$cc = $c->prepare($statement);$ccc = $cc->execute;@row = $cc->fetchrow_array;$n = $row[0];$statement = «select * from $table»;$cc = $c->prepare($statement);$ccc = $cc->execute;open F, «$ARGV[0]»;for ($i=0; $i fetchrow_array;print F «$row[0];$row[1];$row[3]n»;>
Запускаем скрипт:./mysql_2_exel.pl fileПосле этого можно открыть файл ‘file’ экселем.

Как поместить время в формате Epoch в MySQL?

Как ограничить число элементов выдаваемых SELECT в MySQL?

Необходимо воспользоваться LIMIT. Первый параметр с какой записи, а второй сколько.select * from table LIMIT 1,1;

Как разрешить пользователю доступ к базе данных?

GRANT ALL PRIVILEGES ON *.* TO usernameS@hostname IDENTIFIED BY ‘userpassword’ WITH ALL PRIVILEGES;

Как запретить пользователю операции с базой данных?

Revoke ALL PRIVILEGES on *.* from usernameS@hostname;

Как получить случайный ряд из таблицы MySQL?

SELECT * FROM table ORDER BY RAND() LIMIT 1;

Как выполнить поиск по регулярному выражению?

Вот например так

mysql> select rec_id from rec where rec_id regexp «^1[0]+$» limit 10;

rec_id
10
100
1000

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

Илон Маск рекомендует:  Что такое код printer_select_font

Форум русскоязычного сообщества Ubuntu

Следите за новостями русскоязычного сообщества Ubuntu в Twitter-ленте @ubuntu_ru_loco

Автор Тема: [Решено] Знаки «?» при выводе информации через php из БД (Прочитано 17357 раз)

0 Пользователей и 2 Гостей просматривают эту тему.

Страница сгенерирована за 0.064 секунд. Запросов: 24.

© 2012 Ubuntu-ru — Русскоязычное сообщество Ubuntu Linux.
© 2012 Canonical Ltd. Ubuntu и Canonical являются зарегистрированными торговыми знаками Canonical Ltd.

Популярные вопросы по MySQL и ответы на них. FAQ: MySQL, PHP

Проанализировав статистику переходов на сайт, я заметил что многие пользователи ищут уроки по MySQL. Поэтому я решил помочь, и открываю новую рубрику на сайте, её название будет MySQL. Хочу сказать вам что переход на БД в программировании открывает новые горизонты. В свое время я полностью изучил работу с файлами и знал все функции вдоль и поперек. Со временем для хранения информации, файлов становиться недостаточно, и зачастую решение какой либо задачи, выливается в танцы с бубном, громоздкий код и конечно потраченное время. В скором времени я опубликую достаточно большую статью по работе с файлами, а сейчас мы сделаем небольшой прыжок вперед и приступим к изучению элементарных функции для работы с MySQL.

Создание БД MySQL

Чтобы создать новую базу данных, нам необходим PhpMyAdmin. Если вы будете тестировать скрипты на локальном сервере, то создание БД не вызовет каких либо проблем. Набрав в адресной строке http://127.0.0.1/phpmyadmin, вы попадает в главное меню управления базами.

Указываете имя базы данных на латинице, в качестве «Сравнения» указываете utf8_unicode_ci и нажимаем кнопку создать. После перезагрузки страницы мы попадаем в нашу базу данных. В скобках указано количество таблиц в базе.

На предыдущем скриншоте мы видим главное меню, в котором мы можем создать таблицу внутри базы данных. Для чего нужна таблица и что это такое? Таблица состоит из полей, вспомните например Microsoft Excel , там все рабочее поле разбито на ячейки. Например вы создаете таблицу, в которой создаете прайс техники

В ней вы указываете имя колонки (товар, описание, цена) и далее забиваете информацию. Очень похожий принцип и у таблиц MySQL. Я специально создал таблицу notebook, и продублировал туда все значения, вот что получилось:

Как вы видите у каждого столбца есть свое описание (id, model, price), они играют очень важную роль. В своих запросах мы будем выбирать нужные данные, удовлетворяющие каким либо условиям.

Повторите мой вариант. Создайте таблицу с именем notebook, введите количество полей 3 и нажмите ОК. После нажатия кнопки, вы попадаете в следующее меню, где необходимо задать имя полей таблицы и выбрать тип данных, которые будут в них содержаться.

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

Первое поле у нас будет носить имя столбца, в качестве первого будет id – идентификатор товара. Он необходим для совершения каких либо действий с этим товаром (редактирование или удаление). Далее указываем Тип. Т.к. идентификатор будет числовой, то тип данных принимает значение INT или INTEGER (ЦЕЛОЕ ЧИСЛО). Далее вводим Длина/значение, указываем 5 (5 это не значит что максимальное количество будет 5, а то что значение будет не более 99999, я думаю этого хватит для начала). Далее идет поле сравнение, в нем необходимо указать в какой кодировке будут храниться данные. Для поля id мы оставляем значение по умолчанию. Атрибуты пропускаем. Далее переходим к полю По умолчанию и ставим значение единицу, это будет означать что первый товар будет начинаться с единицы. Переходим к Дополнительно и выставляем атрибут auto_increment. Это позволяет при добавлении новой записи, автоматически присваивать идентификатор товару, причем не случайным образом, а в порядке возрастания.

Переходим к заполнению поля model. Тип мы выставим VARCHAR. VARCHAR (ПЕРЕМЕННОЕ ЧИСЛО СИМВОЛОВ), этот тип является текстовой строкой и может иметь любую длину до определённого реализацией максимума (обычно 254 символа). Для описания модели нам хватит длины строки в 200 символов, которые мы указываем в поле длина.

Далее переходим к полю price. Здесь тип переменных будет выражен числами, поэтому тип данных устанавливаем INT, и длину значения 5.

Ниже выставляем Тип таблиц – MyISAM, сравнение – utf8_unicode_ci и нажимаем кнопку сохранить. Если все значения были введены правильно то появиться окно, с выполненым запросом, структура таблицы и в левом меню вы увидите вашу новую таблицу notebook.

На этом этап создания таблицы завершен, переходим к программированию.

Подключение к БД MySQL

Чтобы выполнять запросы к базе нам необходимо к ней подключиться и выбрать таблицу . Это достаточно просто и выполняется при помощи 2 стандартных функций.
mysql_connect — Открывает соединение с сервером MySQL

mysql_select_db — Выбирает базу данных MySQL

Функция mysql_select_db вызывается только после функции mysql_connect. Для того чтобы подключиться и выбрать базу test, мы берем второй фрагмент кода. Этот фрагмент мы будем использовать в каждом скрипте, где необходима работа с mysql.

Чтобы создать запись в БД необходимо сформировать запрос, который будет вставлять значения в таблицу. Создаем новый файл в php expert editor‘е, вставляем фрагмент кода приведенный выше, который отвечает за подключение к БД и выбора нужной таблицы.

Давайте разберем то, что мы присвоили переменной $query. Транскрипция запроса выглядит следующим образом:

$query = «INSERT(ВСТАВИТЬ) INTO (КУДА/В) ‘notebook’ VALUES()ЗНАЧЕНИЯ(Значение 1го поля,значение 2го поля,значение 3го поля)»;

Обратите внимание на первое значение в скобках после VALUES. Мы указали тип переменной NULL, это значит что в это поле ничего записываться не будет. Вот так просто мы разобрали с вами запрос, что делать дальше?!

Далее есть функция, которая отвечает за выполнение запроса, и возвращает результат. Это функция
mysql_query — Посылает запрос MySQL

200?’200px’:»+(this.scrollHeight+5)+’px’);»> $result = mysql_query($query);

В нашем случае переменная $result будет содержать результат данного запроса. В конце мы добавим простое условие, которое укажет нам об успешном или неуспешном выполнении запроса.
Итог можете посмотреть при помощи PhpMyAdmin, перейдя в таблицу notebook и нажав вкладку Обзор

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

Для начала сделаем выборку всех ноутбуков с ценниками и выведем их в браузер. Для этого составляем следующий запрос:

десь все достаточно просто:

Т.е. выбираем все столбцы из таблицы ноутбук. Далее осуществляем запрос:

echo «$r[model] — $r[price]
«;

Используем функцию mysql_fetch_array чтобы получить массив значений, ключами которого являются имена столбцов (model и price).При обращении к файлу мы должны получить следующую картину:

Давайте теперь добавим условие, например вывести ноутбуки, цена которых превышает 30 000. Сделать это можно двумя способами. Можно просто внутри цикла while вставить условие

Такое условие будет обрабатывать уже полученные данные из базы, но можно пойти другим путем – создать условие при запросе к базе.

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

FAQ: MySQL

1. Когда я нажимаю в панели управления кнопку «webadmin», окно phpMyAdmin не появляется

Скорее всего ваш браузер блокирует всплывающие окна, поэтому необходимо разрешить браузеру загружать всплывающие окна. Подробнее.

2. При импорте базы данных в phpmyadmin возникает ошибка: #1044 — Access denied for user и т.д.

Проверьте, в самом начале дампа БД не должно быть строчек:
CREATE DATABASE .
use .
и если они есть — удалите их с помощью любого текстового редактора, сохраните файл и попробуйте сделать импорт снова.

3. При работе с mysql/mysqldump из консоли не могу выполнить никаких действий. Ошибка: mysqldump: Got error: 2002: Can’t connect to local MySQL server through socket ‘/var/lib/mysql/mysql.sock’ (2)

При указании хоста используйте не localhost, а 127.0.0.1, пример:
mysqldump -u ЛОГИН_БД -p -h 127.0.0.1 ИМЯ_БД >

либо подключите полный доступ ssh путем смены тарифа или модификацией текущего тарифа (начиная с «Профи»).

4. Импортировал свою БД, а на сайте вместо обычных букв нечитаемые спецсимволы.

Проверьте, что дамп БД выполнен в кодировке utf-8. Подробная информация о решении данной проблемы здесь.

Тема: FAQ на PHP без MySQL

Опции темы
Отображение
  • Линейный вид
  • Комбинированный вид
  • Древовидный вид

Теоретически могу, но отвечая на лично Ваш вопрос — нет, лично я подобной ерундой не занимаюсь.. подобная постановка задачи может быть актуальной когда у Вас миллиарды записей и пользователей и четко-структурированная информация строго ограниченной размерами блоков. А не когда Вы не понимаете преимущества использования реляционных БД и их разницу с файловой системой.

MySQL запросы для начинающих — часть первая

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

Подключение к серверу MySQL и выбор базы данных

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

Подключение из консоли по протоколу SSH:

В данном примере root — это имя пользователя (пользователя с правами на запуск mysql, многие обычно используют суперадмина), а после выполнения вышеприведенной команды вам будет предложено ввести пароль.

Подключение из скрипта PHP:

Вышеуказанными способами мы только подключаемся к серверу, но нужно еще и выбрать базу данных, с которой придется работать. Если у вас несколько баз данных, то можно получить их список и выбрать нужную:

Пример для консоли SSH:

— получаем список всех баз данных:

— выбираем для работы базу данных example_db :

— если понадобится, то можно просмотреть структуру любой таблицы из базы данных example_db , которую вы выбрали для работы, к примеру таблицы clients :

Пример скрипта PHP:

Кстати, используя скрипт PHP также можно получать список всех баз данных на сервере, к которому вы подключаетесь:

Теперь вы знаете, как подключаться к серверу MySQL, выбирать нужную для работы базу данных, и далее можно ознакомиться с наиболее часто используемыми SQL-запросами, которые могут вам пригодиться. В примерах будут показаны запросы к базе данных на PHP, но они также могут использоваться и при работе из консоли по протоколу SSH.

SELECT — базовые запросы

Этот запрос возвращает все записи, поля и их значения из таблицы clients .

В следующем примере выбираются не все данные из таблицы clients , а только те, которые хранятся в столбцах name (имя) и address (адрес) клиентов:

Команда SELECT и виртуальная таблица DUAL

С помощью SELECT можно обращаться к виртуальной таблице DUAL (эта таблица реально НЕ существует в базе данных) и выполнять кое-какие действия, которые не имеют отношения к реальным таблицам. Например вы можете с помощью SQL-запроса произвести какие-то арифметические вычисления:

Скрипт PHP, который выполнит этот запрос и выведет на экран «500» как результат выражения (2+3)*100 :

Этот запрос вернет точное время и дату на сервере MySQL:

Илон Маск рекомендует:  Что такое код dos

Приведенные в этом примере запросы можно выполнять и без указания «FROM DUAL»:

но все же, во избежание проблем и лучшего восприятия, не рекомендую использовать такой «сокращенный» вариант!

WHERE — ограничение по выбору данных

Выбираем всех клиентов, возраст которых больше 30, не равно 30, меньше 30, больше или равно 30 лет:

WHERE — ограничение по совпадению строк

Этот запрос похож на предыдущие запросы, где сравнивались числа, но здесь уже идет сравнение по строкам, и он выбирает всех клиентов, например проживающих в городе «Minsk».

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

Кроме того, в запросах со сравнением по строкам можно использовать и частичное совпадение строк (для подстановки «любых» символов используется знак процента % ). Например здесь будут выбраны все записи таблицы, в которых значение в колонке city будут начинаться с «Novo» (начало названий городов «Novopolotsk», «Novosibirsk» и т.д.):

Следующий запрос выберет все записи из таблицы clients , в которых имена клиентов заканчиваются на «лина» (например «Галина», «Ангелина»):

Ну и наконец выбор всех клиентов, проживающих в городах, названия которых содержат в любом месте подстроку «lug» (например «Kaluga», «Lugansk»)

WHERE — комбинирование условий с применением OR и AND

Для соблюдения нескольких условий при выборе данных из таблицы базы данных в части WHERE применяются конструкции OR и AND .

В данном примере из таблицы clients будут выбраны все клиенты, возраст которых не меньше 25 лет и при этом обязательно проживающие в городе Москва:

Здесь же, в отличие от предыдущего примера, из таблицы clients выбираются строки, в которых есть клиенты, проживающие в одном из двух городов, либо в Moscow , либо в Minsk :


Чтобы не делать из темы «MySQL запросы для начинающих» настоящую длинную «простынь», на этом первая часть обзора завершается.
Другие статьи из этой серии:
Вторая часть
Третья часть
Четвертая часть

Лекции по веб-программированию

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

MySQL — это популярная реляционная клиент-серверная СУБД, используемая в разных приложениях. Стандартным языком управления реляционных баз данных является SQL. SQL означает язык структурированных запросов (Structured Query Language), который MySQL использует для коммуникации с другими программами. Сверх того, MySQL имеет свои собственные расширенные функции SQL для того чтобы обеспечить пользователям дополнительный функционал.

Любая программа на языке PHP, которая собирается работать с MуSQL базой данных, должна состоять из следующих обязательных базовых шагов:
1. Установить связь с MySQL сервером.
2. Выбрать базу данных для работы.
3. Посылать команды MYSQL серверу и получать ответы.
4. Обработать результаты.
5. Закрыть связь с MySQL сервером.

Реализовать эти действия можно несколькими способами:
1. Используя стандартные классические функции обращения к БД MySQL.
2. Используя современные функции из расширения mysqli для версий начиная с PHP 5 и MySQL 4.1.
3. Используя классы и методы из расширения mysqli для версий начиная с PHP 5 и MySQL 4.1.

Рассмотрим на примерах как реализуется доступ к БД MySQL каждым из указанных способов.

Классический доступ к БД MySQL

Современное подключение к БД MySQL

Использование функций из расширения mysqli ускоряет большинство операций доступа к БД, иногда достигая 40-кратного увеличения производительности по сравнению с классическим методом. Также повышена безопасность работы с данными и добавлены новые функции.

Подключение к БД MySQL с использованием классов и методов

Объектно-ориентированный интерфейс предоставляет немного более лаконичный и менее восприимчивый к ошибкам способ подключения к базе данных.

Использование шаблонов запросов при обращении к базе данных

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

Процесс работы с шаблонами таков:

1. Подготовить для сервера MySQL шаблон запроса с параметрами.
2. Привязать переменные PHP к параметрам в заготовке запроса.
3. Дать команду серверу на выполнение запроса.
4. Запросить получение нового ряда данных в указанные переменные.

Работа с MySQL в PHP

PHP поддерживает работу с базой данных MySQL.
Специальные встроенные функции для работы с MySQL позволяют просто и эффективно работать с этой СУБД: выполнять любые запросы, читать и записывать данные, обрабатывать ошибки.
Сценарий, который подключается к БД, выполняет запрос и показывает результат, будет состоять всего из нескольких строк. Для работы с MySQL не надо ничего дополнительно устанавливать и настраивать; всё необходимое уже доступно вместе со стандартной поставкой PHP.

Что такое mysqli?

mysqli (MySQL Improved) — это расширение PHP, которое добавляет в язык полную поддержку баз данных MySQL. Это расширение поддерживает множество возможностей современных версий MySQL.

Как выглядит работа с базой данных

Типичный процесс работы с СУБД в PHP-сценарии состоит из нескольких шагов:

  1. Установить подключение к серверу СУБД, передав необходимые параметры: адрес, логин, пароль.
  2. Убедиться, что подключение прошло успешно: сервер СУБД доступен, логин и пароль верные и так далее.
  3. Сформировать правильный SQL запрос (например, на чтение данных из таблицы).
  4. Убедиться, что запрос был выполнен успешно.
  5. Получить результат от СУБД в виде массива из записей.
  6. Использовать полученные записи в своём сценарии (например, показать их в виде таблицы).

Функция mysqli connect: соединение с MySQL

Перед началом работы с данными внутри MySQL, нужно открыть соединение с сервером СУБД.
В PHP это делается с помощью стандартной функции mysqli_connect() . Функция возвращает результат — ресурс соединения. Данный ресурс используется для всех следующих операций с MySQL.

Но чтобы выполнить соединение с сервером, необходимо знать как минимум три параметра:

Если вы следовали стандартной процедуре установки MySQL или используете OpenServer, то адресом сервера будет localhost , логином — root . При использовании OpenServer пароль для подключения — это пустая строка ‘’, а при самостоятельной установке MySQL пароль ты задавал в одном из шагов мастера установки.

Базовый синтаксис функции mysqli_connect() :

Проверка соединения

Первое, что нужно сделать после соединения с СУБД — это выполнить проверку, что оно было успешным.
Эта проверка нужна, чтобы исключить ошибку при подключении к БД. Неверные параметры подключения, неправильная настройка или высокая нагрузка заставит MySQL отвеграть новые подключения. Все эти ситуации приведут к невозможности соединения, поэтому программист должен проверить успешность подключения к серверу, прежде чем выполнять следующие действия.

Соединение с MySQL устанавливается один раз в сценарии, а затем используется при всех запросах к БД.
Результатом выполнения функции mysqli_connect() будет значение специального типа — ресурс.
Если подключение к MySQL не удалось, то функция mysqli_connect() вместо ресурса вернет логическое значение типа «ложь» — false .
Хорошей практикой будет всегда проверять значение результа выполнения этой функции и сравнивать его с ложью.

Соединение с MySQL и проверка на ошибки:

Функция mysqli_connect_error() просто возвращает текстовое описание последней ошибки MySQL.

Установка кодировки

Первым делом после установки соединения крайне желательно явно задать кодировку, которая будет использоваться при обмене данными с MySQL. Если этого не сделать, то вместо записей со значениями, написанными кириллицой, можно получить последовательность из знаков вопроса: ‘. ’.
Вызови эту функцию сразу после успешной установки соединения: mysqli_set_charset($con, «utf8»);

Выполнение запросов

Установив соединение и определив кодировку мы готовы выполнить свои первые SQL-запросы. Ты уже умеешь составлять корректные SQL команды и выполнять их через консольный или визуальный интерфейс MySQL-клиента.
Те же самые запросы можно отправлять без изменений и из php-сценария. Помогут в этом несколько встроенных функций языка.

Два вида запросов

Следует разделять все SQL-запросы на две группы:

  1. Чтение информации (SELECT).
  2. Модификация (UPDATE, INSERT, DELETE).

При выполнении запросов из среды PHP, запросы из второй группы возвращают только результат их исполнения: успех или ошибку.
Запросы первой группы при успешном выполнении возвращают специальный ресурс результата. Его, в свою очередь, можно преобразовать в ассоциативный массив (если нужна одна запись) или в двумерный массив (если требуется список записей).

Добавление записи

Вернёмся к нашему проекту — дневнику наблюдений за погодой. Начнём практическую работу с заполнения таблиц данными. Для начала добавим хотя бы один город в таблицу cities.

Выражение INSERT INTO используется для добавления новых записей в таблицу базы данных.

Составим корректный SQL-запрос на вставку записи с именем города, а затем выполним его путём передачи этого запроса в функцию mysqli_query() , чтобы добавить новые данные в таблицу.

Обратите внимание, что первым параметром для функциии mysqli_query() передаётся ресурс подключения, полученный от функции mysqli_connect() , вторым параметром следует строка с SQL-запросом.
При запросах на изменение данных (не SELECT) результатом выполнения будет логическое значение — true или false.
false будет означать, что запрос выполнить не удалось. Для получения строки с описанием ошибки существует функция mysqli_error($link) .

Функция insert id: как получить идентификатор добавленной записи

Следующим шагом будет добавление погодной записи для нового города.
Погодные записи хранит таблица weather_log, но, чтобы сослаться на город, необходимо знать идентификатор записи из таблицы cities.
Здесь пригодится функция mysqli_insert_id() .
Она принимает единственный аргумент — ресурс соединения, а возвращает идентификатор последней добавленной записи.

Теперь у нас есть всё необходимое, чтобы добавить погодную запись.
Вот как будет выглядеть комплексный пример с подключением к MySQL и добавлением двух новых записей:

Чтение записей

Другая частая операция при работе с базами данных в PHP — это получение записей из таблиц (запросы типа SELECT).
Составим SQL-запрос, который будет использовать SELECT выражение. Затем выполним этот запрос с помощью функции mysqli_query() , чтобы получить данные из таблицы.

В этом примере показано, как вывести все существующие города из таблицы cities:

В примере выше результат выполнения функции mysqli_query() сохранён в переменной $result .
Важно понимать, что в этой переменной находятся не данные из таблицы, а специальный тип данных — так называемая ссылка на результаты запроса.

Чтобы получить действительные данные, то есть записи из таблицы, следует использовать другую функцию — mysqli_fetch_array() — и передать ей единственным параметром эту самую ссылку.
Теперь каждый вызов функции mysqli_fetch_array() будет возвращать следующую запись из всего результирующего набора записей в виде ассоциативного массива.

Цикл while здесь используется для «прохода» по всем записям из полученного набора записей.
Значение поля каждой записи можно узнать просто обратившись по ключу этого ассоциативного массива.

Как получить сразу все записи в виде двумерного массива

Иногда бывает удобно после запроса на чтение не вызывать в цикле mysqli_fetch_array для извлечения очередной записи по порядку, а получить их сразу все одним вызовом. PHP так тоже умеет. Функция mysqli_fetch_all($res, MYSQLI_ASSOC) вернёт двумерный массив со всеми записями из результата последнего запроса.
Перепишем пример с показом существующих городов с её использованием:

Как узнать количество записей

Часто бывает необходимо узнать, сколько всего записей вернёт выполненный SQL запрос.
Это может помочь при организации постраничной навигации, или просто в качестве информации.
Узнать число записей поможет функция mysqli_num_rows() , которой следует передать ссылку на результат запроса.

Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL