使用PHP计算Oracle中的SELECTED行数

前端之家收集整理的这篇文章主要介绍了使用PHP计算Oracle中的SELECTED行数前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在为大学做这个项目,这个项目基本上是一个电影数据库,对于几个查询,我需要知道选择了多少行.现在有两种我需要的情况:

>显示单个电影信息.我想要所选行的计数,以知道数据库是否包含用户选择的电影.还是有更好的解决方案呢?
>所选的电影有类型,我需要知道有多少,以便我可以构造一个字符串与类别由|分隔没有添加到字符串的末尾.

使用MySQL这很简单,我只是查询数据库并使用MysqL_num_rows(),但是oci_num_rows()对于SELECT语句的工作不尽相同.

我用OCI / PHP找到的唯一解决方案是:

  1. if(is_numeric($mid) && $mid > 0) {
  2. $stid = oci_parse($db,'SELECT COUNT(*) AS NUM_ROWS
  3. FROM movies
  4. WHERE mid = '.$mid
  5. );
  6.  
  7. oci_define_by_name($stid,'NUM_ROWS',$num_rows);
  8. oci_execute($stid);
  9. oci_fetch($stid);
  10.  
  11. if($num_rows > 0) {
  12. $stid = oci_parse($db,'SELECT title,year,synopsis,poster_url
  13. FROM movies
  14. WHERE mid = '.$mid
  15. );
  16.  
  17. oci_execute($stid);
  18.  
  19. $info = oci_fetch_assoc($stid);
  20.  
  21. $stid = oci_parse($db,'SELECT COUNT(*) AS NUM_ROWS
  22. FROM genres g,movies_genres mg
  23. WHERE mg.mid = '.$mid.' AND g.gid = mg.gid'
  24. );
  25.  
  26. oci_define_by_name($stid,$num_rows);
  27. oci_execute($stid);
  28. oci_fetch($stid);
  29.  
  30. $stid = oci_parse($db,'SELECT g.name AS genre
  31. FROM genres g,movies_genres mg
  32. WHERE mg.mid = '.$mid.' AND g.gid = mg.gid');
  33.  
  34. oci_execute($stid);
  35.  
  36. $genres_list = null;
  37.  
  38. while($row = oci_fetch_assoc($stid)) {
  39. $genres_list .= $row['GENRE'];
  40.  
  41. if($num_rows > 1) {
  42. $genres_list .= ' | ';
  43. $num_rows--;
  44. }
  45. }
  46.  
  47. $Template->assignReferences(array(
  48. '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
  49. ));
  50.  
  51. $Template->renderTemplate('movieinfo');
  52. } else {
  53. // TODO: How to handle this error?
  54. }
  55. } else {
  56. // TODO: How to handle this error?
  57. }

但我不喜欢我总是需要进行2次查询来计算行数,然后选择实际的数据,并且有太多的代码行仅用于计算行数.

这段代码没有显示(还没有完成,因为我正在寻找一个更好的解决方案),但我也需要做同样的电影导演/作家.

有没有更好的和更简单的解决方案来完成这个或这是唯一的方法

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

我知道SEQUENCES是什么,我已经在使用它们,但我看不到他们如何帮助.

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

解决方案?

为什么初始计数呢?只需发送您的电影标题选择.如果没有找到,请进行错误处理.如果是,继续吧!如果您真的需要计数,请使用分析将计数添加查询中:
  1. 'SELECT title,poster_url,COUNT(*) OVER (PARTITION BY mid) mcount
  2. FROM movies
  3. WHERE mid = '.$mid

同样适用于您的流派选择.

编辑:

Oracle文档在Analytic Functions link.我发现分析有点难以从Oracle文档中获取. Analytic functions by Example by Shouvik Basu提供了一些关于如何使用它们并帮助我的简单指导.

猜你在找的PHP相关文章