Moin Moin!
Von der SQL-Injection-Katastrophe und Syntax-Fehlern mal abgesehen ist dieses Verfahren alles andere als effizient:
function pruefeAufDoppeltenEintrag($verbindung, $schiffe_id, $starttermin) {
$query = "SELECT * FROMreisen
WHERE schiffe_id='$schiffe_id', starttermin='$starttermin'";
$ergebnis = mysql_query($query, $verbindung);$doppelt = false;
if (mysql_num_rows($ergebnis) > 0) {
$doppelt = true;
}
return $doppelt;
}
Die Datenbank (oder MySQL in diesem Fall ;-)) muß ALLE betroffenen Datensätze zusammensuchen, zwischenspeichern und im Worst Case auch übertragen, nur damit PHP sie anschließend wegwirft bzw. wegwerfen läßt.
SELECT COUNT(*) FROM ... WHERE ... liefert eine Zeile mit einer Spalte, die entweder 0 ist (WHERE-Bedingung nicht erfüllt) oder größer als 0 ist (WHERE-Bedingung erfüllt). Das kann oft komplett über Indexe laufen, spart jede Menge Datensammelei und benötigt nur Platz für einen Integer. Die Datenbank wird ihrer Freude darüber mit schnellerern Reaktionen bekunden.
Eine Variable dafür zu verbraten, ein Boolean abhängig von einem Boolschen Ausdruck zurückzugeben, macht auch unnütz Arbeit, nicht nur dem Schreiber, sondern auch dem Computer: return $count>0;
Arbeitet mehr als ein User mit dieser Oberfläche, kann zwischen der Abfrage auf "doppelt" (die negativ ausfällt) und dem Insert der neuen Daten ein zweiter User ebenfalls ein Insert ausführen. Beide Inserts werden erfolgreich sein, und die Datenbank ist inkonsistent. Um so etwas zu vermeiden, frickelt man üblicherweise nicht in der Applikation herum, sondern sorgt mittels eines UNIQUE CONSTRAINTs dafür, dass die Datenbank das zweite Insert schlicht verweigert. Wenn man die Bedingung für die Eindeutigkeit einer Tabellenzeile nicht in SQL ausdrücken kann, ist das Datenbank-Schema noch nicht normalisiert.
Wie man Schemata normalsiert, steht in jedem besseren Buch zur Datenbank-Programmierung, Google & Co dürften auch jede Menge Informationen dazu ausspucken.
Alexander