Как получить построитель запросов для вывода его необработанного SQL-запроса в виде строки?


545

Учитывая следующий код:

DB::table('users')->get();

Я хочу получить необработанную строку запроса SQL, которую сгенерирует построитель запросов базы данных выше. В этом примере это было бы SELECT * FROM users.

Как мне это сделать?


14
Laravel Eloquent ORM получает необработанный запрос:echo User::where('status', 1)->toSql();
Мухаммед Шахзад,

Я использую пакет для Laravel - Telescope, он регистрирует все запросы и делает еще много вещей.
Винса

Ответы:


662

Для вывода на экран последних выполненных запросов вы можете использовать это:

DB::enableQueryLog(); // Enable query log

// Your Eloquent query executed by using get()

dd(DB::getQueryLog()); // Show results of log

Я считаю, что самые последние запросы будут в нижней части массива.

У вас будет что-то вроде этого:

array(1) {
  [0]=>
  array(3) {
    ["query"]=>
    string(21) "select * from "users""
    ["bindings"]=>
    array(0) {
    }
    ["time"]=>
    string(4) "0.92"
  }
}

(Благодаря комментарию Джошуа ниже.)


2
хм, я не уверен, но вы можете достичь того, чего хотите, с помощью пакета композитора stackoverflow.com/a/17339752/813181
jfortunato

9
Может быть даже лучше вывести его в журнал вашего приложения, используя Logкласс: Log::debug(DB::getQueryLog())
msturdy

35
Возможно, вам понадобится включить это, так как сейчас оно по умолчанию отключено. Вы можете использовать эту команду, чтобы временно включить ее:DB::enableQueryLog();
Джошуа Фрик

5
Я попробовал твой ответ. То, что я пытался, DB::enableQueryLog(); dd(DB::getQueryLog());но это возвращается только []....
Я самый глупый человек

6
Если у вас есть несколько баз данных, вам может потребоваться сделать этоDB::connection('database')->getQueryLog()
Damien Ó Ceallaigh

745

Используйте toSql()метод на QueryBuilderэкземпляре.

DB::table('users')->toSql() вернется:

выберите * из `users`

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


6
Я думаю, что это самый простой способ при использовании Eloquent вне Laravel
Gab

8
@Stormsson Это невозможно, потому что PHP никогда не заменяет запрос связанными значениями. Чтобы получить запросы в полном объеме, вам нужно зарегистрировать их в MySQL. Больше информации здесь: stackoverflow.com/questions/1786322/…
Матфея

40
@Stormsson вы можете использовать getBindingsметод. Это вернет привязки для того, чтобы они были связаны с оператором SQL.
danronmoon

2
Очень полезно для отладки сложных запросов, которые Eloquent отказывается выполнять, так как они не отображаются в журнале запросов.
BobChao87

34
Получить запрос с привязками$query = \DB::table('users')->where('id', 10); $sql = str_replace_array('?', $query->getBindings(), $query->toSql()); dd($sql);
Эннио Соуза

88

DB::QueryLog()работать только после выполнения запроса $builder->get(). Если вы хотите получить запрос до его выполнения, вы можете использовать $builder->toSql()метод. Вот пример, как получить sql и связать его:

    $query = str_replace(array('?'), array('\'%s\''), $builder->toSql());
    $query = vsprintf($query, $builder->getBindings());
    dump($query);

    $result = $builder->get();

ИЛИ просто сделайте ваш запрос ошибки, например, вызов несуществующей таблицы или столбца, вы увидите сгенерированный запрос в исключении XD


3
Это, безусловно, лучший ответ, простой и прямой к сути. Спасибо :)
Собакус

18
Как однострочник:$query = vsprintf(str_replace(array('?'), array('\'%s\''), $builder->toSql()), $builder->getBindings());
kramer65

Это должно быть включено во фреймворк как нативная функция .. спасибо
Томаш Млезива

Обратите внимание, что это не будет работать, если ваш запрос уже имеет знаки процента, например, для LIKEзапроса или при форматировании дат. Вам нужно сначала убежать с двойными знаками процента.
Неизвестный Дев

Есть ли проблемы безопасности при этом? Обеззаражены ли крепления $builder->getBindings()?
Солидо

56

Вы можете прослушать событие «световые запросы». Перед запросом добавьте следующий прослушиватель событий:

Event::listen('illuminate.query', function($query, $params, $time, $conn) 
{ 
    dd(array($query, $params, $time, $conn));
});

DB::table('users')->get();

Это распечатает что-то вроде:

array(4) {
  [0]=>
  string(21) "select * from "users""
  [1]=>
  array(0) {
  }
  [2]=>
  string(4) "0.94"
  [3]=>
  string(6) "sqlite"
}

1
Я получаю вызов неопределенному методу Illuminate \ Database \ Query \ Builder :: listen () в Laravel 4
Мигель Стивенс

2
Спасибо, это здорово. Приятно отметить, что dd - это функция, которая создает Dump для заданной переменной и use Illuminate\Support\Facades\Event;
завершает

1
@radtek: Вместо этого use Illuminate\Support\Facades\Event;вы можете просто сделать, use Event;так как это фасад .
TachyonVortex

50

Если вы пытаетесь получить Журнал с помощью Illuminate без использования Laravel:

\Illuminate\Database\Capsule\Manager::getQueryLog();

Вы также можете добавить быструю функцию, например, так:

function logger() {
    $queries = \Illuminate\Database\Capsule\Manager::getQueryLog();
    $formattedQueries = [];
    foreach( $queries as $query ) :
        $prep = $query['query'];
        foreach( $query['bindings'] as $binding ) :
            $prep = preg_replace("#\?#", is_numeric($binding) ? $binding : "'" . $binding . "'", $prep, 1);
        endforeach;
        $formattedQueries[] = $prep;
    endforeach;
    return $formattedQueries;
}

РЕДАКТИРОВАТЬ

обновленные версии, по-видимому, по умолчанию отключают ведение журнала запросов (приведенное выше возвращает пустой массив). Чтобы снова включить, при инициализации Capsule Manager захватите экземпляр соединения и вызовите enableQueryLogметод

$capsule::connection()->enableQueryLog();

ИЗМЕНИТЬ СНОВА

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

$sql = $query->toSql();
$bindings = $query->getBindings();

я получаю этот тип возврата из запроса "name = [{" name ":" rifat "}]" что мне нужно сделать, чтобы получить только "name = rifat"?
бестелесный

Я бы распечатал ваши привязки, похоже, вы передаете массив вместо строки
Люк Сноуден

Это полезное начало, но, кажется, не следует добавлять одинарные кавычки вокруг параметризованных значений, например, когда я передаю строку вроде 'US/Eastern'.
Райан

1
@ Райан, это правда, поэтому я и сказал quick function. Я полагаю, что базовый код будет использовать методы prepare ( php.net/manual/en/mysqli.prepare.php ), поэтому ?требуется только метод . Вы можете php.net/manual/en/function.is-numeric.php, чтобы определить, следует ли инкапсулировать ввод в одинарные кавычки.
Люк Сноуден

1
@LukeSnowden Ваш ответ гениален! Я наконец нашел время, чтобы опробовать вашу новую версию (которую я отредактировал выше, чтобы включить вашу is_numericидею), и она работает! Мне это нравится. Спасибо.
Райан

36

В eloquent есть метод для получения строки запроса.

toSql ()

в нашем случае

 DB::table('users')->toSql(); 

возвращение

select * from users

это точное решение, которое возвращает строку запроса SQL .. Надеюсь, это полезно ...


11
как насчет привязки запроса? Например, когда вы делаете ->where('foo', '=', 'bar')бар не будет показывать в sql
Toskan

28
$data = User::toSql();
echo $data; //this will retrun select * from users. //here User is model

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

Спасибо за ваш комментарий.
Кулдип Мишра

2
Вы можете добавить, ->toSql()как если бы после модели было больше аргументов. НапримерUser::where('id', 1)->toSql()
Тоби Меллор

24

Если вы используете laravel 5.1 и MySQL, вы можете использовать эту функцию, сделанную мной:

/*
 *  returns SQL with values in it
 */
function getSql($model)
{
    $replace = function ($sql, $bindings)
    {
        $needle = '?';
        foreach ($bindings as $replace){
            $pos = strpos($sql, $needle);
            if ($pos !== false) {
                if (gettype($replace) === "string") {
                     $replace = ' "'.addslashes($replace).'" ';
                }
                $sql = substr_replace($sql, $replace, $pos, strlen($needle));
            }
        }
        return $sql;
    };
    $sql = $replace($model->toSql(), $model->getBindings());

    return $sql;
}

В качестве входного параметра вы можете использовать любой из этих

Осветить \ Database \ Eloquent \ Builder

Осветить \ Database \ Eloquent \ Отношения \ HasMany

Осветить \ Database \ Query \ Builder


Ответ улучшен, чтобы включить все замечания, сделанные в комментариях. Большое спасибо.
Евгений Афанасьев

13

Сначала вам нужно будет включить журнал запросов, позвонив:

DB::enableQueryLog();

после запросов с использованием фасада БД вы можете написать:

dd(DB::getQueryLog());

вывод будет как ниже:

array:1 [▼
  0 => array:3 [▼
    "query" => "select * from `users` left join `website_user` on `users`.`id` = `website_user`.`user_id` left join `region_user` on `users`.`id` = `region_user`.`user_id` left ▶"
    "bindings" => array:5 [▶]
    "time" => 3.79
  ]
]

очень полезный ответ
Anoop PS

Привет, я использовал $ result = DB :: select ('select * from sqrt_user_modules, где user_id =: id', ['id' => $ user]); DB :: enableQueryLog (); но не получил никакого вывода dd (DB :: getQueryLog ());
Anoop PS

нужно ли нам включать какую-либо библиотеку
Anoop PS

1
Шаг 1: DB :: enableQueryLog (); шаг 2: $ result = DB :: select ('select * from sqrt_user_modules, где user_id =: id', ['id' => $ user]); шаг 3: дд (DB :: getQueryLog ());
Рави Грива

13

Это лучшее решение, которое я могу предложить любому для отладки красноречивого последнего или последнего запроса, хотя это также обсуждалось:

// query builder
$query = DB::table('table_name')->where('id', 1);

// binding replaced
$sql = str_replace_array('?', $query->getBindings(), $query->toSql());

// for laravel 5.8^
$sql = Str::replaceArray('?', $query->getBindings(), $query->toSql());

// print
dd($sql);

10

Первый способ:

Просто вы можете делать следующие вещи, используя toSql()метод,

$query = DB::table('users')->get();

echo $query->toSql();

Если он не работает, вы можете настроить его из документации Laravel .

Второй способ:

Еще один способ сделать это

DB::getQueryLog()

но если он возвращает пустой массив, то по умолчанию он отключен, посетите это ,

просто включите, DB::enableQueryLog()и это будет работать :)

для получения дополнительной информации посетите Github Issue, чтобы узнать больше об этом.

Надеюсь, поможет :)


10

«Macroable» замена , чтобы получить SQL запрос с креплениями.

  1. Добавьте ниже макрос-функцию в метод.AppServiceProvider boot()

    \Illuminate\Database\Query\Builder::macro('toRawSql', function(){
        return array_reduce($this->getBindings(), function($sql, $binding){
            return preg_replace('/\?/', is_numeric($binding) ? $binding : "'".$binding."'" , $sql, 1);
        }, $this->toSql());
    });
  2. Добавьте псевдоним для Eloquent Builder. ( Laravel 5.4+ )

    \Illuminate\Database\Eloquent\Builder::macro('toRawSql', function(){
        return ($this->getQuery()->toRawSql());
    });
  3. Затем отлаживайте как обычно. ( Laravel 5.4+ )

    Например, Query Builder

    \Log::debug(\DB::table('users')->limit(1)->toRawSql())

    Например, Eloquent Builder

    \Log::debug(\App\User::limit(1)->toRawSql());

Примечание: с Laravel 5.1 до 5.3, поскольку Eloquent Builder не использует эту Macroableчерту, не может добавлять toRawSqlпсевдоним Eloquent Builder на лету. Следуйте приведенному ниже примеру, чтобы добиться того же.

Например, Eloquent Builder ( Laravel 5.1 - 5.3 )

\Log::debug(\App\User::limit(1)->getQuery()->toRawSql());

Ой, я опоздал. Просто хочу отправить ответ с помощью макроса. Это самый хороший ответ. Должен быть принят ответ: D
nmfzone

Вы можете абстрагировать последнее в область видимости на базовой модели
Ожье


7

От Laravel 5.2и далее. Вы можете использовать, DB::listenчтобы получить выполненные запросы.

DB::listen(function ($query) {
    // $query->sql
    // $query->bindings
    // $query->time
});

Или, если вы хотите отладить один Builderэкземпляр, вы можете использовать toSqlметод.

DB::table('posts')->toSql(); 

1
Функция прослушивания полезна, объявляйте ее перед выполнением запроса и выводите sql & bindings в методе. Несовершенный, но работает быстрее / проще, чем другие ответы.
Андрей

7

Самый простой способ - сделать преднамеренную ошибку . Например, я хочу увидеть полный запрос SQL следующего отношения:

 public function jobs()
        {
            return $this->belongsToMany(Job::class, 'eqtype_jobs')
                   ->withPivot(['created_at','updated_at','id'])
                   ->orderBy('pivot_created_at','desc');
        }

Я просто делаю столбец, который не будет найден, здесь я выбираю created_atи изменил его created_ats, добавив трейлинг s:

public function jobs()
            {
                return $this->belongsToMany(Job::class, 'eqtype_jobs')
                       ->withPivot(['created_ats','updated_at','id'])
                       ->orderBy('pivot_created_at','desc');
            }

Итак, отладчик вернет следующую ошибку:

(4/4) ErrorException SQLSTATE [42S22]: Column не найдено: 1054 Неизвестные колонки 'eqtype_jobs.created_ats' в 'списке полей' (SQL: выберите jobs*. eqtype_jobs. , set_idКак pivot_set_id, eqtype_jobs. , job_idКак pivot_job_id, eqtype_jobs. , created_ats Как pivot_created_ats, eqtype_jobs. , updated_atКак pivot_updated_at, eqtype_jobs. , idКак pivot_idиз jobsвнутреннее соединение eqtype_jobsс jobs. id= eqtype_jobs. , job_idгде eqtype_jobs. set_id= 56 упорядочить по pivot_created_atпределу по убыванию 20 смещение 0) (Вид: /home/said/www/factory/resources/views/set/show.blade.php)

Приведенное выше сообщение об ошибке возвращает полный запрос SQL с ошибкой

SQL: select  jobs.*, eqtype_jobs.set_id as pivot_set_id,  eqtype_jobs.job_id as pivot_job_id, eqtype_jobs.created_ats as pivot_created_ats, eqtype_jobs.updated_at as  pivot_updated_at, eqtype_jobs.id as pivot_id from jobs inner join eqtype_jobs on jobs.id = eqtype_jobs.job_id where  eqtype_jobs.set_id = 56 order by pivot_created_at desc limit 20 offset 0

Теперь просто удалите лишний sиз созданного_атла и протестируйте этот SQL, как вам нравится, в любом редакторе SQL, таком как редактор SQL phpMyAdmin!

Примечание:

Решение было протестировано с Laravel 5.4 .


2
Это лучший ответ на сегодняшний день! Так просто! :)
Пикард

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

@ShanthaKumara Действительно, я не знаю, какую версию или конфигурацию Laravel вы использовали. Однако каждый фрагмент или код в моем ответе был скопирован и вставлен из вывода реального кода проекта Laravel 5.4.
СаидбакР

6

Чтобы увидеть выполненный запрос Laravel, используйте журнал запросов laravel

DB::enableQueryLog();

$queries = DB::getQueryLog();

6

Начиная с Laravel 5.8.15, у построителя запросов теперь есть dd и dumpметоды, так что вы можете делать

DB::table('data')->where('a', 1)->dump();

Спасибо. ДД работает очень хорошо. DB :: table ('data') -> где ('a', 1) -> dd ();
Waqas

Лучше, чем другие ответы в списке.
Хамис А. Хан

5

Это функция, которую я поместил в свой базовый класс модели. Просто передайте объект построителя запросов в него, и строка SQL будет возвращена.

function getSQL($builder) {
  $sql = $builder->toSql();
  foreach ( $builder->getBindings() as $binding ) {
    $value = is_numeric($binding) ? $binding : "'".$binding."'";
    $sql = preg_replace('/\?/', $value, $sql, 1);
  }
  return $sql;
}


4

Для laravel 5.5.X

Если вы хотите получать каждый SQL-запрос, выполняемый вашим приложением, вы можете использовать метод listen. Этот метод полезен для регистрации запросов или отладки. Вы можете зарегистрировать прослушиватель запросов у поставщика услуг:

<?php

namespace App\Providers;

use Illuminate\Support\Facades\DB;
use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        DB::listen(function ($query) {
            // $query->sql
            // $query->bindings
            // $query->time
        });
    }

    /**
     * Register the service provider.
     *
     * @return void
     */
    public function register()
    {
        //
    }
}

Источник


4

Добавьте эту функцию в ваше приложение и просто позвоните.

function getQuery($sql){
        $query = str_replace(array('?'), array('\'%s\''), $sql->toSql());
        $query = vsprintf($query, $sql->getBindings());     
        return $query;
}

Вывод : "выберите * из userгде lang= 'en' и status= '1' порядок по updated_atпределу desc 25 смещение 0"


3

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

https://github.com/barryvdh/laravel-debugbar

Этот пакет хорош, когда у вас нет ошибок запроса. Если у вас ошибка SQL, она ничего не показывает
lewis4u


2

Если вы не используете Laravel, а используете пакет Eloquent, тогда:

use \Illuminate\Database\Capsule\Manager as Capsule;
use \Illuminate\Events\Dispatcher;
use \Illuminate\Container\Container;

$capsule = new Capsule;

$capsule->addConnection([
    // connection details
]);
// Set the event dispatcher used by Eloquent models... (optional)
$capsule->setEventDispatcher(new Dispatcher(new Container));

// Make this Capsule instance available globally via static methods... (optional)
$capsule->setAsGlobal();

// Setup the Eloquent ORM...(optional unless you've used setEventDispatcher())
$capsule->bootEloquent();

// Listen for Query Events for Debug
$events = new Dispatcher;
$events->listen('illuminate.query', function($query, $bindings, $time, $name)
{
    // Format binding data for sql insertion
    foreach ($bindings as $i => $binding) {
        if ($binding instanceof \DateTime) {
            $bindings[$i] = $binding->format('\'Y-m-d H:i:s\'');
        } else if (is_string($binding)) {
            $bindings[$i] = "'$binding'";`enter code here`
        }
    }

    // Insert bindings into query
    $query = str_replace(array('%', '?'), array('%%', '%s'), $query);
    $query = vsprintf($query, $bindings);

    // Debug SQL queries
    echo 'SQL: [' . $query . ']';
});

$capsule->setEventDispatcher($events);

2

Вы можете использовать часовой механизм

Clockwork - это расширение для Chrome для разработки на PHP, расширяющее Инструменты разработчика новой панелью, предоставляющей все виды информации, полезной для отладки и профилирования ваших приложений PHP, включая информацию о запросах, заголовках, получении и публикации данных, файлах cookie, данных сеансов, запросах к базе данных, маршруты, визуализация времени выполнения приложения и многое другое.

но работает и в Firefox


2

Я создал несколько простых функций для получения SQL и привязок из некоторых запросов.

/**
 * getSql
 *
 * Usage:
 * getSql( DB::table("users") )
 * 
 * Get the current SQL and bindings
 * 
 * @param  mixed  $query  Relation / Eloquent Builder / Query Builder
 * @return array          Array with sql and bindings or else false
 */
function getSql($query)
{
    if( $query instanceof Illuminate\Database\Eloquent\Relations\Relation )
    {
        $query = $query->getBaseQuery();
    }

    if( $query instanceof Illuminate\Database\Eloquent\Builder )
    {
        $query = $query->getQuery();
    }

    if( $query instanceof Illuminate\Database\Query\Builder )
    {
        return [ 'query' => $query->toSql(), 'bindings' => $query->getBindings() ];
    }

    return false;
}

/**
 * logQuery
 *
 * Get the SQL from a query in a closure
 *
 * Usage:
 * logQueries(function() {
 *     return User::first()->applications;
 * });
 * 
 * @param  closure $callback              function to call some queries in
 * @return Illuminate\Support\Collection  Collection of queries
 */
function logQueries(closure $callback) 
{
    // check if query logging is enabled
    $logging = DB::logging();

    // Get number of queries
    $numberOfQueries = count(DB::getQueryLog());

    // if logging not enabled, temporarily enable it
    if( !$logging ) DB::enableQueryLog();

    $query = $callback();

    $lastQuery = getSql($query);

    // Get querylog
    $queries = new Illuminate\Support\Collection( DB::getQueryLog() );

    // calculate the number of queries done in callback
    $queryCount = $queries->count() - $numberOfQueries;

    // Get last queries
    $lastQueries = $queries->take(-$queryCount);

    // disable query logging
    if( !$logging ) DB::disableQueryLog();

    // if callback returns a builder object, return the sql and bindings of it
    if( $lastQuery )
    {
        $lastQueries->push($lastQuery);
    }

    return $lastQueries;
}

Применение:

getSql( DB::table('users') );
// returns 
// [
//     "sql" => "select * from `users`",
//     "bindings" => [],
// ]

getSql( $project->rooms() );
// returns
// [
//     "sql" => "select * from `rooms` where `rooms`.`project_id` = ? and `rooms`.`project_id` is not null",
//     "bindings" => [ 7 ],
// ]

2

Столько, сколько я люблю эту структуру, я ненавижу, когда она действует как дерьмо.

DB::enableQueryLog()совершенно бесполезно. DB::listenодинаково бесполезен. Когда я сказал $query->count(), он показал часть запроса , но если я это сделаю $query->get(), ему нечего сказать.

Единственное решение, которое, по-видимому, работает согласованно, - это преднамеренно поместить некоторый синтаксис или другую ошибку в параметры ORM, например, несуществующее имя столбца / таблицы, запустить код в командной строке в режиме отладки, и он выдаст ошибку SQL. наконец, с полным проклятым запросом. В противном случае, мы надеемся, что ошибка появится в файле журнала при запуске с веб-сервера.


Журнал запросов работает нормально для меня по крайней мере. В вашем приложении должны быть другие ошибки
user1415066

1

Если вы используете tinker и хотите записать сформированный SQL-запрос, вы можете сделать

$ php artisan tinker
Psy Shell v0.9.9 (PHP 7.3.5  cli) by Justin Hileman
>>> DB::listen(function ($query) { dump($query->sql); dump($query->bindings); dump($query->time); });
=> null
>>> App\User::find(1)
"select * from `users` where `users`.`id` = ? limit 1"
array:1 [
  0 => 1
]
6.99
=> App\User {#3131
     id: 1,
     name: "admin",
     email: "admin@example.com",
     created_at: "2019-01-11 19:06:23",
     updated_at: "2019-01-11 19:06:23",
   }
>>>

1

Попробуй это:

$results = DB::table('users')->toSql();
dd($results);

Примечание: get () был заменен на toSql () для отображения необработанного SQL-запроса.


1

Мой способ сделать это, основанный на представлении журнала, нужно только изменить файл app/Providers/AppServiceProvider.php:

  1. Добавьте этот код в app/Providers/AppServiceProvider.php
/**
 * Bootstrap any application services.
 *
 * @return void
 */
public function boot()
{
    //
    DB::listen(function ($query) {
        $querySql = str_replace(['?'], ['\'%s\''], $query->sql);
        $queryRawSql = vsprintf($querySql, $query->bindings);
        Log::debug('[SQL EXEC]', [
                "raw sql"  => $queryRawSql,
                "time" => $query->time,
            ]
        );
    });
}
  1. Мой код дескриптора sql:
$users = DB::table('users')
    ->select(DB::raw('count(*) as user_count, username '))
    ->where('uid', '>=', 10)
    ->limit(100)
    ->groupBy('username')
    ->get()
;
dd($users);
  1. Смотрите журнал storage/logs/laravel-2019-10-27.log:
[2019-10-27 17:39:17] local.DEBUG: [SQL EXEC] {"raw sql":"select count(*) as user_count, username  from `users` where `uid` >= '10' group by `username` limit 100","time":304.21} 
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.