Подтвердить что ты не робот

Подсчет числа SELECTED строк в Oracle с PHP

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

  • Отображение информации одного фильма. Я хочу, чтобы подсчет выбранных строк знал, содержит ли база данных выбранный фильм пользователем. Или есть лучшее решение для этого?
  • У выбранного фильма есть жанры, мне нужно знать, сколько я могу построить строку с жанрами, разделенными | без добавления одного в конец строки.

С MySQL это легко, я просто запрашиваю базу данных и использую mysql_num_rows(), но oci_num_rows() не работает совершенно одинаково для оператора SELECT.

Единственное решение, которое я нашел в OCI/PHP, следующее:

if(is_numeric($mid) && $mid > 0) {
        $stid = oci_parse($db,
            'SELECT COUNT(*) AS NUM_ROWS
            FROM movies
            WHERE mid = '.$mid
        );

        oci_define_by_name($stid, 'NUM_ROWS', $num_rows);
        oci_execute($stid);
        oci_fetch($stid);

        if($num_rows > 0) {
            $stid = oci_parse($db,
                'SELECT title, year, synopsis, poster_url
                FROM movies
                WHERE mid = '.$mid
            );

            oci_execute($stid);

            $info = oci_fetch_assoc($stid);

            $stid = oci_parse($db,
                'SELECT COUNT(*) AS NUM_ROWS
                FROM genres g, movies_genres mg
                WHERE mg.mid = '.$mid.' AND g.gid = mg.gid'
            );

            oci_define_by_name($stid, 'NUM_ROWS', $num_rows);
            oci_execute($stid);
            oci_fetch($stid);

            $stid = oci_parse($db,
                'SELECT g.name AS genre
                FROM genres g, movies_genres mg
                WHERE mg.mid = '.$mid.' AND g.gid = mg.gid');

            oci_execute($stid);

            $genres_list = null;

            while($row = oci_fetch_assoc($stid)) {
                $genres_list .= $row['GENRE'];

                if($num_rows > 1) {
                    $genres_list .= ' | ';
                    $num_rows--;
                }
            }

            $Template->assignReferences(array(
                'Index:LinkURI'    => $link_uri,
                'Movie:Title'      => $info['TITLE'],
                'Movie:Year'       => $info['YEAR'],
                'Movie:GenresList' => $genres_list,
                'Movie:Synopsis'   => $info['SYNOPSIS'],
                'Movie:PosterURL'  => $info['POSTER_URL'] // FIX: Handle empty poster link
            ));

            $Template->renderTemplate('movieinfo');
        } else {
            // TODO: How to handle this error?
        }
    } else {
        // TODO: How to handle this error?
    }

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

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

Есть ли лучшее и более простое решение для выполнения этого или это единственный способ?

Я мог бы добавить разделители в цикл выборки до тех пор, пока он не завершится, а затем воспользуемся функциями PHP, чтобы обрезать последний разделитель из строки, но для этого проекта я вынужден использовать SEQUENCES, VIEWS, FUNCTIONS, PROCEDURES и TRIGGERS. Кто-нибудь из них помогает решить мою проблему?

Я знаю, что такое SEQUENCES, я их уже использую, но я не понимаю, как они могут помочь.

Для VIEWS они, вероятно, не упростили бы этот код (это в основном хранимый запрос?). Для ФУНКЦИЙ, ПРОЦЕДУР и ТРИГГЕРОВ, насколько я понимаю, я не вижу, как они могут помочь.

Решения?

4b9b3361

Ответ 1

Почему начальный счет вообще? Просто выберите свой выбор для названия фильма. Если он не найден, выполните обработку ошибок. Если да, продолжайте! Если вам действительно нужен счетчик, используйте аналитику, чтобы добавить счет к вашему запросу:

'SELECT title, year, synopsis, poster_url
      , COUNT(*) OVER (PARTITION BY mid) mcount
   FROM movies
  WHERE mid = '.$mid

То же самое касается выбора жанра.

EDIT:

Документация Oracle по Ссылка на аналитические функции. Я обнаружил, что аналитикам трудно получить из документов Oracle. Аналитические функции по примеру Shouvik Basu содержат некоторые простые указания относительно того, как их использовать и помогли мне совсем немного.

Ответ 2

Вы можете попробовать это

$conn = oci_pconnect('user', 'password', 'connectionstring');
$resource = oci_parse($conn, $sql);
oci_execute($resource, OCI_DEFAULT);

$results=array();
$numrows = oci_fetch_all($resource, $results, null, null, OCI_FETCHSTATEMENT_BY_ROW);

Приветствия

Ответ 3

вы можете использовать ocirowcount, он должен вести себя так же, как mysql_num_rows при создании

Ответ 4

oci_num_rows() Дает вам общее количество строк, если выполнено AFTER oci_fetch_array()