Я делаю этот проект для университета, который в основном представляет собой базу данных фильмов, и для нескольких запросов мне нужно знать, сколько строк было выбрано. Пока что есть две ситуации, в которых мне это нужно:
- Отображение информации одного фильма. Я хочу, чтобы подсчет выбранных строк знал, содержит ли база данных выбранный фильм пользователем. Или есть лучшее решение для этого?
- У выбранного фильма есть жанры, мне нужно знать, сколько я могу построить строку с жанрами, разделенными
|
без добавления одного в конец строки.
С 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 они, вероятно, не упростили бы этот код (это в основном хранимый запрос?). Для ФУНКЦИЙ, ПРОЦЕДУР и ТРИГГЕРОВ, насколько я понимаю, я не вижу, как они могут помочь.
Решения?