oci_parse - Contando el número de filas SELECCIONADAS en Oracle con PHP
oci_num_rows select statement (4)
¿Por qué el conteo inicial en absoluto? Solo emita su selección para el título de la película. Si no se encuentra, procesa el error. Si es así, ¡continúa! Si realmente necesita el conteo, use una analítica para agregar el conteo a su consulta:
''SELECT title, year, synopsis, poster_url
, COUNT(*) OVER (PARTITION BY mid) mcount
FROM movies
WHERE mid = ''.$mid
Lo mismo aplica para tu selección de géneros.
EDITAR:
Documentación de Oracle en el enlace Funciones analíticas . Descubrí que los análisis son un poco difíciles de obtener de los documentos de Oracle. Las funciones analíticas por ejemplo de Shouvik Basu proporcionan una guía simple sobre cómo usarlas y me ayudaron bastante.
Estoy haciendo este proyecto para la universidad, que es básicamente una base de datos de películas y para un par de consultas necesito saber cuántas filas fueron seleccionadas. Por ahora, hay 2 situaciones en las que necesito esto:
- Muestra una sola información de película . Quiero que el recuento de las filas seleccionadas sepa si la base de datos contiene la película seleccionada por el usuario. ¿O hay una mejor solución para esto?
- Esa película seleccionada tiene géneros, necesito saber cuántos para poder construir una cadena con los géneros separados por
|
sin agregar uno al final de la cadena.
Con MySQL esto es fácil, solo mysql_num_rows()
la base de datos y uso mysql_num_rows()
pero oci_num_rows()
no funciona exactamente igual para la instrucción SELECT.
La única solución que encontré con OCI / PHP es esta:
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?
}
Pero no me gusta Siempre necesito hacer 2 consultas para contar las filas y luego seleccionar los datos reales y hay demasiadas líneas de código solo para contar las filas.
Este código no lo muestra (aún no lo he hecho porque estoy buscando una mejor solución) pero también tendré que hacer lo mismo con los directores / escritores de la película.
¿Hay alguna solución mejor y más simple para lograr esto o esta es la única manera?
Podría agregar separadores en el ciclo de búsqueda hasta que termine y luego usar las funciones PHP para recortar el último separador de la cadena, pero para este proyecto estoy obligado a usar SECUENCIAS, VISTAS, FUNCIONES, PROCEDIMIENTOS y ACTIVADORES. ¿Alguno de estos ayuda a resolver mi problema?
Sé lo que son las SECUENCIAS, las estoy usando ya, pero no veo cómo pueden ayudar.
Para VIEWS, probablemente no simplifiquen tanto el código ( básicamente es una consulta almacenada ¿verdad? ). Para FUNCTIONS, PROCEDURES y TRIGGERS, por lo que yo los entiendo, no veo cómo pueden ser de ninguna ayuda.
Soluciones?
puedes usar el ocirowcount debe comportarse como mysql_num_rows al hacer una selección
Puedes intentar esto
$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);
Aclamaciones
oci_num_rows () le dará el recuento total de filas si se ejecuta DESPUÉS de oci_fetch_array ()