2010-12-06 12 views
12

我正在爲大學做這個項目,這個項目基本上是一個電影數據庫,對於一些查詢我需要知道有多少行被選中。目前,有2種情況,我需要這樣的:用PHP計算Oracle中SELECTED行的數量

  • 顯示單個影片信息。我希望所選行的數量知道數據庫是否包含用戶選擇的電影。 或者有更好的解決方案嗎?
  • 該選定的電影有類型,我需要知道多少,這樣我才能構造一個字符串,其中的類型以|分隔,而不會在字符串的末尾添加一個。

用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來說,它們可能不會簡化代碼那麼多(它基本上是一個存儲的查詢正確的?)。對於功能,程序和觸發器,據我所知,我看不出有什麼幫助。

解決方案?

+0

將+1標記爲家庭作業 – Knubo 2010-12-06 17:27:40

+0

您的數據庫模式已設置,還是應該創建它? – Knubo 2010-12-06 17:29:04

+0

oci_num_rows如何不同? – Breezer 2010-12-06 17:29:31

回答

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

可以使用ocirowcount應該表現得方式類似於mysql_num_rows使得在進行選

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

乾杯

0

oci_num_rows()會給你總行數,如果執行AFTER oci_fetch_array()