Подсчет количества ВЫБРАННЫХ строк в Oracle с PHP - PullRequest
12 голосов
/ 06 декабря 2010

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

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

С 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. Помогает ли что-нибудь из этого решить мою проблему?

Я знаю, что такое ПОСЛЕДОВАТЕЛЬНОСТИ, я их уже использую, но не понимаю, как они могут помочь.

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

Решения

Ответы [ 4 ]

5 голосов
/ 06 декабря 2010

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

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

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

EDIT:

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

2 голосов
/ 27 июня 2011

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

$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);

Приветствия

1 голос
/ 06 декабря 2010

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

0 голосов
/ 14 декабря 2017

oci_num_rows () даст вам общее количество строк, если выполнено ПОСЛЕ oci_fetch_array ()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...