Разбить длинный вызов метода для mysql в php

У меня есть этот метод, и вопрос в том, как я могу разбить эту очень длинную строку, чтобы она не превышала 85-120 символов? Для записи я не делал этот код сам, это старый проект с открытым исходным кодом, который я адаптировал под свои нужды.

function doQuery($sql)
{
    $this->counter++;
    $result = $this->unbuffered ? mysqli_query($this->db, $sql, MYSQLI_USE_RESULT) or $this->error = true and $this->errormessage = mysqli_error($this->db) : mysqli_query($this->db, $sql) or $this->error = true and $this->errormessage = mysqli_error($this->db);
    return new ResultSet($result);
    }

Вот оригинальный метод, мне пришлось настроить его для php 7, но, возможно, я облажался. Я не профессиональный программист, чисто хобби.

/**
* Query the database
*
* @param    string      sql query string
* @throws   DatabaseException
* @return   ResultSet
*/
function doQuery($sql) {
    $this->counter++;
    $result = $this->unbuffered ? @mysql_unbuffered_query($sql, $this->db) or $this->error = true and $this->errormessage = mysql_error() : @mysql_query($sql, $this->db) or $this->error = true and $this->errormessage = mysql_error();
    return new ResultSet($result);
}

Я скорректировал первый метод, спасибо Биллу Карвину.

/**
 * Query the database
 * 
 * @param string $sql sql query string.
 * 
 * @throws DatabaseException
 * 
 * @return ResultSet.
 */
function doQuery($sql)
{
    $this->counter++;

    if ($this->unbuffered) {
        $resultmode = MYSQLI_USE_RESULT;
    } else {
        $resultmode = MYSQLI_STORE_RESULT;
    }

    $result = mysqli_query($this->db, $sql, $resultmode);

    // If anything goes wrong.
    if ($result === false) {
        $this->error = true;
        $this->errormessage = mysqli_error($this->db);
    }
    return new ResultSet($result);
}

Примите любой стандарт кодирования, какой пожелаете. Вы можете сломать его на любом пробеле или специальном символе.

El_Vanja 12.12.2020 17:41

я использую стандарт кодирования груши. Итак, если я правильно понимаю, я могу разбить его на пробел, чтобы разделить длинную строку, например, на 4 строки?

dugo666 12.12.2020 17:43

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

El_Vanja 12.12.2020 18:00

Я бы избавился от всего метода. Эта функция является мусором, и вы никогда не должны использовать его. Вместо этого включите правильную отчетность об ошибках. Как получить сообщение об ошибке в MySQLi?

Dharman 12.12.2020 18:17

Я не шучу, но я, честно говоря, не понимаю, что должен делать этот код, и сомневаюсь, что он вообще работает. ИМХО, он должен генерировать исключение или давать действительно неправильные результаты. Возможно, если вы объясните причину этого метода, мы сможем предложить несколько лучших альтернатив.

Dharman 12.12.2020 18:22

Ну, если честно, я тоже этого не понимаю, я не делал этот код. это проект с открытым исходным кодом, который я модифицировал под свои нужды. он относительно старый, я несколько раз обновлял код. Хорошая новость в том, что это работает для моего личного использования, плохая новость в том, что я не понимаю таких частей, как $this->unbuffered или ? или : операторы. Итак, я понимаю, что с точки зрения кодирования это не имеет никакого смысла, как и сообщения об ошибках, но сейчас это не вопрос.

dugo666 12.12.2020 19:01
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
2
6
84
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Есть цитата Брайана Кернигана, которую важно помнить, когда вы программист:

«Все знают, что отладка в два раза сложнее, чем написание программы. Итак, если вы настолько умны, насколько это возможно, когда вы ее пишете, как вы вообще сможете ее отлаживать?»

Вот попытка кода, который работает так же, но более понятен:

function doQuery($sql)
{
    $this->counter++;

    if ($this->unbuffered) {
        $resultmode = MYSQLI_USE_RESULT;
    } else {
        $resultmode = MYSQLI_STORE_RESULT;
    }

    $result = mysqli_query($this->db, $sql, $resultmode);

    if ($result === false) {
        $this->error = true;
        $this->errormessage = mysqli_error($this->db);
    }

    return new ResultSet($result);
}

Обновлено: исправлена ​​строка error = true.

Конечно, я не тестировал этот код в вашем проекте. Так что если есть что-то, чего я не заметил в том, как работает другой код в проекте, я бы этого не знал. Если вы попробуете это, я рекомендую вам сначала сохранить копию вашего текущего кода, чтобы, если это не сработает, вы могли легко восстановить предыдущий код.


Объясняя некоторые раздражающие хитрости исходного кода.

Оператор ? : похож на структуру if/then/else, за исключением того, что вы можете использовать его как выражение. Другими словами, вы можете присвоить значение выражения другой переменной, в отличие от if/then/else.

$var = (1 == 2) ? "yes" : "no";

Это работает следующим образом: оценивается первый экспресс (1 == 2). Если это правда, то результатом будет выражение после ?. Если результат первого выражения ложный, то результатом является выражение после :.

В этом примере переменной присваивается значение «нет».

Откровенно говоря, хотя этот формат кажется умным, чем больше я получаю опыта как программиста, тем реже мне нравится его использовать. Включение большего количества логики в одно выражение может сократить количество строк кода, но это усложняет отладку кода, его трудно изменить и на самом деле не делает его более быстрым, чем если бы вы прописали все это с помощью if/then/else структур.

В этой части используется еще один прием:

mysqli_query($this->db, $sql, MYSQLI_USE_RESULT) or $this->error = true and $this->errormessage = mysqli_error($this->db)

Он основан на логическом коротком замыкании, что означает, что если вы пишете выражение вроде A OR B, то сначала оценивается A, а если оно истинно (или что-то вроде истинного), то B не нужно оценивать, потому что true OR anything в конечном итоге будет истинным в любом случае.

В этом случае mysqli_query() вернет ресурс результата, который является своего рода «истинным» или, по крайней мере, не является буквально ложным. Но если в SQL-запросе ошибка, то mysqli_query() однозначно возвращает false (так написано в документации ). Таким образом, то, что находится справа от or в этом выражении, будет оцениваться только в том случае, если mysqli_query() содержит ошибку.

Последний трюк заключается в том, что хотя = является присваиванием (а не ==, которое является сравнением на равенство), его можно использовать в выражении. Это означает, что выражение возвращает назначенное значение, но у выражения также есть побочный эффект, заключающийся в том, что оно присваивает значения переменным.

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


Вы также спрашивали об этом в комментариях ниже:

isset($_GET["sort"]) ? $sort = $_GET["sort"] : $sort = "name";

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

if (isset($_GET["sort"])) {
    $sort = $_GET["sort"];
} else {
    $sort = "name";
}

Этот пример тернарного оператора также можно было бы записать так:

$sort = isset($_GET["sort"]) ? $_GET["sort"] : "name";

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

Наконец, PHP ввел еще одно сокращенное обозначение, потому что такого рода задачи очень распространены.

$sort = $_GET["sort"] ?: "name";

Это означает, что если в массиве "sort" есть ключ $_GET, прочитайте его, но если ключа нет в массиве, вернитесь к значению "name".

Это то, что я действительно могу понять, спасибо! это имеет больше смысла, чем описанный выше метод

dugo666 12.12.2020 19:39

Я рад, что вы поняли, как это работает, еще раз спасибо!

dugo666 12.12.2020 20:27

Вас интересует какое-либо объяснение исходного кода, или вы так же счастливы забыть о нем? :-)

Bill Karwin 12.12.2020 20:55

Все еще учусь каждый день, так что да, мне интересно! это ? и: своего рода краткий стиль для if else?

dugo666 12.12.2020 22:09

Другой вопрос: isset($_GET["sort"]) ? $sort = $_GET["сортировка"] : $sort = "имя"; я нашел это, и это немного объясняет: stackoverflow.com/questions/1506527/…

dugo666 12.12.2020 22:20

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

dugo666 13.12.2020 11:27

Да, если они связаны с первым вопросом, продолжайте. Если это новые вопросы, пожалуйста, создайте новый пост.

Bill Karwin 13.12.2020 18:21

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

Bill Karwin 13.12.2020 18:23

Другие вопросы по теме