четверг, 24 января 2019 г.

Разбиваем большие запросы на страницы

Разбиваем большие запросы на страницы

Автор: Дмитрий Бородин
Учимся разбивать большие запросы на страницы, как в поисковых машинах

Часть 1

Создадим файл default.php, который содержит базовые фукнции. Вам надо подправить параметры (host/user/pass/base)
<? PHP 

// Глобальная переменная. Например, нужна в функции коннекта.
$ Носка = ложь;


// новые функции
function sql ($ a) {return mysql_query ($ a); }
function sqlrows ($ a) {return @mysql_num_rows ($ a); }
функция sqlval ($ a, $ b, $ c) {return @mysql_result (mysql_query ($ a), $ b, $ c); }
function sqlget ($ a) {return @mysql_fetch_array ($ a); }
function sqlline ($ a) {return sqlget (sql ($ a)); }
function sqllast () {return mysql_insert_id (); }


// коннект к серверу
function connect () {
глобальный носок;

   $ Хост = "*****";
   $ Пользователю = "*****";
   $ База = "*****";
   $ Передать = "*****";   

   $ Носок = @ mysql_connect ($ хозяин, $ пользователь, $ проход);
   if (! $ sock ||! @mysql_select_db ($ base, $ sock))
      die("Сервер временно не работает");

   снят с охраной ($ хост);
   снят с охраной ($ пользователь);
   снята с охраны ($ основание);
   снята с охраны ($ проход);

}

// замена die()
function xdie ($ zapros = "", $ info = "") {
   die ("</ table> </ table> </ table> </ table> <hr> <h3> ************ $ info *********** <br> <br>
   ОШИБКА SQL ..... N ".mysql_errno ().": ".Mysql_error ()." </ H3> <pre> $ zapros </ pre> <hr> ");
}


?>

Часть 2

Данный файл (create.php) создаст таблицу limit_test и забьет в нее 500 строк вида из разных строк.
<? PHP

   включают в себя ( "./ default.php");

   подключения ();

   // удаляем таблицу (на всякий случай)
   sql ("DROP TABLE limit_test");
   // создаем
   if (! sql ("CREATE TABLE limit_test (id int, s char (100))"))
      xdie("","Таблица не создана");
   
   srand (время ());

   // создаем запрос вида << ... VALUES (x, "xx"), (y, "yy"), ... (z, "zz") >>
   $ s = "INSERT INTO limit_test VALUES";

   для ($ i = 0; $ i <500; $ i ++) {

      . $ S = "($ я, \" ";
      $ Х = Rand (1,100);
      для ($ j = 0; $ j <$ x; $ j ++) $ s. = chr (rand (ord ('a'), ord ('z')));
      . $ S = "\") ";
      if ($ i + 1 <500) $ s. = ",";

   }

   // выполняем запрос, чтобы наполнить таблицу данными
   if (!sql($s)) xdie($s,"Таблица не заполнена");

?>

Часть 3

Собственно, сам файл (search.php), который выводит на экран форму для поиска и выводит найденные результаты по ?? штук на страницу.
<body bgcolor = black text = white link = # 9999cc vlink = # cc9999> <font face = arial>
<?

   включают в себя ( "./ default.php");

   if (! isset ($ z)) $ z = "";
   if (isset ($ all)) $ all = intval ($ all);
   if (isset ($ start)) $ start = intval ($ start);
   if (isset ($ len)); $ len = intval ($ len);
   иначе $ 10 = 10;

   echo "<form action = $ PHP_SELF method = get>
<тип ввода = скрытое имя = значение z = поиск>
Что ищем: 
<input type = text name = s value = '$ s'>
Строк:
<input type = text name = len value = '$ len' size = 5>
& NBSP; <input type = submit value = 'search'> <br> <br>
Спец. символы:
<font color=#ff6666><b><big>_</big></b></font> - заменяет 1 любую букву,
<font color=#ff6666><b><big>%</big></b></font> - заменяет любую последовательность букв.
Поиск '<b>%</b>' - найдет все строки, поиск '<b>_</b>' - только строки,
состоящие из 1 символа. Если поискать 'a', то, скорее всего, ничего
не будет найдено, однако строки '%a%' точно найдутся.<br>
</ Форма> ";

   switch ($ z) {

   кейс "поиск":

      подключения ();

      $ query = "SELECT s FROM limit_test WHERE SIKE '$ s'";

      if (! isset ($ start)) {

          if (! ($ res = sql ($ query))) xdie ($ query, "ошибка");
          $ Начать = 0;
          $ все = sqlrows ($ Рез);

      } еще {

         $ query. = "LIMIT $ start, $ len";
         if (! ($ res = sql ($ query))) xdie ($ query, "ошибка");

      }
      
      echo "Запрос: <font color = # 00ff00> $ query </ font> <br> <br>";

      for ($ j = 1; $ j <= $ len && $ tmp = sqlget ($ res); $ j ++) {
         echo ($ start + $ j). ". $ tmp [s] <br>";
         $ Stop--;
      }

      эхо "<br>";
      для ($ i = 1; $ i <= floor ($ all / $ len); $ i ++)
         echo "<a href = $ PHP_SELF? z = search & all = $ all & len = $ len &".
              "start =". (($ i-1) * $ len). "& s =". urlencode ($ s). "> $ i </a>";

      перерыв;
   }
   

?>