Перед созданием новой темы, пожалуйста, ознакомьтесь с FAQ по LinkorCMS

Функция Count для mysql (Комментарии)

Супер пользователь
Сообщений: 125
Прошу просто дать коменты к фун-и ниже:


<?
    /**<br />
     * Подсчитывает записи из таблицы.<br />
     * @param    String    $Name    Имя таблицы<br />
     * @param    string    $Where    Условия выборки<br />
     * @return    mixed<br />
     */<br />
    public function Count($Name, $Where = '', $Columns = '',
 $GroupBy = ''){<br />
        $this->StartQ('Database->Select()');<br />
        <br />
        $Columns2 = '';<br />
        if(is_array($Columns)){<br />
            foreach($Columns as $Column){<br />
                $Columns2 .= $Column != '' ? $Column.', ' : 
'';<br />
            }<br />
        }elseif($Columns != ''){<br />
            $Columns2 = $Columns.', ';<br />
        }<br />
        <br />
        if($Columns2 == ''){<br />
            $GroupBy = '';<br />
        }elseif($GroupBy == ''){<br />
            if(is_array($Columns)){<br />
                $GroupBy = ' GROUP BY '.$Columns[0];<br />
            }else{<br />
                $GroupBy = ' GROUP BY '.$Columns;<br />
            }<br />
        }else{<br />
            $GroupBy = ' GROUP BY '.$GroupBy;<br />
        }<br />
        <br />
        $sql = 'SELECT '.$Columns2.' COUNT(*) AS _C FROM '.$
this->Prefix().$Name.($Where != '' ? ' WHERE '.$Where : '').$Grou
pBy;<br />
        <br />
        if($this->MySQLQuery2($sql, 'Ошибка. SQL запрос(COUNT) не выполнен.')
){<br />
            $result = $this->SetResult($this->QueryResult);<br />
            return $result;<br />
        }else{<br />
            return false;<br />
        }<br />
    }
?>


-- Изменено "Fort": 11.02.2016 03:24 --
Разработчик
Сообщений: 605
Я лично не заморачиваюсь и пишу напрямую запросы, если надо. Метод Query() и другие это позволяют делать, причем удобно.

Для файловой БД я сделал такой примитив:

<?
    public function SelectCount($Name, $Where) {<br />
        $this->StartQ('Database->SelectCount()');<br />
        $data   = $this->GetTableData($Name);<br />
        $info   = $this->_GetTableInfo($Name);<br />
        $result = 0;<br />
        $i      = 0;<br />
        if($Where != ''){<br />
            foreach($data as &$row){<br />
                if(Parser_ParseWhereStr($Where, $row, $info,
 $i)){<br />
                    $result++;<br />
                }<br />
                $i++;<br />
            }<br />
        }else{<br />
            foreach($data as &$row){<br />
                if(isset($row[0])) $result++;<br />
            }<br />
        }<br />
<br />
        $this->Good();<br />
        return $this->SetResult($result);<br />
    }
?>


Не понимаю зачем так усложнять, коль вы хотите сделать метод подсчета. Класс БД придуман для абстракции, он дает почти одни и те же методы для написания универсальных запросов к БД. Если вы отказались от файловой БД, то смысла большого нет его наворачивать (если только не делать ORM из него, но ваш метод на это не тянет).

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

Если по делу, то именование переменных плохое. Уж назовите $Colums2 более говорящим именем.

Fort:
$Columns2 .= $Column != '' ? $Column.', ' : '';

Вот тут таки тернарный не ясно для чего. В одном случае у нас ничего не будет дополнено в переменную. А вообще можно и об impode подумать. Да и когда тернарный хоть и к месту, но плохо читается, то неплохо его подчеркивать с помощью скобок. Они все-равно на выполнение не повлияют.

Fort:
        if($Columns2 == ''){
            $GroupBy = '';
        }elseif($GroupBy == ''){

Мне кажется, что это результат непродуманности метода (попытка впихнуть две вещи одновременно).

Fort:
                $GroupBy = ' GROUP BY '.$Columns[0];

Если уж доколупываться... а вдруг массив пустой?

Ну и сообщения мне не нравятся. А так жду Count2() с поддержкой JOIN.

-- Изменено "Мартин": 11.02.2016 03:54 --
Супер пользователь
Сообщений: 125
Мартин:
Если уж доколупываться... а вдруг массив пустой?

Ну и сообщения мне не нравятся. А так жду Count2() с поддержкой JOIN.


там проверка $Columns2 должен быть не пуст, а если он не пуст, то массив тоже не пуст!
Не понял, что именно за сообщения ?

Понятно дело сложный запрос не написать, но лучше чем ничего.
Пока, что предполагается использовать для подсчета одинаковых значений объектов для категорий.
[0] => array ([collumn] => значение, [count] => значение)
Разработчик
Сообщений: 605
Fort:
Не понял, что именно за сообщения ?

Ну явно это не простой Select:

<?
$this->StartQ('Database->Select()'); 
?>

Другие сообщения в классе именуются в едином стиле, а это выбивается:

<?
$this->MySQLQuery2($sql, 'Ошибка. SQL запрос(COUNT) не выполнен.
')
?>


Fort:
там проверка $Columns2 должен быть не пуст, а если он не пуст, то массив тоже не пуст!

Да, вы правы. Если $Colums - пустой массив, foreach не произведет ни одной итерации и $Colums2 будет пустой строкой. До второй ветки условия мы просто не дойдем.

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

Просто уже пошли какие-то методы, которые составляют сложные запросы (ладно файловая БД, где COUNT очень просится чтобы сделать нормальную навигацию). Если речь не идет о файловой БД, то можно просто писать вручную подходящий для каждой ситуации запрос. Но если вам так удобнее, то делайте. Хотя это все очень пахнет ORM.
Супер пользователь
Сообщений: 125
Мартин:

Ну явно это не простой Select:
<?
$this->StartQ('Database->Select()'); 
?>

Другие сообщения в классе именуются в едином стиле, а это выбивается:
<?
$this->MySQLQuery2($sql, 'Ошибка. SQL запрос(COUNT) не выполнен.
')
?>
.

Коммент поправил. А про MySQLQuery2, то не считая моего он используется 12 раз в др. фун-я. Зачем пладить код который прописан в MySQLQuery2 ?? Я уже так сделал и в СЕЛЕКТе и наверное во всех остальных изменю для реально единого стиля, ну и кода меньше читать проще...

Как пример:
было

<?
    public function Insert($name, $values, $cols = ''){<
br />
        $this->StartQ('Database->Insert()');<br />
        $sql = 'INSERT INTO '.$this->Prefix().$name.($cols != '' ? ' ('.implode(',', $cols).')' 
: '').' VALUES ('.$values.')';<br />
        if($this->MySQLQuery($sql)){<br />
            $this->Good();<br />
            return true;<br />
        } else{<br />
            $this->Error('Ошибка. Запрос не выполнен.');<br />
            $this->MySQLError();<br />
            return false;<br />
        }<br />
    }
?>
стало

<?
public function Insert($name, $values, $cols = ''){<br />
        $this->StartQ('Database->Insert()');<br />
        $sql = 'INSERT INTO '.$this->Prefix().$name.($cols != '' ? ' ('.implode(',', $cols).')' 
: '').' VALUES ('.$values.')';<br />
        return $this->MySQLQuery2($sql, 'Ошибка. SQL запрос "INSERT INTO" не выполнен.');<br />
    }
?>
13 строк против пяти

-- Изменено "Fort": 18.02.2016 12:53 --
Гости не могут отвечать на темы. Войдите или Зарегистрируйтесь.
Здесь присутствуют
(пользователей: 0, гостей: 1)
Быстрый переход: