Ric*_*ral 12 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?
}
Run Code Online (Sandbox Code Playgroud)
但我不喜欢它.我总是需要进行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
Run Code Online (Sandbox Code Playgroud)
您的流派选择也是如此.
编辑:
有关分析功能的 Oracle文档链接.我发现从Oracle文档中获取分析有点困难.Shouvik Basu的示例分析函数为如何使用它们提供了一些简单的指导并帮助了我很多.
小智 5
你可以试试这个
$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);
Run Code Online (Sandbox Code Playgroud)
干杯
归档时间: |
|
查看次数: |
26547 次 |
最近记录: |