Установка Apache, MySQL, PHP на Windows

тут немного расскажу о установке Apache, MySQL, PHP на Windows, и так, всё вышеописанное подходит для систем windows, начиная win xp и заканчивая win 10, и так, так же, установка проводилась на старых версиях apache,php и MySQL, для начала идём по ссылке, и скачиваем версию apache 2.2, устанавливаем её, только во время установки выбираем каталог C:\www\, далее переходим по следующей ссылке и качаем php, качаем версию 5.3 либо 5.4, распаковываем в каталог C:\php, после распаковки открываем свойства «Мой компьютер», и переходим по ссылке «Дополнительные параметры», на вкладке «Дополнительно» жмём кнопку «Переменные среды...». В нижнем окне «Системные переменные» находим переменную PATH, выделяем её и нажимаем кнопку «Изменить». Ставим курсор в поле «Значение переменной», на клавиатуре нажимаем клавишу END. Ставим; (это разделитель значений) и пишем путь к каталогу PHP: C:\php
Создаём в директории C:\php три дополнительные поддиректории:

tmp — для хранения временных файлов сессий

includes — для хранения подключаемых классов

upload — для хранения временных загружаемых файлов.
Переименовываем файл php.ini-development в php.ini
На этом установка PHP завершена.
Далее, переходим по ссылке и качаем MySQL версии 5.5, установку проводим, согласно данной статье, всё, установка окончена, начинаем настройку всего нашего хозяйства.
Для этого, в нашем примере, переходим в конфиг каталог apache,C:\www\conf\httpd.conf и открываем конфиг файл, любым текстовым редактором
Найдём и раскомментируем (удалим символ # в начале строки)
LoadModule rewrite_module modules/mod_rewrite.so
Спускаемся до конца списка загружаемых модулей (LoadModule) и ниже последней записи добавляем следующие строки:

LoadModule php5_module «C:/php/php5apache2_2.dll»

AddType application/x-httpd-php .php

PHPIniDir «c:/php/»

Этим мы подключаем поддержку PHP в Apache.

Найдём и раскомментируем строку, задающее имя нашего вэб-сервера

ServerName localhost:80

Проверяем наличие строки, задающее корневую директорию сайтов

DocumentRoot «C:/www/htdocs»
Находим следующий блок:

Options Indexes FollowSymLinks

AllowOverride None

Order allow,deny

Allow from all


И заменяем его на нижеследующий:

Options Indexes Includes FollowSymLinks

AllowOverride All

Order allow,deny

Allow from all


Опция Index разрешает просмотр каталога, если отсутствует индексный файл, опция Includes включает поддержку SSI, а опция FollowSymLinks позволяет использовать символические ссылки на файлы и каталоги. Директива AllowOverride All позволяет изменять опции доступа посредством файла .htaccess.
Находим следующий блок:

DirectoryIndex index.html

И заменяем его на:

DirectoryIndex index.html index.htm index.shtml index.phtml index.php

Находим, начинающийся с блок и в самом конце его раскомментируем следующие две строки:

AddType text/html .shtml

AddOutputFilter INCLUDES .shtml


И добавим ещё две следующие строки

AddType application/x-httpd-php .php

AddType application/x-httpd-php-source .phps

Сохраняем и закрываем файл httpd.conf. Теперь проверим корректность конфигурации: Пуск -> Все программы -> Apache HTTP Server 2.2 -> Configure Apache Server -> Test Configuration. Если настроили не правильно, то в появившемся окне командной строки мы увидим сообщение об ошибке и номер строки, в которой эта ошибка допущена. Если всё правильно, то мелькнёт окно командной строки с надписью «Syntax OK». Ещё раз убедимся, что всё работает, набрав localhost в адресной строке браузера.
В текстовом редакторе откроем настроечный файл PHP – php.ini. В нашем случае он расположен в папке C:\php.

Найдём и раскомментируем (удалим символ; в начале строки) строку

short_open_tag = On

Это позволяет заключать код в короткие тэги.

Следующая строка отключает сообщения об ошибках:

display_errors = Off

Из соображений безопасности отключаем register_globals

register_globals = Off

Отключаем magic_quotes_runtime

magic_quotes_runtime = Off

В секции Paths and Directories найдём и раскомментируем строку для Windows

include_path = ".;c:\php\includes"

Значение директивы extension_dir (путь к папке с расширениями) устанавливаем как

extension_dir = «C:/php/ext»

Разрешим загрузку файлов

file_uploads = On

Найдём строку upload_tmp_dir и укажем директорию для хранения временных загружаемых файлов

upload_tmp_dir = «C:/php/upload»

Установим максимальный размер, загружаемого файла

upload_max_filesize = 8M

Укажем путь к папке для хранения временных файлов сессий

session.save_path = «C:/php/tmp»

Выключим session.auto_start

session.auto_start = 0

Раскомментируем следующие строки для подключения нескольких библиотек расширений:
extension=php_bz2.dll

extension=php_curl.dll

extension=php_gd2.dll

extension=php_mbstring.dll

extension=php_mysql.dll

extension=php_mysqli.dll

Сохраняем файл php.ini. Проверим, как настроена связка PHP и Apache. Для этого в текстовом редакторе создадим файл следующего содержания:

<?php
phpinfo();

?>


Сохраним его как index.php и скопируем в корневую директорию сайтов: C:\www\htdocs. После этого перестартуем Apache для того чтобы он перечитал изменённый файл php.ini, а затем наберём в адресной строке браузера: localhost/index.php. Если видим фиолетовые таблицы с информацией PHP, то значит всё настроено правильно.
Теперь устанавливаем phpMyAdmin, переходим по ссылке и качаем версию 3.4
Распаковываем в дирректорию C:\www\htdocs\phpmyadmin, создаём файл с именем config.inc.php и записываем в него следующее
<?php

$cfg['blowfish_secret'] = '1234567890';

$i=0;

$i++;

$cfg['Servers'][$i]['auth_type'] = 'cookie';

?>

на этом настройка окончена, перезапускаем apache и проверяем работу

Класс для работы с базой данных (на примере MySQL)

В этой публикации я приведу пример более совершенного класса для работы с базой данных. Смысл в минимизации кода и приведения его (кода) в более удобочитаемый вид.
В примере ниже, в отличие от предыдущего, в отдельном классе реализованы не только методы выполняющие запросы типа (Scalar и NonQuery) но и метод возвращающий набор данных в DataTable. При этом продумана обработка исключительных ситуаций.

Привожу код как есть, он весь прокомментирован, на столько на сколько это необходимо для понимания.

Сам класс:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using MySql.Data;
using System.Data;

namespace MySqlLib
{
    /// <summary>
    /// Набор компонент для простой работы с MySQL базой данных.
    /// </summary>
    public class MySqlData
    {

        /// <summary>
        /// Методы реализующие выполнение запросов с возвращением одного параметра либо без параметров вовсе.
        /// </summary>
        public class MySqlExecute
        {

            /// <summary>
            /// Возвращаемый набор данных.
            /// </summary>
            public class MyResult
            {
                /// <summary>
                /// Возвращает результат запроса.
                /// </summary>
                public string ResultText;
                /// <summary>
                /// Возвращает True - если произошла ошибка.
                /// </summary>
                public string ErrorText;
                /// <summary>
                /// Возвращает текст ошибки.
                /// </summary>
                public bool HasError;
            }

            /// <summary>
            /// Для выполнения запросов к MySQL с возвращением 1 параметра.
            /// </summary>
            /// <param name="sql">Текст запроса к базе данных</param>
            /// <param name="connection">Строка подключения к базе данных</param>
            /// <returns>Возвращает значение при успешном выполнении запроса, текст ошибки - при ошибке.</returns>
            public static MyResult SqlScalar(string sql, string connection)
            {
                MyResult result = new MyResult();
                try
                {
                    MySql.Data.MySqlClient.MySqlConnection connRC = new MySql.Data.MySqlClient.MySqlConnection(connection);
                    MySql.Data.MySqlClient.MySqlCommand commRC = new MySql.Data.MySqlClient.MySqlCommand(sql, connRC);
                    connRC.Open();
                    try
                    {
                        result.ResultText = commRC.ExecuteScalar().ToString();
                        result.HasError = false;
                    }
                    catch (Exception ex)
                    {
                        result.ErrorText = ex.Message;
                        result.HasError = true;
                    }
                    connRC.Close();
                }
                catch (Exception ex)//Этот эксепшн на случай отсутствия соединения с сервером.
                {
                    result.ErrorText = ex.Message;
                    result.HasError = true;
                }
                return result;
            }


            /// <summary>
            /// Для выполнения запросов к MySQL без возвращения параметров.
            /// </summary>
            /// <param name="sql">Текст запроса к базе данных</param>
            /// <param name="connection">Строка подключения к базе данных</param>
            /// <returns>Возвращает True - ошибка или False - выполнено успешно.</returns>
            public static MyResult SqlNoneQuery(string sql, string connection)
            {
                MyResult result = new MyResult();
                try
                {
                    MySql.Data.MySqlClient.MySqlConnection connRC = new MySql.Data.MySqlClient.MySqlConnection(connection);
                    MySql.Data.MySqlClient.MySqlCommand commRC = new MySql.Data.MySqlClient.MySqlCommand(sql, connRC);
                    connRC.Open();
                    try
                    {
                        commRC.ExecuteNonQuery();
                        result.HasError = false;
                    }
                    catch (Exception ex)
                    {
                        result.ErrorText = ex.Message;
                        result.HasError = true; 
                    }
                    connRC.Close();
                }
                catch (Exception ex)//Этот эксепшн на случай отсутствия соединения с сервером.
                {
                    result.ErrorText = ex.Message;
                    result.HasError = true;
                }
                return result;
            }
             
        }

        /// <summary>
        /// Методы реализующие выполнение запросов с возвращением набора данных.
        /// </summary>
        public class MySqlExecuteData
        {
            /// <summary>
            /// Возвращаемый набор данных.
            /// </summary>
            public class MyResultData
            {
                /// <summary>
                /// Возвращает результат запроса.
                /// </summary>
                public DataTable ResultData;
                /// <summary>
                /// Возвращает True - если произошла ошибка.
                /// </summary>
                public string ErrorText;
                /// <summary>
                /// Возвращает текст ошибки.
                /// </summary>
                public bool HasError;
            }


            /// <summary>
            /// Выполняет запрос выборки набора строк.
            /// </summary>
            /// <param name="sql">Текст запроса к базе данных</param>
            /// <param name="connection">Строка подключения к базе данных</param>
            /// <returns>Возвращает набор строк в DataSet.</returns>
            public static MyResultData SqlReturnDataset(string sql, string connection)
            {
                MyResultData result = new MyResultData();
                try
                {
                    MySql.Data.MySqlClient.MySqlConnection connRC = new MySql.Data.MySqlClient.MySqlConnection(connection);
                    MySql.Data.MySqlClient.MySqlCommand commRC = new MySql.Data.MySqlClient.MySqlCommand(sql, connRC);
                    connRC.Open();

                    try
                    {
                        MySql.Data.MySqlClient.MySqlDataAdapter AdapterP = new MySql.Data.MySqlClient.MySqlDataAdapter();
                        AdapterP.SelectCommand = commRC;
                        DataSet ds1 = new DataSet();
                        AdapterP.Fill(ds1);
                        result.ResultData = ds1.Tables[0];
                    }
                    catch (Exception ex)
                    {
                        result.HasError = true;
                        result.ErrorText = ex.Message;
                    }
                    connRC.Close();
                }
                catch (Exception ex)//Этот эксепшн на случай отсутствия соединения с сервером.
                {
                    result.ErrorText = ex.Message;
                    result.HasError = true;
                }
            
                return result;

            }

        }
    }
}


Несколько примеров использования:
Запись в DataGridView:

MySqlLib.MySqlData.MySqlExecuteData.MyResultData result = new MySqlLib.MySqlData.MySqlExecuteData.MyResultData();

result = MySqlLib.MySqlData.MySqlExecuteData.SqlReturnDataset("select * from table_name", "Database=base;Data Source=localhost;User Id=root;Password=pass");

            if (result.HasError == false)
            {
                dataGridView1.Columns.Clear();
                dataGridView1.DataSource = result.ResultData.DefaultView;
            }
            else
            {
                MessageBox.Show(result.ErrorText);
            }


Занесение в разные TexBox'ы и т.п.:

//Проверяем есть ли в выборке вообще хоть что-то?
if (result.ResultData.DefaultView.Table.Rows.Count > 0)
{
  //Помещаем значения в текстовые поля.
  textbox_fio.Text = result.ResultData.DefaultView.Table.Rows[0]["fio"].ToString();
  textbox_adress.Text = result.ResultData.DefaultView.Table.Rows[0]["adress"].ToString();
  textbox_info.Text = result.ResultData.DefaultView.Table.Rows[0]["info"].ToString();
}


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