Datensatz existiert?

Alles, was PHP betrifft, kann hier besprochen werden.

Datensatz existiert?

Postby cracker1981 » 16. February 2005 08:40

Wie kann man eigentlich herausbekommen,ob ein Datensatz überhaupt existiert?Kann mir da jemand helfen?
cracker1981
 
Posts: 34
Joined: 11. January 2005 12:07

Postby borschtel1 » 16. February 2005 08:57

Du solltest schon etwas direkter fragen.

Von was für einem Datensatz redest du und wo soll dieser exisitieren?
http://www.logospiel.de - Das Spiel mit den Logos
borschtel1
 
Posts: 29
Joined: 27. May 2004 11:29

Postby cracker1981 » 16. February 2005 13:51

Also nochmal ruhig von Anfang an.

Ich will wissen, ob ein Datensatz aus einer MYSQL-Datenbank existiert.

Code: Select all
...
$BB = $_GET['wn'];
$sql = "select * from wohnungen where Wohnungsnr = $BB ";
$link = mysql_connect($host,$user,$password);
mysql_select_db($database);
$result = mysql_query($sql) OR die(mysql_error());
while($data =  mysql_fetch_assoc($result)) {
   if (!isset($data['Internet_query'])or($data['Internet_query']=='nein')){
          include('error.php');
   } else {$pdf =& new Cezpdf();
...

Die Abfrage soll in die 1. if-Abfrage in der while-Schleife eingepasst werden.
cracker1981
 
Posts: 34
Joined: 11. January 2005 12:07

Postby Wiedmann » 16. February 2005 14:50

Un welche Kriterien muss der Datensatz erfüllem um "vorhanden" zu sein?
Wiedmann
AF Moderator
 
Posts: 17106
Joined: 01. February 2004 12:38
Location: Stuttgart / Germany

Postby cracker1981 » 16. February 2005 16:02

Er muss halt in der DB sein.
Habe mich im letzten Comment vertippt.Sollte nicht aus sondern in heissen.
cracker1981
 
Posts: 34
Joined: 11. January 2005 12:07

Postby Wiedmann » 16. February 2005 17:00

Er muss halt in der DB sein.

Das war schon klar...

Die Frage bleibt trotzdem gleich: Woran erkennst du diesen Datensatz?
Wiedmann
AF Moderator
 
Posts: 17106
Joined: 01. February 2004 12:38
Location: Stuttgart / Germany

Am besten, Du nutzt mysql_num_result()

Postby TConnect » 21. February 2005 12:51

Hi,

also ich habe für Deinen Code folgende Verbesserungsvorschläge:

1. $BB = ... muß nicht sein. Warum nutzt Du nicht gleich die $_GET-Variabel im QUERY? Meint:

$sql = "SELECT * FROM wohnungen WHERE Wohnungsnr = " . $_GET["wn"];

2. Dann solltest du Dir überelgen, ob Du die Connection zum DB-Server nicht grundsätzlich ganz am Anfang Deiner scripte via include() aufbaust, um diese in allen weiteren Anwenungen zur Verfügung zu haben.

3. Der Teil "OR die(mysql_error());" ist nicht so gut, da der Benutzer eigentlich nicht mit irgendwelchen SQL-Fehlermeldungen konfrontiert werden muß. Stell Dir vor, Deine Sekretärin arbeitet mit Deinem System und bekommt plötzlich eine wüste (für sie) kryptische Fehlermeldung. Die kippt doch tot vom Stuhl!
Besser wäre

if($result = @mysql_query($sql)) {
//weiter im Text
} else {
// verständliche Fehlerausgabe (Sekretärinnentauglich)
}

4. Zu Deiner eigentlichen Frage: Um die Anzahl der gefundenen Datensätze zu ermitteln, nutzt Du @mysql_num_result():

$num_result = @mysql_num_rows($result);
if($num_result > 0) {
// Weiter im Text...
} else {
// Keine gefundenen Wohnungen
}

Hier bietet es sich dann auch an, statt einer while-Klausel über eine for-Schleife die Datensätze zu durchlaufen:

for($i=0; $i<$num_result; $i++) {
@mysql_data_seek($result, $i); // Setzt den Zeiger auf die Zeile $i
$inhalte = @mysql_fetch_array($result, MYSQL_ASSOC); // erzeugt ein assoziatives Array, in dem die Spaltennamen der Tabelle später zur Verfügung stehen.
}

Der Vorteil der FOR-Schleife ist der, dass Du über die Variabel $i immer eine Indizierung im HTML-Quelltext schaffen kannst, ohne einen exklusiven Zahler mitschleppen zu müssen. Aber das Thema wäre hier zu weitgreifend.

Übrigens: Das @-Zeichen vor den Funktionsaufrufen verhindert, dass PHP Fehlermeldungen direkt im HTML-Code ausgibt.


Grüße TConnect
TConnect
 
Posts: 100
Joined: 31. March 2004 22:26

Postby cracker1981 » 28. February 2005 15:24

So wieder da.War krank kann mich deshalb erst so spät dazu äußern.

Hi,

also ich habe für Deinen Code folgende Verbesserungsvorschläge:

1. $BB = ... muß nicht sein. Warum nutzt Du nicht gleich die $_GET-Variabel im QUERY? Meint:

$sql = "SELECT * FROM wohnungen WHERE Wohnungsnr = " . $_GET["wn"];

2. Dann solltest du Dir überelgen, ob Du die Connection zum DB-Server nicht grundsätzlich ganz am Anfang Deiner scripte via include() aufbaust, um diese in allen weiteren Anwenungen zur Verfügung zu haben.

3. Der Teil "OR die(mysql_error());" ist nicht so gut, da der Benutzer eigentlich nicht mit irgendwelchen SQL-Fehlermeldungen konfrontiert werden muß. Stell Dir vor, Deine Sekretärin arbeitet mit Deinem System und bekommt plötzlich eine wüste (für sie) kryptische Fehlermeldung. Die kippt doch tot vom Stuhl!
Besser wäre

if($result = @mysql_query($sql)) {
//weiter im Text
} else {
// verständliche Fehlerausgabe (Sekretärinnentauglich)
}

4. Zu Deiner eigentlichen Frage: Um die Anzahl der gefundenen Datensätze zu ermitteln, nutzt Du @mysql_num_result():

$num_result = @mysql_num_rows($result);
if($num_result > 0) {
// Weiter im Text...
} else {
// Keine gefundenen Wohnungen
}

Hier bietet es sich dann auch an, statt einer while-Klausel über eine for-Schleife die Datensätze zu durchlaufen:

for($i=0; $i<$num_result; $i++) {
@mysql_data_seek($result, $i); // Setzt den Zeiger auf die Zeile $i
$inhalte = @mysql_fetch_array($result, MYSQL_ASSOC); // erzeugt ein assoziatives Array, in dem die Spaltennamen der Tabelle später zur Verfügung stehen.
}

Der Vorteil der FOR-Schleife ist der, dass Du über die Variabel $i immer eine Indizierung im HTML-Quelltext schaffen kannst, ohne einen exklusiven Zahler mitschleppen zu müssen. Aber das Thema wäre hier zu weitgreifend.

Übrigens: Das @-Zeichen vor den Funktionsaufrufen verhindert, dass PHP Fehlermeldungen direkt im HTML-Code ausgibt.


Grüße TConnect


zu 1. $BB brauch ich, da ich die Variable mehrmals benötige.
zu 2. MYSQL-Verbindung ist schon außerhalb und wird included.Wollte es nur mit in Beschreibung reinbringen.
zu 3. erklärs nochmal.bei mir steht da einer auf den Schlauch
zu 4. Das ist genau das was ist gesucht hab.Nun funzt es schon mal besser.

Danke für die Hints TConnect.
cracker1981
 
Posts: 34
Joined: 11. January 2005 12:07

Postby Jan H. Krüger » 28. February 2005 15:54

zu 1: Genausogut könntest du auch gleich überall dort wo du bisher $bb verwendest $_GET["wn"] einsetzen. ;)
Dann sparst du dir das doppelste anlegen.

zu 3: Sollte mal ein Fehler auftreten dann ist es nicht sehr geschickt den Endanweder mit den Fehlermeldungen von MySQL zu konfrontieren. Eine Meldung der Art: "Es gab ein Problem bei der Aktion XY. Bitte wenden Sie sich an den Support." ist da schon ansehlicher und wenn sie entsprechend vorbereitet wird kann sie dir auch bei der Fehlersuche helfen.
Jan H. Krüger
 
Posts: 152
Joined: 24. October 2004 19:42

Noch zwei Anmerkungen

Postby TConnect » 01. March 2005 09:43

zu 1. Du hast natürlich immer auch das Problem, dass Du die reinkommenden Daten nicht ungeprüft übernehmen darfst. Und: Mal können die Daten im $_GET und mal im $_POST liegen, je nachdem, ob ein Link angeklickt wurde (GET-Methode) oder ein Formular verschickt wurde (POST-Methode). Hier empfiehlt sich:

switch($_SERVER["REQUEST_METHOD"]) {
case "GET":
$_REVIEW = $_GET;
break;

case "POST":
$_REVIEW = $_POST;
break;
}

Später wirfst Du die jeweilige $_GET/$_POST Variabel weg und durchläufst eine Sicherheitsroutine:

foreach($_REVIEW as $key => $value) {
$_REVIEW[$key] = mach_value_sicher($value); // ;-)
}

Die Art und Anzahl der verschiedenen Sicherheitsaspekte kannst Du in Google recherchieren...


Zu 3. Das ist einfach nur der Versuch Dir zu erklären, dass es besser ist, bei fehlgeschlagenen SQL-Anfragen nicht unmittelbar den Fehler von mySQL ausgeben zu lassen, sondern was eigenes zu programmieren.

GRÜ?E TConnect
TConnect
 
Posts: 100
Joined: 31. March 2004 22:26

Postby cracker1981 » 01. March 2005 11:46

Danke euch beiden.
Werde die Ratschläge berücksichtigen.
cracker1981
 
Posts: 34
Joined: 11. January 2005 12:07


Return to PHP

Who is online

Users browsing this forum: No registered users and 3 guests