Перенаправление с помощью php. Как перенаправить пользователя на другую страницу? Пример #2 Директивы для работы с кешем
Синтаксис:
* где fields1
— поля для выборки через запятую, также можно указать все поля знаком *; table
— имя таблицы, из которой вытаскиваем данные; conditions
— условия выборки; fields2
— поле или поля через запятую, по которым выполнить сортировку; count
— количество строк для выгрузки.
* запрос в квадратных скобках не является обязательным для выборки данных.
Простые примеры использования select
1. Обычная выборка данных:
> SELECT * FROM users
2. Выборка данных с объединением двух таблиц (JOIN):
SELECT u.name, r.* FROM users u JOIN users_rights r ON r.user_id=u.id
* в данном примере идет выборка данных с объединением таблиц users и users_rights . Объединяются они по полям user_id (в таблице users_rights) и id (users). Извлекается поле name из первой таблицы и все поля из второй.
3. Выборка с интервалом по времени и/или дате
а) известна точка начала и определенный временной интервал:
* будут выбраны данные за последний час (поле date ).
б) известны дата начала и дата окончания:
25.10.2017 и 25.11.2017 .
в) известны даты начала и окончания + время:
* выбираем данные в промежутке между 25.03.2018 0 часов 15 минут и 25.04.2018 15 часов 33 минуты и 9 секунд .
г) вытаскиваем данные за определенные месяц и год:
* извлечем данные, где в поле date присутствуют значения для апреля 2018 года.
4. Выборка максимального, минимального и среднего значения:
> SELECT max(area), min(area), avg(area) FROM country
* max — максимальное значение; min — минимальное; avg — среднее.
5. Использование длины строки:
* данный запрос должен показать всех пользователей, имя которых состоит из 5 символов.
Примеры более сложных запросов или используемых редко
1. Объединение с группировкой выбранных данных в одну строку (GROUP_CONCAT):
* из таблицы users извлекаются данные по полю id , все они помещаются в одну строку, значения разделяются запятыми .
2. Группировка данных по двум и более полям:
> SELECT * FROM users GROUP BY CONCAT(title, "::", birth)
* итого, в данном примере мы сделаем выгрузку данных из таблицы users и сгруппируем их по полям title и birth . Перед группировкой мы делаем объединение полей в одну строку с разделителем :: .
3. Объединение результатов из двух таблиц (UNION):
> (SELECT id, fio, address, "Пользователи" as type FROM users)
UNION
(SELECT id, fio, address, "Покупатели" as type FROM customers)
* в данном примере идет выборка данных из таблиц users и customers .
4. Выборка средних значений, сгруппированных за каждый час:
SELECT avg(temperature), DATE_FORMAT(datetimeupdate, "%Y-%m-%d %H") as hour_datetime FROM archive GROUP BY DATE_FORMAT(datetimeupdate, "%Y-%m-%d %H")
* здесь мы извлекаем среднее значение поля temperature из таблицы archive и группируем по полю datetimeupdate (с разделением времени за каждый час).
Вставка (INSERT)
Синтаксис 1:
> INSERT INTO
Иванович | Администрац. | Директор | |||||
Петрович | Администрац. | Зам. директора | |||||
Григорий | Григорьевич | Начальник | |||||
Сергеевич | Продавец-консульт. |
Выше представлен тривиальный пример структуры таблицы базы данных. Однако она ещё не до конца отвечает основным требованиям нормализации. В реальных системах создается дополнительная таблица отделов. Поэтому приведенная таблица вместо слов в колонке «Отдел» должна содержать номера отделов.
Каким образом происходит выборка данных
Для получения данных из таблиц в СУБД используется специальная команда MySQL - запрос Select . Для того чтобы сервер правильно отреагировал на обращение, запрос должен быть корректно сформирован. Структура запроса формируется следующим образом. Любое обращение к серверу БД начинается с ключевого слова select . Именно с негостроятся все вMySQL запросы. Примеры могут иметь различную сложность, но принцип построения очень похож.
Затем необходимо указать, с каких полей требуется выбрать интересующую информацию. Перечисление полей происходит через запятую после предложения select . После того как все необходимые поля были перечислены, в запросе указывается объект таблицы, из которого будет происходить выборка, при помощи предложения from и указания имени таблицы.
Для ограничения выборки в MySQL-запросы добавляются специальные операторы, предусмотренные СУБД. Для выборки неповторяющихся (уникальных) данных используется предложение distinct , а для задания условий - оператор where . В качестве примера, применимого к вышеуказанной таблице, можно рассмотреть запрос, требующий информацию о Ф.И.О. сотрудников, работающих в отделе «Продажи». Структура запроса примет вид, как в таблице ниже.
Понятие вложенного запроса
Но главная особенность СУБД, как было указано выше, возможность обрабатывать вложенные запросы MySQL. Как он должен выглядеть? Из названия логически понятно, что , сформированный в определенной иерархии из двух или более запросов. В теории по изучению особенностей СУБД сказано, что MySQL не накладывает ограничений на количество MySQL-запросов, которые могут быть вложены в главный запрос. Однако можно поэкспериментировать на практике и убедиться, что уже после второго десятка вложенных запросов время отклика серьезно увеличится. В любом случае на практике не встречаются задачи, требующие использовать чрезвычайно сложный MySQL-запрос. В запросе может потребоваться максимально до 3-5 вложенных иерархий.
Построение вложенных запросов
При анализе прочитанной информации возникает ряд вопросов о том, где могут быть использованы вложенные запросы и нельзя ли решить задачу разбиением их на простые без усложнения структуры. На практике вложенные запросы используются для решения сложных задач. К такому типу задач относятся ситуации, когда заранее неизвестно условие, по которому будет происходить ограничение дальнейшей выборки значений. Решить такие задачи невозможно, если просто использовать обычный MySQL-запрос. В запросе, состоящем из иерархий, будет происходить поиск ограничений, которые могут меняться с течением времени или заранее не могут быть известны.
Если рассматривать таблицу, приведенную выше, то в качестве сложной задачи можно привести следующий пример. Допустим, нам необходимо узнать основную информацию о сотрудниках, находящихся в подчинении Гришина Григория Григорьевича, который является При формировании запроса нам неизвестен его идентификационный номер. Поэтому изначально нам необходимо его узнать. Для этого используется простой запрос, который позволит найти решение главного условия и дополнит основной MySQL-запрос. В запросе наглядно представлено, что подзапрос получает идентификационный номер сотрудника, который в дальнейшем определяет ограничение главного запроса:
В данном случае предложение any используется для того, чтобы исключить возникновение ошибок, если сотрудников с такими инициалами окажется несколько.
Итоги
Подводя итог, необходимо отметить, что существует ещё много других дополнительных возможностей, которые значительно облегчают построение запросов, так как СУБД MySQL - мощное средство с богатым арсеналом инструментов для хранения и обработки данных.
В данной статье мы рассмотрим способы обращения к таблицам баз данный MySQL с помощью языка запросов SQL. SQL - это аббревиатура, которая так и "раскрывается" - структуризированный язык запросов.
В языке PHP для это цели существует целый ряд функций с префиксом "mysql". Нам для рассмотрения запросов понадобится не так много из них. Функция, без которой в языке PHP выполнение SQL-запросов было бы просто невозможным:
Resource mysql_query(запрос)
Данная функция посылает запрос к базе данных и возвращает в случае успешного обращения идентификатор ресурса.
Для того чтобы подключиться к базе данных MySQL необходимо выполнить следующую последовательность:
$host="localhost"; // имя хоста (уточняется у провайдера) $database="db_name"; // имя базы данных, которую вы должны создать $user="user_name"; // заданное вами имя пользователя, либо определенное провайдером $pswd="your_pass"; // заданный вами пароль $dbh = mysql_connect($host, $user, $pswd) or die("Не могу соединиться с MySQL."); mysql_select_db($database) or die("Не могу подключиться к базе.");
Итак mysql_connect()
- функция для подключения к серверу MySQL на Вашем хостинге.
А mysql_select_db()
выбирает базу данных на сервере для подключения.
Иными словами подключаемся к серверу, выбираем базу и начинаем работать.
Функция die() вызывается в случае ошибки и выводит в окно браузера сообщение, которое вы указали.
Для завершения работы с базами данных используется функция:
Mysql_close($dbh);
Здесь $dbh
- дескриптор, которые при соединении возвратила функция mysql_connect
.
Закончив стартовый обзор, начнем рассмотрение собственно SQL-запросов.
Для этого прежде всего вам необходимо создать базу данных с определенном именем. А в ней создать таблицу, тоже с конкретным именем. В наших примерах будем обращаться к таблице my_sql_table
. Чтобы создать эту таблицу давайте выполним в phpmyadmin нашего localhost следующий запрос:
CREATE TABLE `my_sql_table` (`id` INT NOT NULL , // идентификатор будущих записей таблицы `firstname` VARCHAR(50) NOT NULL , // текстовое поле VARCHAR `surname` VARCHAR(50) NOT NULL , // max длиной 50 символов PRIMARY KEY (`id`) // первичный ключ - идентификатор id);
Итак таблица создана. Выполним первый запрос, который сразу оформим в виде PHP-кода:
\n";
echo "Имя: ".$row["firstname"]."
\n";
echo "Фамилия: ".$row["surname"]."
\n"; } ?>
Разберем PHP-код файла firstsql.php . Начнем с собственно запроса к таблицам базы данных (БД).
$query = "SELECT * FROM `my_sql_table`";
Данный запрос можно расшифровать так: выбрать из таблицы my_sql_table БД все записи из всех полей. Таким образом знак * после слова SELECT означает "выбрать абсолютно все". Итак, запрос сформирован. Теперь его надо выполнить:
$res = mysql_query($query);
В случае успешного выполнения запроса функция mysql_query()
вернет нам идентификатор ресурса $res
.
Его мы должны передать в качестве параметра в функцию mysql_fetch_array()
. Название этой функции говорит само за себя. Т.е. она формирует и выдает массив по выборке из таблицы БД. В случае нашей таблицы массив будет состоять из числа элементов, равных количествам записей (строк) в таблице и содержать значения id, firstname, surname
для каждой строки таблицы. Следовательно, следующий код:
While($row = mysql_fetch_array($res))
{
echo "Номер: ".$row["id"]."
\n";
echo "Имя:".$row["firstname"]."
\n";
echo "Фамилия:".$row["surname"]."
\n"; }
можно прокомментировать так: пока введенная нами переменная $row получает не нулевые результаты работы функции mysql_fetch_row
следует выдать в броузер значение полей $row["id"], $row["firstname"], $row["surname"]
с помощью echo
.
Если запрос выполнить так:
$query = "SELECT firstname FROM `my_sql_table`";
то это будет означать, что из всех строк выбирается только значения поля firstname.
Следовательно предыдущий код следует переписать как:
$res = mysql_query($query);
while($row = mysql_fetch_array($res))
{
echo "Имя:".$row["firstname"]."
\n";
}
Если Вы хотите выбрать строки таблицы с конкретным значением id где фамилия (surname) будет Петров , то запрос перепишется следующим образом:
$query = "SELECT id FROM `my_sql_table` where surname="Петров"";
А вот если потребуется узнать фамилию того, кто находится под номером, к примеру, 5, то запрос будет таким:
$query = "SELECT surname FROM `my_sql_table` where id=5";
В этом случае Вы знаете, что результатом запроса будет всего одна строка из таблицы. Т.е. нет смысла организовывать цикл с использованием while . И обработка запроса будет следующей
$res = mysql_query($query); $row = mysql_fetch_row($res); echo "Фамилия пятого человека в списке: ".$row."\n";
Здесь вместо mysql_fetch_array() мы применили mysql_fetch_row() . Т.е. получить значение поля (или полей) конкретной строки. Поскольку поле у нас было одно - surname - мы можем обратиться к единственному элементу массива $row как $row; .
Итак, рассмотрим наиболее типичные примеры запросов MySQL. Рассмотрение проведем на базе таблицы my_sql_table
:
1. Добавим в таблицу my_sql_table поле middle_name (отчество) после surname
:
$query = "ALTER TABLE `my_sql_table` ADD `middle_name`
VARCHAR(50) NOT NULL AFTER `surname`";
2. Теперь удалим поле surname из таблицы my_sql_table:
$query = "ALTER TABLE `my_sql_table` DROP `surname`";
3. Удаляем записи из таблицы my_sql_table с фамилией Сидоров:
$query = "DELETE FROM `my_sql_table` where surname="Сидоров"";
4. Помимо знаков равенства, также "больше" или "меньше", в языке MySQL запросов существует понятие "похоже на ". Выберем записи из таблицы my_sql_table, где в фамилии встречается "дор " :
$query = "SELECT * FROM `my_sql_table` where surname like "%дор%"";
Здесь наличие "%
" в начале и конце "дор" и означает, что запрос будет искать именно "дор", причем не важно в начале, конце, или середине фамилии он находится. Рассмотрим следующий пример
5. Выберем записи из таблицы my_sql_table с фамилией, которая начинается на П
. Обратите внимание на расположение "%
":
$query = "SELECT * FROM `my_sql_table` where surname like "П%"";
6. Вычислим максимальное значение id :
$query = "SELECT MAX(id) FROM `my_sql_table`";
7. Вычислим количество полей в my_sql_table с фамилией, которая начинается на П .
$query = "SELECT COUNT(*) FROM `my_sql_table` where surname like "П%"";
8. Удаление таблицы my_sql_table:
$query = "DROP TABLE `my_sql_table`";
Для запросов 1-3 на языке PHP достаточно просто выполнить запрос:
Mysql_query($query);
Мы рассмотрели наиболее характерные примеры запросов. Полагаю, с их помощью, следуя элементарной логике, Вы сможете выполнять более сложные запросы к созданным Вами таблицам баз данных MySQL.
Есть еще вопросы или что-то непонятно - добро пожаловать на наш | |
|
(PHP 4, PHP 5, PHP 7)
header — Send a raw HTTP header
Description
header (string $header [, bool $replace = TRUE [, int $http_response_code ]]) : void
header() is used to send a raw HTTP header. See the » HTTP/1.1 specification for more information on HTTP headers.
Remember that header() must be called before any actual output is sent, either by normal HTML tags, blank lines in a file, or from PHP. It is a very common error to read code with include , or require , functions, or another file access function, and have spaces or empty lines that are output before header() is called. The same problem exists when using a single PHP/HTML file.
/* This will give an error. Note the output
* above, which is before the header() call */
header
();
exit;
?>
Parameters
The header string.
There are two special-case header calls. The first is a header that starts with the string "HTTP/ " (case is not significant), which will be used to figure out the HTTP status code to send. For example, if you have configured Apache to use a PHP script to handle requests for missing files (using the ErrorDocument directive), you may want to make sure that your script generates the proper status code.
header
("HTTP/1.0 404 Not Found"
);
?>
The second special case is the "Location:" header. Not only does it send this header back to the browser, but it also returns a REDIRECT (302) status code to the browser unless the 201 or a 3xx status code has already been set.
header ("Location: http://www.example.com/" ); /* Redirect browser */
/* Make sure that code below does not get executed when we redirect. */
exit;
?>
Replace
The optional replace parameter indicates whether the header should replace a previous similar header, or add a second header of the same type. By default it will replace, but if you pass in FALSE as the second argument you can force multiple headers of the same type. For example:
header
("WWW-Authenticate: Negotiate"
);
header
("WWW-Authenticate: NTLM"
,
false
);
?>
Http_response_code
Forces the HTTP response code to the specified value. Note that this parameter only has an effect if the header is not empty.
Return Values
No value is returned.
Changelog
Version | Description |
---|---|
5.1.2 | This function now prevents more than one header to be sent at once as a protection against header injection attacks. |
Examples
Example #1 Download dialog
If you want the user to be prompted to save the data you are sending, such as a generated PDF file, you can use the » Content-Disposition header to supply a recommended filename and force the browser to display the save dialog.
// We"ll be outputting a PDF
header
("Content-Type: application/pdf"
);
// It will be called downloaded.pdf
header
("Content-Disposition: attachment; filename="downloaded.pdf""
);
// The PDF source is in original.pdf
readfile
("original.pdf"
);
?>
Example #2 Caching directives
PHP scripts often generate dynamic content that must not be cached by the client browser or any proxy caches between the server and the client browser. Many proxies and clients can be forced to disable caching with:
header
("Cache-Control: no-cache, must-revalidate"
);
// HTTP/1.1
header
("Expires: Sat, 26 Jul 1997 05:00:00 GMT"
);
// Date in the past
?>
You may find that your pages aren"t cached even if you don"t output all of the headers above. There are a number of options that users may be able to set for their browser that change its default caching behavior. By sending the headers above, you should override any settings that may otherwise cause the output of your script to be cached.
«An obsolete version of the HTTP 1.1 specifications (IETF RFC 2616) required a complete absolute URI for redirection. The IETF HTTP working group found that the most popular web browsers tolerate the passing of a relative URL and, consequently, the updated HTTP 1.1 specifications (IETF RFC 7231) relaxed the original constraint, allowing the use of relative URLs in Location headers.»
Workaround: do not send those headers.
Also, be aware that IE versions 5, 6, 7, and 8 double-compress already-compressed files and do not reverse the process correctly, so ZIP files and similar are corrupted on download.
Workaround: disable compression (beyond text/html) for these particular versions of IE, e.g., using Apache"s "BrowserMatch" directive. The following example disables compression in all versions of IE:
BrowserMatch ".*MSIE.*" gzip-only-text/html
4. Relative URIs are NOT allowed
wrong: Location: /something.php?a=1
wrong: Location: ?a=1It will make proxy server and http clients happier.
15 years ago
If you haven"t used, HTTP Response 204 can be very convenient. 204 tells the server to immediately termiante this request. This is helpful if you want a javascript (or similar) client-side function to execute a server-side function without refreshing or changing the current webpage. Great for updating database, setting global variables, etc.
Header("status: 204"); (or the other call)
header("HTTP/1.0 204 No Response");15 years ago
A call to session_write_close() before the statement
header ("Location: URL" );
exit();
?>
is recommended if you want to be sure the session is updated before proceeding to the redirection.We encountered a situation where the script accessed by the redirection wasn"t loading the session correctly because the precedent script hadn"t the time to update it (we used a database handler).
9 months ago
// Beware that adding a space between the keyword "Location" and the colon causes an Internal Sever Error
//This line causes the error
7
header("Location: index.php&controller=produit&action=index");// While It must be written without the space
header("Location: index.php&controller=produit&action=index");1 year ago
The header call can be misleading to novice php users.
when "header call" is stated, it refers the the top leftmost position of the file and not the "header()" function itself.
"10 years ago
Here is a php script I wrote to stream a file and crypt it with a xor operation on the bytes and with a key:
The encryption works very good but the speed is decrease by 2, it is now 520KiB/s. The user is now asked for a md5 password (instead of keeping it in the code directly). There is some part in French because it"s my native language so modify it as you want.
// Stream files and encrypt the data on-the-fly
// Settings
// -- File to stream
$file = "FILE_out" ;
// -- Reading buffer
$bufferlength = 3840 ;
// -- Key in hex
//$keychar = "9cdfb439c7876e703e307864c9167a15";// Function: Convertion hex key in a string into binary
function hex2bin ($h ) {
if (! is_string ($h )) return null ;
$r = array();
for ($a = 0 ; ($a * 2 )< strlen ($h ); $a ++) {
$ta = hexdec ($h [ 2 * $a ]);
$tb = hexdec ($h [(2 * $a + 1 )]);
$r [ $a ] = (int) (($ta << 4 ) + $tb );
}
return $r ;
}// Function to send the auth headers
function askPassword ($text = "Enter the password" ) {
header ("WWW-Authenticate: Basic realm="" . utf8_decode ($text ) . """ );
header ("HTTP/1.0 401 Unauthorized" );
return 1 ;
}// Key is asked at the first start
if (!isset($_SERVER [ "PHP_AUTH_PW" ])) {
askPassword ();
echo "Une clé est nécessaire !
" ;
exit;
}
// Get the key in hex
$keychar = $_SERVER [ "PHP_AUTH_PW" ];// Convert key and set the size of the key
$key = hex2bin ($keychar );
$keylength = count ($key );
// Teste si la clé est valide en hex
if ($key == "" || $keylength <= 4 ) {
askPassword ("Clé incorrecte !" );
//echo "Clé incorrecte !
";
exit();
}
// Teste si la clé est de longueur d"une puissance de 2
if (($keylength % 2 ) != 0 ) {
askPassword ("Clé de longueur incorrecte (multiple de 2 uniquement)" );
//echo "Clé de longueur incorrecte (puissance de 2 uniquement)
";
exit();
}// Headers
header ("Content-Type: application/octet-stream; " );
header ("Content-Transfer-Encoding: binary" );
header ("Content-Length: " . filesize ($file ) . "; " );
header ("filename=\"" . $file . "\"; " );
flush (); // this doesn"t really matter.// Opening the file in read-only
$fp = fopen ($file , "r" );
while (! feof ($fp ))
{
// Read a buffer size of the file
$buffer = fread ($fp , $bufferlength );
$j = 0 ;
for ($i = 0 ; $i < $bufferlength ; $i ++) {
// The key is read in loop to crypt the whole file
if ($i % $keylength == 0 ) {
$j = 0 ;
}
// Apply a xor operation between the key and the file to crypt
// This operation eats a lots of CPU time (Stream at 1MiB/s on my server; Intel E2180)
$tmp = pack ("C" , $key [ $j ]);
$bufferE = ($buffer [ $i ]^ $tmp ); // <==== Le fameux XOR/*
echo "
key[".$j."]: ";
var_dump($tmp);
echo "
buffer[".$i."]: ";
var_dump($buffer[$i]);
echo "
bufferE: ";
var_dump($bufferE);
echo "
";
//*/// Send the encrypted data
echo $bufferE ;
// Clean the memory
$bufferE = "" ;
$j ++;
}
$buffer = "" ;
flush (); // this is essential for large downloads
/*
fclose($fp);
exit();
//*/
}
// Close the file and it"s finished
fclose ($fp );