使用PHP计算Oracle中SELECTED行的数量 - php

我正在为大学做这个项目,这基本上是一个电影数据库,对于几个查询,我需要知道选择了多少行。目前,我需要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个查询来对行进行计数,然后选择实际数据,并且仅太多的代码行就无法对行进行计数。

这段代码没有显示它(尚未完成,因为我正在寻找更好的解决方案),但我还需要为电影导演/编剧做同样的事情。

有没有更好,更简单的解决方案来完成此任务,或者这是唯一的方法?

我可以在fetch循环中添加分隔符,直到完成为止,然后使用PHP函数修剪字符串中的最后一个分隔符,但是对于该项目,我不得不使用SEQUENCES,VIEWS,FUNCTIONS,PROCEDURES和TRIGGERS。这些都有助于解决我的问题吗?

我知道SEQUENCES是什么,我已经在使用它们了,但是我看不出它们有什么帮助。

对于VIEWS,他们可能不会简化代码太多(它基本上是存储的查询吗?)。就功能,程序和触发器而言,据我所知,我也看不出它们也有什么帮助。

解决方案?

参考方案

为什么初始计数完全没有?只需发布电影标题的选择即可。如果找不到,请执行错误处理。如果是,请继续!如果您确实需要计数,请使用分析将计数添加到查询中:

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

您的流派选择也是如此。

编辑:

Analytic Functions link上的Oracle文档。我发现从Oracle文档中获取分析有点困难。 Analytic functions by Example by Shouvik Basu提供了一些有关如何使用它们的简单指导,对我有很大帮助。

PHP strtotime困境 - php

有人可以解释为什么这在我的服务器上输出为true吗?date_default_timezone_set('Europe/Bucharest'); var_dump( strtotime('29.03.2015 03:00', time()) === strtotime('29.03.2015 04:00�…

PHP-全局变量的性能和内存问题 - php

假设情况:我在php中运行一个复杂的站点,并且我使用了很多全局变量。我可以将变量存储在现有的全局范围内,例如$_REQUEST['userInfo'],$_REQUEST['foo']和$_REQUEST['bar']等,然后将许多不同的内容放入请求范围内(这将是适当的用法,因为这些数据指的是要求自…

php-casperjs获取内部文本 - php

我正在为casperjs使用php包装器-https://github.com/alwex/php-casperjs我正在网上自动化一些重复的工作,我需要访问一个项目的innerText,但是我尚不清楚如何从casperjs浏览器访问dom。我认为在js中我会var arr = document.querySelector('label.input…

PHP-从最后一个循环中删除逗号 - php

我在循环时有一个PHP,如果是最后一个循环,我想从,中删除​​最后一个逗号echo '],'; while($ltr = mysql_fetch_array($lt)){ echo '['; echo $ltr['days']. ' ,'. $ltr['name…

PHP Laravel从另一个驱动器读取文件 - php

我目前正在学习Laravel。我想知道是否有一种方法可以在Laravel中使用Storage::从另一个硬盘访问文件(使用Windows)。例如,我在驱动器C:上安装了带有Laravel的Xampp,但是我想访问网站目录之外的E:上的文件。我试过使用Storage::files('E:')和File::files('E:…