Verification: a143cc29221c9be0

Mysql и php простейшие примеры

Mysql и php простейшие примеры

Содержание

GET запрос при помощи cURL

cURL - мощный инструмент для отправки запросов. Только взгляните сколько он всего умеет.

Для того, чтобы отправить запрос, нужно создать объект при помощи функции curl_init(), а затем следует настроить его.

Все настройки, которые вы можете найти по этой ссылке. Там вы найдете опции, которые мы будем устанавливать функцией curl_setopt, в дальнейших примерах.

Пример простого GET запроса при помощи cURL:

$url = 'https://phpstack.ru/';

$headers = []; // создаем заголовки

$curl = curl_init(); // создаем экземпляр curl

curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_VERBOSE, 1); 
curl_setopt($curl, CURLOPT_POST, false); // 
curl_setopt($curl, CURLOPT_URL, $url);

$result = curl_exec($curl);

В итоге, переменная $result снова содержит html код страницы этого сайта.

  • CURLOPT_VERBOSE - установлена в true для вывода дополнительной информации. Записывает вывод в поток STDERR, или файл, указанный параметром CURLOPT_STDERR.
  • CURLOPT_RETURNTRANSFER - установлена в true, для того чтобы вернуть ответ сервера. Если вам ответ сервера не нужен, то можете убрать эту опцию.
  • Информация о других опциях

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

   curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);

С установленной опцией скрипт автоматически перейдет по вернувшемуся редиректу и вернет ответ уже с итоговой страницы.

POST запрос при помощи cURL

Теперь давайте отправим post запрос на адрес https://httpbin.org/anything

$url = 'https://httpbin.org/anything'; // url, на который отправляется запрос
$post_data = [ // поля нашего запроса
    'field1' => 'val_1',
    'field2' => 'val_2',
];

$headers = []; // заголовки запроса

$post_data = http_build_query($post_data);

$curl = curl_init();
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_VERBOSE, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $post_data);
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_POST, true); // true - означает, что отправляется POST запрос

$result = curl_exec($curl);

Отлично, с GET и POST запросами в cURL мы немного освоились. Теперь разберемся с заголовками, которые мы можем отсылать в запросе.

Заголовки устанавливаются при помощи опции CURLOPT_HTTPHEADER Чтобы получше узнать, для чего нужна эта опция давайте попробуем отправить POST запрос в формате JSON

Подробнее о работе с JSON в PHP

cURL: POST запрос в формате JSON

Отличия конфигурации JSON запроса от обычного POST запроса заключается в том, что мы кодируем поля при помощи json_encode() И добавляем заголовок Content-Type: application/json

$url = 'https://httpbin.org/anything';

$headers = ['Content-Type: application/json']; // заголовки нашего запроса

$post_data = [ // поля нашего запроса
    'field1' => 'val_1',
    'field2' => 'val_2',
];

$data_json = json_encode($post_data); // переводим поля в формат JSON

$curl = curl_init();
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_VERBOSE, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $data_json);
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_POST, true);

$result = curl_exec($curl); // результат POST запроса 

cURL: GET запрос в формате JSON

GET запрос в формате JSON отправляется так же как и POST запрос, просто нужно CURLOPT_CUSTOMREQUEST установить в 'GET'

curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'GET');

А в остальном код идентичен предыдущему примеру. Хотя, надо признать, GET запросы с телом - это нонсенс. Обычно для этих целей используется POST, PUT или PATCH, но был у меня один случай... Поэтому вот GET запрос в формате JSON.

cURL и другие виды HTTP запросов: PUT, DELETE, HEAD, PATCH, OPTIONS, CONNECT и т.д.

Стоп, Дмитрий, прекрати выдумывать виды запросов!

Ничего я не выдумываю: HTTP протокол предполагает множество типов HTTP запросов просто POST и GET являются более распространенными.

Чтобы отправить PUT запрос, нужно установить опцию CURLOPT_PUT таким образом:

curl_setopt($curl, CURLOPT_PUT, true);

Это делается по тому же принципу, как и CURLOPT_POST. Но что делать с остальным зоопарком запросов? Разве у cURL есть CURLOPT_DELETE или CURLOPT_HEAD? Нет.

Для того, чтобы отправлять другие виды запросов есть другая опция: CURLOPT_CUSTOMREQUEST

Вместо строки curl_setopt($curl, CURLOPT_POST, true); мы явно задаем имя запроса опцией CURLOPT_CUSTOMREQUEST:

curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'HEAD');
// или
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'DELETE');
// или
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'PATCH');
// или
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'OPTIONS');

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

Как получить заголовки ответа

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

$ch = curl_init();

$headers = [];

curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// ... остальные опции

// this function is called by curl for each header received
curl_setopt($ch, CURLOPT_HEADERFUNCTION,  function($curl, $header) use (&$response_headers)  {
    $len = strlen($header);
    $header = explode(':', $header, 2);
    if (count($header) 

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

Рассмотрим такой пример:

$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 1);
// ...

$response = curl_exec($ch);

// Then, after your curl_exec call:
$header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
$header = substr($response, 0, $header_size);
$body = substr($response, $header_size);

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

Скачивание больших файлов с помощью cURL

Для того, чтобы скачать большой файл пригодится этот способ:

$url = 'https://example.com/big_file.zip'; // откуда скачиваем файл
$path = __DIR__ . '/big_file.zip';  // куда сохраняем файл

$fp = fopen($path, 'w');
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_FILE, $fp);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
$data = curl_exec($ch);
curl_close($ch);
fclose($fp);

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

$ch = curl_init('https://example.ru/big_file.zip');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_HEADER, false);
$data = curl_exec($ch);
curl_close($ch);

file_put_contents(__DIR__ . '/big_file.zip', $data);

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

Параллельные cURL запросы в PHP

Для чего могут потребоваться многопоточные запросы? Например у нас есть много URL адресов:

$urls = [
    'https://httpbin.org/anything?1',
    'https://httpbin.org/anything?2',
    'https://httpbin.org/anything?3',
];

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

Выглядит это так:

$results = [];
foreach ($urls as $url) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_HEADER, false);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $results[$url] = curl_exec($ch);
    curl_close($ch);
}

var_dump($results);

Теперь в $results у нас содержится массив, где ключи - это url адреса, а значения - результаты запросов. Однако запросы выполняются долго. Но мы можем это ускорить.

Как выполнить 3 запроса одновременно? В этом нам поможет curl_multi_

Давайте решим конкретную задачу при помощи параллельных curl запросов. Нам нужно отправить одновременно 3 запроса.

$urls = [
    'https://httpbin.org/anything?1',
    'https://httpbin.org/anything?2',
    'https://httpbin.org/anything?3',
];


// array of curl handles
$multiCurl = [];
// data to be returned
$results = [];
// multi handle
$mh = curl_multi_init();
foreach ($urls as $url) {
    $multiCurl[$url] = curl_init();
    curl_setopt($multiCurl[$url], CURLOPT_URL, $url);
    curl_setopt($multiCurl[$url], CURLOPT_HEADER, 0);
    curl_setopt($multiCurl[$url], CURLOPT_RETURNTRANSFER, 1);
    curl_multi_add_handle($mh, $multiCurl[$url]);
}
$index = null;
do {
    curl_multi_exec($mh, $index);
} while ($index > 0);
// get content and remove handles
foreach ($multiCurl as $k => $ch) {
    $results[$k] = curl_multi_getcontent($ch);
    curl_multi_remove_handle($mh, $ch);
}
// close
curl_multi_close($mh);

var_dump($results); // в $results у нас содержатся ответы на наши 3 запроса

Такие параллельные запросы выполняются значительно быстрее чем поочередные.

cURL запросы с сохранением и загрузкой cookie из файла

cURL позволяет нам установить cookie при передачи запросов, а также автоматически принимать и устанавливать cookie, которые нам возвращает сервер, сохраняя их между запросами.

Давайте рассмотрим такой пример:

$cookiePath = __DIR__ . '/cookie.txt';

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, "https://yandex.ru/");
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.125 Safari/537.36');

curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);

//CURLOPT_COOKIEJAR - файл, куда пишутся куки после закрытия коннекта, например после curl_close()
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookiePath);

//CURLOPT_COOKIEFILE - файл, откуда читаются куки.
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookiePath);

$result = curl_exec($ch);

// теперь в этой переменной будут содержаться cookie, которые установил сервер
$cookies = curl_getinfo($ch, CURLINFO_COOKIELIST);

curl_close($ch);

// выводим на экран содержимое файла cookie.txt, которое установил нам Yandex.
// можете изучить сколько всего он сохраняет на ваш компьютер при первом же заходе.
echo file_get_contents($cookiePath);

Теперь cookie у нас хранятся в файле cookie.txt в директории со скриптом (если вы ничего не меняли). Если мы совершаем повторные запросы, то cURL автоматически берет и отправляет cookie на сервер, как и обычный браузер. Таким образом мы можем авторизироваться на сайте и сохранить сеанс между запросами.

Передача cookie без файлов

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, "https://example.com/");

curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);

// мы напрямую указываем cookie, которые хотим передать на сервера
curl_setopt($ch, CURLOPT_COOKIE, 'PHPSESSID=123456');

$result = curl_exec($ch);

curl_close($ch);

Иммитация браузера с помощью cURL

Иногда сайт, к которому мы обращаемся может фильтровать запросы, защищаясь от парсинга. Если для этого используются упрощенные способы защиты, например проверка User-Agent, то мы можем легко притвориться, что являемся реальным польователем, который взаимодействует с сайтом через браузер, мы можем послать заголовки и cookie, которые обычно посылает браузер.

В данном примере установлены заголовки, которые посылает Chrome.

$url = 'https://phpstack.ru/';

$headers = [
    'Connection: keep-alive',
    'Upgrade-Insecure-Requests: 1',
    'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
    'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
    'Accept-Encoding: gzip, deflate',
    'Accept-Language: ru,en-US;q=0.9,en;q=0.8',
];

$cookieFile = __DIR__ . '/cookie.txt';

$curl = curl_init(); // создаем экземпляр curl

curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_VERBOSE, 1);
curl_setopt($curl, CURLOPT_COOKIEFILE, $cookieFile);
curl_setopt($curl, CURLOPT_COOKIEJAR, $cookieFile);
curl_setopt($curl, CURLOPT_POST, false); //
curl_setopt($curl, CURLOPT_URL, $url);

$result = curl_exec($curl);

В простых ситуациях этого хватает. Но если используется защита при помощи javascript или что-то более продвинутое, то здесь cURL бессилен, и следует использовать либо BAS либо Zennoposter. Либо если вы хотите попытать счастье с PHP, то Selenium.

Не используйте эти знания в противоправных целях.

cURL запросы через прокси

Простой пример для отправки запросов через proxy. Если ваш прокси предполагает авторизацию, то раскомментируйте соответствующие строчки.

$url = 'http://dynupdate.no-ip.com/ip.php'; // тут мы можем узнать свой IP адрес
$proxy = '127.0.0.1:8888';
//$proxyauth = 'user:password'; // если прокси с авторизацией, то раскомметируйте

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_PROXY, $proxy);
//curl_setopt($ch, CURLOPT_PROXYUSERPWD, $proxyauth); // если прокси с авторизацией, то раскомметируйте
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 1);
$html = curl_exec($ch);
curl_close($ch);

echo $html;

Отправка файлов

Для того, чтобы отправить файлы на сервер, мы просто заполняем поля POST запроса, указывая там специальный класс CURLFile. На сервере вы можете получить отправленные файлы, при помощи суперглобального массива $_FILES.

$url = 'https://phpstack.ru/';

$postFields = [
    'photo1' => new \CURLFile( __DIR__ . '/img1.jpg' ),
    'photo2' => new \CURLFile( __DIR__ . '/img2.jpg' ),
];

$ch = curl_init($url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postFields);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_HEADER, false);

$html = curl_exec($ch);

curl_close($ch);

Авторизация с помощью cURL

HTTP Авторизация

Чтобы с помощью cURL авторизироваться на сайте, который использует Basic HTTP-аутентификацию нужно установить опцию CURLOPT_USERPWD, в которой будет наш логин и пароль.

Пример:

$login = 'test_login'; // наш логин
$password = 'test_password'; // наш пароль
$url = 'https://phpstack.ru/';

$ch = curl_init($url);

curl_setopt($ch, CURLOPT_USERPWD, "$login:$password");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_HEADER, false);

$result = curl_exec($ch);

curl_close($ch);

OAuth авторизация

$url = 'https://phpstack.ru/';
$oauthToken = 'Bearer dsfgdsfgdsfgdsfgdsfg'; // наш токен

$ch = curl_init($url);

curl_setopt($ch, CURLOPT_HTTPHEADER, array("Authorization: $oauthToken"));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_HEADER, false);

$html = curl_exec($ch);

curl_close($ch);

Авторизация через форму

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

Допустим на сайте есть такая форма:

Тогда наш cURL запрос должен быть сформирован так:

$url = 'http://phpstack.ru/admin/'; // url, на который отправляется запрос

$postData = [ // поля нашего запроса
    'login' => 'our_login', // наш логин
    'password' => 'our_password', // наш пароль
];

$cookieFile = __DIR__ . '/cookie.txt';

// притворяемся браузером
$headers = [
    'Connection: keep-alive',
    'Upgrade-Insecure-Requests: 1',
    'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
    'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
    'Accept-Encoding: gzip, deflate',
    'Accept-Language: ru,en-US;q=0.9,en;q=0.8',
];

$post_data = http_build_query($post_data);

$curl = curl_init();
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_VERBOSE, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $postData);
curl_setopt($curl, CURLOPT_COOKIEFILE, $cookieFile);
curl_setopt($curl, CURLOPT_COOKIEJAR, $cookieFile);
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_POST, true); // true 

$result = curl_exec($curl);

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

Автоматическое построение запросов

Есть очень интересный сервис: https://curlbuilder.com/ - он поможет вам построить запрос для консольного приложения.

Перевод консольной команды curl в PHP

И вот еще один сервис, который переводит консольную команду curl в PHP: https://incarnate.github.io/curl-to-php/

Так вы можете создать простые запросы на cURL в PHP не создавая их вручную.

Лайфхак

В консоли браузера, во вкладке сеть, вы можете кликнуть правой кнопкой мыши и скопировать любой запрос в виде команды cURL, а потом с помощью сервиса curl-to-php перевести запрос в PHP. Теперь вы вообще можете сконвертировать в cURL абсолютно любой запрос, который посылает ваш браузер.

Как работать с cURL гораздо проще

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

$curl = new Curl();
$curl->get('https://www.example.com/search', [
    'q' => 'keyword',
]);

Или так:

$curl = new Curl();
$curl->post('https://www.example.com/login/', [
    'username' => 'myusername',
    'password' => 'mypassword',
]);

К счастью, такая обертка уже написана и найти ее можно здесь: https://github.com/php-curl-class/php-curl-class

Просто установите ее при помощи: composer require php-curl-class/php-curl-class и не работайте с кривыми кусками кода, которые таковы вероятно потому, что cURL изначально консольное приложение.

POST и GET запросы без cURL

С помощью PHP мы можем отправить простой GET запрос используя функцию file_get_contents.

Пример:

$result = file_get_contents('https://phpstack.ru/');

Теперь у нас в переменной $result записан весь html код главной страницы этого сайта. Мы совершили GET запрос, а html код - это ответ на него.

При помощи file_get_contents мы также можем отправить POST запрос.

Пример:

$postData = http_build_query([
    'var1' => 'текст 1',
    'var2' => 'текст 2'
]);

$opts = [
    'http' => [
        'method' => 'POST',
        'header' => 'Content-type: application/x-www-form-urlencoded',
        'content' => $postData
    ]
];

$context = stream_context_create($opts);

$result = file_get_contents('https://httpbin.org/anything', false, $context);

Подробнее о том, какие опции можно передавать в stream_context_create, вы можете изучить здесь: http://docs.php.net/manual/ru/context.http.php

В $result мы получили ответ на POST запрос. httpbin.org - это сторонний сервис, который вы можете использовать для отладки запросов. Он возвращает нам наш собственный запрос в формате JSON и еще некоторую информацию. Так мы можем увидеть, что мы отправляем в своих запросах.

Как видите file_get_contents - полезная функция, которая не только позволяет читать файлы на нашем сервере, но еще и отправлять запросы.

Подробнее о ней вы можете прочитать здесь: https://www.php.net/manual/ru/function.file-get-contents.php

Другие инструменты для работы с запросами в PHP

Для работы с запросами есть еще более мощный инструмент: Guzzle

Создание Базы Данных MySQL (При необходимости)

Этот шаг можно пропустить, если у вас уже есть база данных MySQL. Если вы являетесь пользователем Hostinger, вы можете легко создать новую БД через hPanel — панель управления хостингом Hostinger, следуя простой инструкции:

  1. Найдите меню «Базы данных MySQL» в разделе «Базы данных».
  2. Заполните все необходимые поля и нажмите «Создать».
    Страница Создания БД MySQL в hPanel

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

Запишите учётные данные только что созданной базы данных MySQL для следующего шага. А также не забудьте имя пользователя и пароль к БД!

Два способа PHP-подключения к БД MySQL

Есть два метода подключения к базе данных MySQL с помощью PHP: MySQLi и PDO.

MySQLi расшифровывается как MySQL Improved. Это эксклюзивное расширение MySQL, которое добавляет новые функции в интерфейс базы данных. Функции MySQLi являются как процедурными, так и объектно-ориентированными, причём первую парадигму расширение унаследовало от более ранней версии MySQL.

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

PDO расшифровывается как PHP Data Object, или объект данных PHP. В отличие от MySQLi, PDO является только объектно-ориентированным методом. Он поддерживает ряд различных типов баз данных, использующих PHP, таких как MySQL, MSSQL, Informix и PostgreSQL.

Исходные функции mysql_ устарели. Их лучше не использовать, поскольку они небезопасны и больше не поддерживаются.

Одна из наиболее важных функций, которую поддерживают оба метода — это подготовленные выражения (prepared statements). Она сокращает время, необходимое MySQL для выполнения повторяемого запроса. Эта функция также используется для предотвращения SQL-инъекций при внесении изменений в базу данных.

Какой бы метод вы ни использовали, вам понадобится правильная информация для подключения к созданной вами базе данных MySQL. Здесь вам пригодятся ранее сохранённые данные БД.

Вам также потребуется правильное имя сервера, или имя хоста для конфигурации. Hostinger использует “localhost” в качестве имени хоста своего сервера MySQL. Это имя, которое вы будете использовать, если загрузите свой PHP-скрипт на тот же сервер, что и база данных.

С другой стороны, если вы подключаетесь к базе данных из удалённого места (например, со своего компьютера), вам придётся использовать IP-адрес MySQL-сервера. Чтобы получить дополнительную информацию, обратитесь к своему хостинг-провайдеру. Он предоставит вам актуальную информацию о том, какое имя использовать в качестве имени хоста.

PHP-подключение к БД MySQL с MySQLi

Выполните следующие действия, чтобы подключить PHP-скрипт к MySQL посредством MySQLi:

  1. Перейдите в Файловый менеджер -> public_html.
  2. Создайте новый файл, щёлкнув на соответствующую иконку в верхнем меню.
  3. Сохраните его как databaseconnect.php. Вы можете заменить имя на любое другое, просто убедитесь, что в качестве расширения используется php.
  4. Дважды щёлкните по файлу, чтобы открыть его. Скопируйте и вставьте в него следующие строки кода. Замените первые четыре значения после учётными данными, которые вы указали ранее.

Объяснение Кода MySQLi

Основным методом, используемым в этом скрипте, является mysqli_connect (). Это внутренняя функция PHP для установления нового соединения с сервером MySQL.

В начале нашего кода мы видим несколько объявлений переменных и значений, присвоенных этим переменным. Обычно нам нужно четыре из них, чтобы установить правильное соединение с базой данных: $servername, $database, $username и $password. В коде мы указываем наши данные для доступа к БД как значения для этих переменных, чтобы их можно было передать в функцию.

Если попытка соединения была неудачной, выполняется функция die(). Она убивает наш скрипт и выдаёт сообщение об ошибке подключения, которое мы прописали. По умолчанию в сообщении об ошибке подключения MySQL будет указано «Connection failed», за которым следует точное сообщение об ошибке с описанием проблемы.

С другой стороны, если MySQL-соединение установлено успешно, мы увидим сообщение «Connected successfully».

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

PHP-подключение к БД MySQL с PDO

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

  1. В public_html создайте файл с названием pdoconfig.php и вставьте следующий код. Как всегда, не забудьте заменить значения плейсхолдеров информацией из вашей базы данных. Сохраните и закройте его, когда закончите.
  2. Создайте ещё один файл и назовите его databaseconnect.php в том же каталоге, но со следующим кодом. Если вы назвали предыдущий файл по-другому, не забудьте изменить значение после require_once.
    getMessage());
    }

Объяснение Скрипта PDO

Для подключения к базе данных PDO необходимо создать новый объект PDO с именем источника данных (DSN), именем пользователя и паролем.

DSN определяет тип базы данных, имя базы данных и любую другую информацию, относящуюся к базе данных, если это необходимо. Это переменные и значения, указанные нами в файле dbconfig.php, на которые один раз ссылается строка require_once в файле databaseconnect.php.

В последнем примере вы найдёте код try… catch... Это означает, что скрипт попытается подключиться к MySQL, используя предоставленный код, но в случае возникновения проблемы будет выполнен код в разделе catch. Вы можете использовать блок catch для отображения сообщений об ошибках подключения или запустить альтернативный код в случае сбоя блока try.

Если соединение установлено успешно, вы увидите сообщение «Connected to $dbname at $host successfully». Однако, если попытка не удалась, код в блоке catch покажет простое сообщение об ошибке и завершит скрипт.

Проверка Подключения и Устранение Распространённых Ошибок

Чтобы проверить, успешно ли установлено соединение, войдите в свой домен так: vashdomen/databaseconnect.php. Если вы назвали PHP-файл другим именем, обязательно укажите правильное название.

Если всё работает хорошо, вы увидите «Connected successfully» или другой вариант этого сообщения.

В случае возникновения проблемы при попытке установить соединение, вы увидите сообщения об ошибке. Они отличаются для MySQLi и PDO.

Ошибка при Неправильном Пароле

Эта ошибка возникает, если мы меняем пароль или какие-либо учётные данные в PHP-коде (но не меняем их в реальной базе данных).

Если вы видите сообщение «Access denied» или «Could not connect to database», сопровождаемое “(using password: YES)”, первое, что нужно сделать, это проверить данные для доступа к БД. Возможно, вы сделали опечатку или пропустили какую-то часть.

Не Удаётся Подключиться к MySQL-серверу

Если вы видите сообщение «Can’t connect to MySQL server on ‘server’ (110)» в MySQLi, это означает, что скрипт не получил ответа от сервера. Это происходит, когда мы устанавливаем «server» вместо «localhost» в качестве $servername, и имя не распознаётся.

Сообщение об аналогичной ошибке в PDO будет выглядеть как: «Connection failed: SQLSTATE[Hy000] [2002]». А за ним следует уточнение, что узел MySQL не найден. Причина и решение этой проблемы такое же, как и в предыдущем примере.

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

Журнал находится в той же папке, где запущен скрипт. Например, если мы запускаем сценарий в public_html, error_log будет в той же папке.

Этапы подключения к базе данных MySQL

  1. Код PHP начинается с и заканчивается ?> Так компьютеру будет понятно, где начало и где конец программы.
  2. В самом начале кода удобно указать способ отображения ошибок — если что-то пойдет не так, вы сможете быстро понять код ошибки. В языке программирования PHP для этого используются следующие команды:

    ini_set('display_errors', 1);
    ini_set('display_startup_errors', 1);
    error_reporting(E_ALL); 
  3. Соединение с базой данных MySQL: создаем переменную, например, $connect, в которой через коннектор вносим доступы к нашей базе данных (имя, пароль и т.п.). Эта база данных MySQL должна уже существовать и «крутиться» либо на сервере, либо на локалке. Про установку и создание своей базы данных у нас будет отдельный материал. Подключаемся:

    $connect = mysqli_connect('localhost', 'database', 'password', 'user');
  4. Создаем запрос к базе данных — какие данные мы хотим получить: для этого делаем новую переменную, например, $query1, которой присваиваем значение запроса на языке, понятном для базы MySQL — выбери из где . Запрос выглядит так:

    $query1 = "SELECT Name FROM igroki WHERE N='7'";
  5. Подготовка в возвращение результатов запроса для чтения: создаем новую переменную, например, $result— которая получит результат запроса. Используется конструкция [подключение к БД] -> query([запрос к БД]). В нашем примере возвращение результатов выглядит так:

    $result = $connect->query($query1);
  6. Затем вы должны получать по одной записи из набора результатов возвращенного запроса (по сути перебором). В нашем примере — это будет только 1 запись, потому что вы получаете id = 7. Обычно вы будете использовать mysqli_fetch_array ($ result), чтобы вернуть массив данных, или вы можете использовать mysqli_fetch_object ($ result), чтобы вернуть объект данных. В нашем примере мы создаем новую переменную, например, $record и фетчим полученный массив:

    $record = mysqli_fetch_array($result);
  7. Напечатать имя седьмого игрока: для печати в PHP используется оператор echo, где в кавычках можно написать текст для печати, и через точку объединить текст с переменной — так как возвращенный массив имеет несколько «колонок», а нам нужно вывести именно имя, то указываем в скобках к переменной $record именно 'Name':

    echo 'Name of 7th player: ' . $record['Name'];
  8. Отключение от базы данных:

    $connect -> close();

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

$query2 = "SELECT Name FROM igroki";
$result2 = $connect->query($query2);

while ($record2 = mysqli_fetch_array($result2))
{
    echo 'Name: ' . $record2['Name'] . '
';

}

Подключения к базе данных MySQL — простой пример запроса на PHP


ini_set(‘display_errors’, 1);
ini_set(‘display_startup_errors’, 1);
error_reporting(E_ALL);

$connect = mysqli_connect(‘localhost’, ‘database’, ‘password’, ‘user’);

$query1 = «SELECT Name FROM igroki WHERE N=’7′»;

$result = $connect->query($query1);

$record = mysqli_fetch_array($result);

echo ‘Name of 7th player: ‘ . $record[‘Name’];

echo «





»;  //Это разделитель html

// Перебор нескольких значений:

echo «All players:

»;
$query2 = «SELECT Name FROM igroki»;

$result2 = $connect->query($query2);
while ($record2 = mysqli_fetch_array($result2)) {
echo ‘Name: ‘ . $record2[‘Name’] . ‘
’;

}

$connect -> close();
?>

Создание кнопки на сайте для получения значений из базы данных MySQL

К тому коду, который вам уже известен — базовый запрос к БД — осталось добавить html-код кнопки через тег

(позволяет создавать на сайте интерактивные элементы и отправлять данные на сервер).

Чтобы внутри формы появилась кнопка вводим action — можно пустой (action=''), чтобы при нажатии загружалась эта же программа, либо можно в кавычках указать ссылку на другой файл с кодом, который запустится при нажатии кнопки (например, action='submit.php').

Важно присвоить форме select name — любое имя, на которое затем можно ссылаться в программе).

На сайте кнопку, списки, выпадающие меню можно сделать с помощью форм, которые могут быть типа POST (method=’POST’) или GET (method=’GET’). Если делать форму POST, то пользователь не будет видеть в строке браузера текст, соответствующий выбранным опциям. Если сделать форму GET, то строка браузера после выбора варианта покажет значение (похожим образом работает поисковик, если сделать запрос, то в строку браузера добавляется информация о запросе).ᅠ


if (isset($_POST[‘submit’]))
{
echo » 



«;
}

ini_set(‘display_errors’, 1);
ini_set(‘display_startup_errors’, 1);
error_reporting(E_ALL);

$connect = mysqli_connect(‘localhost’, ‘database’, ‘password’, ‘user’);
$query1 = «SELECT Name FROM igroki WHERE N=’7′»;
$result = $connect->query($query1);
$record = mysqli_fetch_array($result);

if (isset($_POST[‘submit’]))
{
echo ‘Name of 7th player: ‘ . $record[‘Name’];
}

$connect -> close();
?>

Создание формы (выпадающий список) с кнопкой на сайте

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

На сайте выпадающее меню создается с помощью форм, которые могут быть типа POST (method=’POST’) или GET (method=’GET’). 

Чтобы создать выпадающее меню с кнопкой, используется html-тег формы

с выбором вариантов через теги:

(можно указать action='', чтобы при нажатии загружалась эта же программа, либо можно в кавычках указать ссылку на другой файл с кодом, который запустится при нажатии кнопки; важно присвоить select name — любое имя, на которое затем можно ссылаться в программе);

(option value — это значение, которое будет записано в переменную при выборе этого пункта, а Seven и Eight  — это то, что показывается пользователю на сайте в выпадающем меню);

внутри формы добавляем кнопку через html-тег .

Пример кода для выпадающего меню с кнопкой методом POST




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

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

Получение выбора пользователя после нажатия кнопки на сайте — напечатать одно значение из базы данных (имя седьмого игрока)

if (isset($_POST[‘submit’]))
{
    $number = $_POST[‘PlayerID’];
    $query = «SELECT Name FROM igroki WHERE N=’$number'»;
    $result = $connect->query($query);
    $record = mysqli_fetch_array($result);
    echo ‘Name of 7th player: ‘ . $record[‘Name’];
}

Cоздание формы (выпадающий список) с кнопкой, отправляющей запрос к базе данных MySQL на html + PHP с выводом результатов на сайте





ini_set(‘display_errors’, 1);
ini_set(‘display_startup_errors’, 1);
error_reporting(E_ALL);

$connect = mysqli_connect(‘localhost’, ‘database’, ‘password’, ‘user’);

if (isset($_POST[‘submit’]))
{
    $number = $_POST[‘PlayerID’];
    $query = «SELECT Name FROM igroki WHERE N=’$number'»;
    $result = $connect->query($query);
    $record = mysqli_fetch_array($result);
    echo ‘Name of 7th player: ‘ . $record[‘Name’];
}

$connect -> close();
?>

Пространственные функции MySQL

Area()
AsBinary(), AsWKB()
AsText(), AsWKT()
Buffer()
Centroid()
Contains()
Crosses()
Dimension()
Disjoint()
EndPoint()
Envelope()
Equals()
ExteriorRing()
GeomCollFromText(), GeometryCollectionFromText()
GeomCollFromWKB(), GeometryCollectionFromWKB()
GeometryCollection()
GeometryN()
GeometryType()
GeomFromText(), GeometryFromText()
GeomFromWKB(), GeometryFromWKB()

GLength() - Длина возврата LineString
Возвращает длину из LineString или MultiLineString. Длина MultiLineString значения равна сумме длин его элементов. Если аргумент - NULL или пустая геометрия, возвращаемое значение - NULL.

SET @ls = 'LineString(1 1,2 2,3 3)';
SELECT GLength(GeomFromText(@ls));
+----------------------------+
| GLength(GeomFromText(@ls)) |
+----------------------------+
|         2.8284271247461903 |
+----------------------------+
InteriorRingN()
Intersects()
IsClosed()
IsEmpty()
IsSimple()
LineFromText(), LineStringFromText()
LineFromWKB(), LineStringFromWKB()
LineString()
MBRContains()
MBRDisjoint()
MBREqual()
MBRIntersects()
MBROverlaps()
MBRTouches()
MBRWithin()
MLineFromText(), MultiLineStringFromText()
MLineFromWKB(), MultiLineStringFromWKB()
MPointFromText(), MultiPointFromText()
MPointFromWKB(), MultiPointFromWKB()
MPolyFromText(), MultiPolygonFromText()
MPolyFromWKB(), MultiPolygonFromWKB()
MultiLineString()
MultiPoint()
MultiPolygon()
NumGeometries()
NumInteriorRings()
NumPoints()
Overlaps()
Point()
PointFromText()
PointFromWKB()
PointN()
PolyFromText(), PolygonFromText()
PolyFromWKB(), PolygonFromWKB()
Polygon()
SRID()
ST_Area()
ST_AsBinary(), ST_AsWKB()
ST_AsText(), ST_AsWKT()
ST_Buffer()
ST_Centroid()
ST_Contains()
ST_Crosses()
ST_Difference()
ST_Dimension()
ST_Disjoint()
ST_Distance()
ST_EndPoint()
ST_Envelope()
ST_Equals()
ST_ExteriorRing()
ST_GeomCollFromText(), ST_GeometryCollectionFromText(),ST_GeomCollFromTxt()
ST_GeomCollFromWKB(), ST_GeometryCollectionFromWKB()
ST_GeometryN()
ST_GeometryType()
ST_GeomFromText(), ST_GeometryFromText()
ST_GeomFromWKB(), ST_GeometryFromWKB()
ST_InteriorRingN()
ST_Intersection()
ST_Intersects()
ST_IsClosed()
ST_IsEmpty()

ST_IsSimple() - Простая ли геометрия
Возвращает 1, если значение геометрии g не имеет аномальных геометрических точек, таких как самопересечение или самокасание. ST_IsSimple()возвращает 0, если аргумент непростой, и NULLесли аргумент простой NULL

ST_LineFromText(), ST_LineStringFromText()
ST_LineFromWKB(), ST_LineStringFromWKB()
ST_NumGeometries()
ST_NumInteriorRing(), ST_NumInteriorRings()
ST_NumPoints()
ST_Overlaps()
ST_PointFromText()
ST_PointFromWKB()
ST_PointN()
ST_PolyFromText(), ST_PolygonFromText()
ST_PolyFromWKB(), ST_PolygonFromWKB()
ST_SRID()
ST_StartPoint()
ST_SymDifference()

ST_Touches() - Касается ли одна геометрия другой
Две геометрии соприкасаются в пространстве, если их внутренности не пересекаются, но граница одной из геометрий пересекает границу или внутреннюю часть другой. Эта функция возвращает 1, если g1 касается g2, иначе 0.

ST_Union() - Объединение множества точек двух геометрий

SET @g1 = ST_GeomFromText('LineString(1 1, 3 3)');
SET @g2 = ST_GeomFromText('LineString(1 3, 3 1)');
SELECT ST_AsText(ST_Union(@g1, @g2));
+--------------------------------------+
| ST_AsText(ST_Union(@g1, @g2))        |
+--------------------------------------+
| MULTILINESTRING((1 1,3 3),(3 1,1 3)) |
+--------------------------------------+
ST_Within()
ST_X()
ST_Y()
StartPoint()
Touches()
Within()
X()
Y()

Чувствительность к регистру PHP

В PHP нет ключевых слов (например if, else, while, echo, etc.), классы, функции и определяемые пользователем функции не чувствительны к регистру.

В приведенном ниже примере все три оператора "echo" сработают одинаково:



ECHO "Привет Мир!
";
echo "Привет Мир!
";
EcHo "Привет Мир!
";
?>


Примечание: Следует запомнить, что в отличие от классов и функций все имена переменных чувствительны к регистру!

В следующем примере только первая инструкция будет отображать значение переменной $length Это потому, что $length, $LENGTH и $lenGTH являются абсолютно разными переменными:



$length = "высокий";
echo "Мой дом " . $length . "
";
echo "Этот мужчина " . $LENGTH . "
";
echo "Тот столб " . $lenGTH . "
";
?>