Spec-Zone .ru
спецификации, руководства, описания, API
|
Copyright 1997-2012 PHP Documentation Group.
Эти понятия являются определенными для драйверов MySQL для PHP.
Copyright 1997-2012 PHP Documentation Group.
Запросы используют буферизованный режим по умолчанию. Это означает, что результаты запроса были сразу переданы от MySQL Server to PHP в, тогда сохраняется в памяти процесса PHP. Это позволяет дополнительные операции как подсчет числа строк, и перемещения (поиска) текущего указателя результата. Это также позволяет выпускать дальнейшие запросы на том же самом соединении, работая над набором результатов. Нижняя сторона буферизованного режима - то, что большие наборы результатов могли бы потребовать довольно большого количества памяти. Память будет сохранена занятой, пока все ссылки на набор результатов не будут сброшены, или набор результатов был явно освобожден, который автоматически произойдет во время конца запроса последнее. Терминология "результат хранилища" также используется для буферизованного режима, поскольку целый набор результатов сохранен сразу.
При использовании libmysqlclient, поскольку библиотека предел памяти PHP не будет считать память используемой для наборов результатов, если данные не будут выбраны в переменные PHP. С mysqlnd учтенная память будет включать полный набор результатов.
Небуферизованные запросы MySQL выполняют запрос и затем возвращают ресурс, в то время как данные все еще ожидают на сервере MySQL того, что были выбраны. Это использует меньше памяти на PHP-стороне, но может увеличить загрузку на сервере. Если полный набор результатов не был выбран от сервера, никакие дальнейшие запросы не могут быть отправлены по тому же самому соединению. Небуферизованные запросы могут также упоминаться как "результат использования".
После этих характеристик буферизованные запросы должны использоваться в случаях, где Вы ожидаете только ограниченный набор результатов или должны знать количество возвращенных строк прежде, чем считать все строки. Небуферизованный режим должен использоваться, когда Вы ожидаете большие результаты.
Поскольку буферизованные запросы являются значением по умолчанию, примеры ниже будут демонстрировать, как выполнить небуферизованные запросы с каждым API.
Пример 22.15. Небуферизованный пример запроса: mysqli
<?php$mysqli = new mysqli("localhost", "my_user", "my_password", "world");$uresult = $mysqli->query("SELECT Name FROM City", MYSQLI_USE_RESULT);if ($uresult) { while ($row = $uresult->fetch_assoc()) { echo $row['Name'] . PHP_EOL; }}$uresult->close();?>
Пример 22.16. Небуферизованный пример запроса: pdo_mysql
<?php$pdo = new PDO("mysql:host=localhost;dbname=world", 'my_user', 'my_pass');$pdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false);$uresult = $pdo->query("SELECT Name FROM City");if ($uresult) { while ($row = $uresult->fetch(PDO::FETCH_ASSOC)) { echo $row['Name'] . PHP_EOL; }}?>
Пример 22.17. Небуферизованный пример запроса: mysql
<?php$conn = mysql_connect("localhost", "my_user", "my_pass");$db = mysql_select_db("world");$uresult = mysql_unbuffered_query("SELECT Name FROM City");if ($uresult) { while ($row = mysql_fetch_assoc($uresult)) { echo $row['Name'] . PHP_EOL; }}?>
Copyright 1997-2012 PHP Documentation Group.
Идеально надлежащий набор символов будет установлен на уровне сервера, и выполнение этого описывается в
пределах раздела
Набор символов должен быть понят и определен, поскольку он имеет влияние на каждом действии, и
включает импликации безопасности. Например, механизм выхода (например, mysqli_real_escape_string
для mysqli, mysql_real_escape_string
для mysql, и PDO::quote
Пример 22.18. Проблемы с установкой набора символов с SQL
<?php$mysqli = new mysqli("localhost", "my_user", "my_password", "world");// Will not affect $mysqli->real_escape_string();$mysqli->query("SET NAMES utf8");// Will not affect $mysqli->real_escape_string();$mysqli->query("SET CHARACTER SET utf8");// But, this will affect $mysqli->real_escape_string();$mysqli->set_charset('utf8');?>
Ниже примеры, которые демонстрируют, как должным образом изменить набор символов во времени выполнения, используя каждый каждый API.
Пример 22.19. Подавание примера набора символов: mysqli
<?php$mysqli = new mysqli("localhost", "my_user", "my_password", "world");if (!$mysqli->set_charset('utf8')) { printf("Error loading character set utf8: %s\n", $mysqli->error);} else { printf("Current character set: %s\n", $mysqli->character_set_name());}print_r( $mysqli->get_charset() );?>
Пример 22.20. Установка набора символов example:pdo_mysql
Отметьте: Это только работает с PHP 5.3.6.
<?php$pdo = new PDO("mysql:host=localhost;dbname=world;charset=utf8", 'my_user', 'my_pass');?>
Пример 22.21. Подавание примера набора символов: mysql
<?php$conn = mysql_connect("localhost", "my_user", "my_pass");$db = mysql_select_db("world");if (!mysql_set_charset('utf8', $conn)) { echo "Error: Unable to set the character set.\n"; exit;}echo 'Your current character set is: ' . mysql_client_encoding($conn);?>