Ich mache dieses Projekt für die Universität, die im Grunde eine Filmdatenbank ist und für ein paar Abfragen muss ich wissen, wie viele Zeilen ausgewählt wurden. Vorerst gibt es zwei Situationen, in denen ich diese benötigen:Zählen der Anzahl der SELECTED Zeilen in Oracle mit PHP
- Anzeige einen einziger Film Informationen. Ich möchte die Anzahl der ausgewählten Zeilen wissen, ob die Datenbank den ausgewählten Film vom Benutzer enthält. Oder gibt es dafür eine bessere Lösung?
- Dieser ausgewählte Film hat Genres, ich muss wissen, wie viele, so dass ich eine Zeichenfolge mit den Genres durch
|
getrennt konstruieren kann, ohne ein Ende der Zeichenfolge hinzufügen.
Mit MySQL so einfach ist, ich Abfrage nur die Datenbank und verwenden mysql_num_rows()
aber oci_num_rows()
funktioniert nicht ganz das gleiche für die SELECT-Anweisung.
Die einzige Lösung, die ich mit OCI/PHP gefunden, ist dies:
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?
}
Aber ich mag es nicht. Ich muss immer 2 Abfragen machen, um die Zeilen zu zählen, und dann die tatsächlichen Daten auswählen, und es gibt zu viele Codezeilen, nur um die Zeilen zu zählen.
Dieser Code zeigt es nicht (habe es noch nicht getan, weil ich nach einer besseren Lösung suche), aber ich muss auch das gleiche für die Filmregisseure machen.
Gibt es bessere und einfacher Lösung, um dies zu erreichen, oder das ist der einzige Weg?
Ich könnte Trennzeichen in der Fetch-Schleife hinzufügen, bis es beendet und dann PHP-Funktionen verwenden, um das letzte Trennzeichen aus der Zeichenfolge zu trimmen, aber für dieses Projekt bin ich gezwungen, SEQUENZEN, ANSICHTEN, FUNKTIONEN, VERFAHREN und TRIGGER zu verwenden. Kann ich Ihnen helfen, mein Problem zu lösen?
Ich weiß, was SEQUENZEN sind, ich benutze sie bereits, aber ich sehe nicht, wie sie helfen können.
Für VIEWS, würden sie wahrscheinlich nicht den Code so viel vereinfachen (es ist im Grunde eine gespeicherte Abfrage richtig?). Für FUNKTIONEN, VERFAHREN und TRIGGERS, soweit ich sie verstehe, kann ich nicht sehen, wie sie auch helfen können.
Lösungen?
+1 für die Kennzeichnung als Hausaufgabe – Knubo
Ist Ihr DB-Schema festgelegt oder sollten Sie es erstellen? – Knubo
Wie ist oci_num_rows anders? – Breezer