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

时间:2010-12-06 17:23:23

标签: php sql oracle select

我正在为大学做这个项目,它基本上是一个电影数据库,对于一些查询,我需要知道选择了多少行。目前,有两种情况我需要这个:

  • 显示单部电影信息。我希望所选行的计数知道数据库是否包含用户选择的电影。 或者有更好的解决方案吗?
  • 选定的电影有类型,我需要知道有多少,以便我可以构建一个字符串,其中的类型由|分隔,而不会在字符串的末尾添加一个。

使用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,他们可能不会那么简化代码(它基本上是一个存储的查询对吧?)。对于FUNCTIONS,PROCEDURES和TRIGGERS,据我了解,我看不出他们怎么能有任何帮助。

解决方案?

4 个答案:

答案 0 :(得分:5)

为什么最初的计数呢?只需发出你的电影片名选择。如果找不到,请进行错误处理。如果是,继续!如果确实需要计数,请使用分析将计数添加到查询中:

'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提供了一些关于如何使用它们的简单指导并帮助了我很多。

答案 1 :(得分: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);

干杯

答案 2 :(得分:1)

你可以使用ocirowcount进行选择时它应该像mysql_num_rows一样

答案 3 :(得分:-1)

oci_num_rows()如果在oci_fetch_array()

之后执行,将给出总行数