Mehrere Werte aus Abfrage in Php Funktion
Andy
- php
Guten Tag,
Mit dieser Abfrage bekomme ich einen DS zurück und habe versucht das in eine Funktion einzubauen die ich (hier zum testen, gleich wieder aufrufe)
Ich bekomme nur die emailadresse zurück. Ich brauche aber auch noch name und vorname. Hier verlässt mich mein Wissen, wie müsste ich die Funktion schreiben, so dass ich drei Werte bekomme?
function emailadresse() {
//Adressat bestimmen bzw für Replay
$adresse = "SELECT anrede, name, vorname, email FROM ma WHERE dienst='ja'";
$adresse=mysql_query($adresse) or die("Abfrage Adresse fehlgeschlagen<br />".mysql_error());
if (!$adresse)
{
return false;
}
while($row = mysql_fetch_assoc($adresse)) {
$mailadresse =$row['email'];
}
return $mailadresse;
} //ende Funktion emailadresse
$adresse= emailadresse();
echo $adresse;
Danke und Viele Grüße
Andy
Mahlzeit Andy,
Ich bekomme nur die emailadresse zurück. Ich brauche aber auch noch name und vorname. Hier verlässt mich mein Wissen, wie müsste ich die Funktion schreiben, so dass ich drei Werte bekomme?
Gib z.B. statt eines einzelnen Wertes ein Array zurück.
[code lang=php]
function emailadresse() {
//Adressat bestimmen bzw für Replay
$adresse = "SELECT anrede, name, vorname, email FROM ma WHERE dienst='ja'";
Befindet sich in der Variablen $adresse eine Adresse? Nein? Wieso heißt sie dann so? Verwende sinnvolle Bezeichnungen für Deine Variablen - Du machst Dir selbst das Leben erheblich leichter.
$adresse=mysql_query($adresse) or die("Abfrage Adresse fehlgeschlagen<br />".mysql_error());
Befindet sich in der Variablen $adresse eine Adresse? Nein? Wieso heißt sie dann so? Abgesehen von dem, was ich oben bereits schrieb:
1. Die Wiederverwendung von existierenden Variablen als etwas ganz anderes ist absolut gefährlich - oder kannst Du genau sagen, wann welche Variable welchen Inhalt welchen Typs hat?
2. Zitat 1282
while($row = mysql_fetch_assoc($adresse)) {
$mailadresse =$row['email'];
}
return $mailadresse;
Du könntest hier z.B. das assoziative Array $row zurückgeben - dann hättest Du "draußen" Zugriff auf alle ausgelesenen Felder.
MfG,
EKKi
Hi Ekki,
vielen Danke für die Hilfe.
Befindet sich in der Variablen $adresse eine Adresse? Nein? Wieso heißt sie dann so? Verwende sinnvolle Bezeichnungen für Deine Variablen - Du machst Dir selbst das Leben erheblich leichter.
Werde ich machen, wie ich die Bezeichnungen wählen werde weiß ich aber noch nicht. Da denke ich manchmal ewig nach und es kommt nicht viel bei raus.
$adresse=mysql_query($adresse) or die("Abfrage Adresse fehlgeschlagen<br />".mysql_error());
wie denn, wenn nicht or die?
- Die Wiederverwendung von existierenden Variablen als etwas ganz anderes ist absolut gefährlich - oder kannst Du genau sagen, wann welche Variable welchen Inhalt welchen Typs hat?
Werde ich genau so beherzigen.
while($row = mysql_fetch_assoc($adresse)) {
$mailadresse =$row['email'];
}
return $mailadresse;Du könntest hier z.B. das assoziative Array $row zurückgeben - dann hättest Du "draußen" Zugriff auf alle ausgelesenen Felder.
....
while($row = mysql_fetch_assoc($adresse)) {
$mailadresse =$row;
}
return $mailadresse;
} //ende Funktion emailadresse
function emailabsender() {
$ausgabe= emailadresse();
echo $ausgabe['email'].'--- '.$ausgabe['name'];
Ich hoffe das ich Dich richtig verstanden habe.
Die Bezeichnungen werde ich noch ändern.
So geht es.
Vielen Dank
Andy
Hallo!
Werde ich machen, wie ich die Bezeichnungen wählen werde weiß ich aber noch nicht. Da denke ich manchmal ewig nach und es kommt nicht viel bei raus.
Bezeichne die Variablen danach welchen Wert sie haben.
z.B. statt
$adresse = "SELECT ...";
$adresse=mysql_query($adresse) or die("...".mysql_error());
wäre besser:
$sql = "SELECT ..."; // oder $sqlstmnt für SQL-Statement
$query = mysql_query($sql) or die("...".mysql_error());
Damit weißt du was wo steht und kannst bei einem Fehler sogar jede Einzelne ausgeben und deren Inhalt überprüfen.
$adresse=mysql_query($adresse) or die("Abfrage Adresse fehlgeschlagen<br />".mysql_error());
wie denn, wenn nicht or die?
Ich denk mit der Frage beziehst du dich auf mich.
Nun, ein die() bricht dein Script ab, der Benutzer bekommt nichts zu sehen ausser der Fehlermeldung und sogar dem mysql_error().
Das bringt dem Nutzer jetzt rein gar nichts. Sorge dafür, dass du eine ordentliche Fehlermeldung ausgibst und baue Fehlerdiagnosen in dein Script ein um es nicht "töten" zu müssen.
Den mysql_error() solltest du nur lokal zu Testzwecken anzeigen lassen.
while($row = mysql_fetch_assoc($adresse)) {
$mailadresse =$row['email'];
}
Sag mal wie viele passende Datensätze gibt es eigentlich und wieviel oder welchen davon willst du ausgeben?
Mir erscheint deine Schleife mehr und mehr zweckfrei.
Ich hoffe das ich Dich richtig verstanden habe.
Hast du.
Grüße, Matze
Hallo Matze und Ekki,
In meinen vorherigen Beitrag bezog ich mich auf den von Ekki, Deinen, Matze, las ich erst später. Danke- ich denke ich habe verstanden.
Zur Anzahl der DS, es wird nur ein DS zurückgegeben, in der Tabelle stehen die Emailadressen der Mitglieder, ein Mitglied hat Bereitschaft und soll die eingehenden Mails beantworten.
...WHERE dienst='ja'
Wer Bereitschaft hat, bekommt über ein Update das "ja" zugeordnet.
An diese Adresse gehen dann die eingehenden Anfragen.
Da der Nutzer auch noch wählen soll ob er eine Kopie der Mail bekommt und diese Abfrage auch noch für andere Mails und Ausgaben gebraucht wird, wollte ich diese ausgegebene Mailadresse auch für Replay benutzen.
Der nächste Punkt, werde ich ab sofort so machen und die alten Abfragen ändern.
$sql = "SELECT ..."; // oder $sqlstmnt für SQL-Statement
$query = mysql_query($sql) or die("...".mysql_error());
wenn ich jetzt mehrere Abfragen habe, macht es doch auch Sinn
$sqladresse....
$queryadresse...
$sqlxyz
$queryxyz...
Oder?
Für or die suche ich eine Alternative.
Danke die Mühe und Viele Grüße Andy
Hallo Andy!
Zur Anzahl der DS, es wird nur ein DS zurückgegeben, in der Tabelle stehen die Emailadressen der Mitglieder, ein Mitglied hat Bereitschaft und soll die eingehenden Mails beantworten.
...WHERE dienst='ja'
Wer Bereitschaft hat, bekommt über ein Update das "ja" zugeordnet.
In dem Fall erübrigt sich die Schleife tatsächlich.
einfach $query = mysql_query("Dein MySQL-Statement"); tuts genauso.
wenn ich jetzt mehrere Abfragen habe, macht es doch auch Sinn
$sqladresse....
$queryadresse...
Nein ganz und gar nicht, denn das Array $query (siehe oben) enthält bereits alle Werte des Datensatzes. Die Bezeichnung der Werte richtet sich nach deinen Tabellenspalten. Diese benennst du im übrigen ja auch nach deren Inhalt. Vorname, Zuname, Email usw.
$sqladresse usw. ergäbe nur Sinn wenn dein SQL-Statement expliziet eine Spalte mit einem Adresswert zurück geben soll.
Für or die suche ich eine Alternative.
Eigentlich ganz einfach:
$sql = "SELECT * FROM table WHERE bedingung = zutrifft";
$query = mysql_query($sql);
if(!$query){
echo 'Aussagekräftige Fehlermeldung';
}else{
// tue etwas sinnvolles
}
Das wars eigentlich schon.
Grüße, Matze
echo $begrüßung;
In dem Fall erübrigt sich die Schleife tatsächlich.
einfach $query = mysql_query("Dein MySQL-Statement"); tuts genauso.
[...] denn das Array $query (siehe oben) enthält bereits alle Werte des Datensatzes. [...]
Mitnichten, denn du hast das Fetchen unterschlagen.
Übrigens gibt es auch hier wieder einen Gut- und einen Schlechtfall zu beachten. Der Schlechtfall sieht so aus: Die Query ist zwar fehlerfrei abgearbeitet worden, hat aber kein Ergebnis geliefert. Vor dem Weiterverarbeiten ist also in jedem Fall das Funktionsergebnis zu überprüfen, sonst gibt es Folgefehler, wenn man es einfach so durchreicht.
echo 'Aussagekräftige Fehlermeldung';
"Aussagekräftig" aber bitte aus der Sicht des Anwenders. Den interessiert nicht, dass die Datenbank streikt, der wollte irgendwas erreichen. Wie kommt er sonst noch ans Ziel? Welche Alternative kann man ihm anbieten?
echo "$verabschiedung $name";
Hallo dedlfix!
Mitnichten, denn du hast das Fetchen unterschlagen.
So bin ich ;)
Ok der Vollständigkeit halber
$sql = "SELECT * FROM table WHERE bedingung = zutrifft";
$query = mysql_query($sql);
if(!$query){
$foo = 1;
}elseif(empty($query)){
$foo = 2;
}
switch($foo){
case 1:
// Query ist fehlgeschlagen
break;
case 2:
// Query erfolgreich, aber kein passender Datensatz gefunden
break;
default:
// tue etwas sinnvolles
}
Vor dem Weiterverarbeiten ist also in jedem Fall das Funktionsergebnis zu überprüfen, sonst gibt es Folgefehler, wenn man es einfach so durchreicht.
Besser? :)
echo 'Aussagekräftige Fehlermeldung';
"Aussagekräftig" aber bitte aus der Sicht des Anwenders. Den interessiert nicht, dass die Datenbank streikt, der wollte irgendwas erreichen. Wie kommt er sonst noch ans Ziel? Welche Alternative kann man ihm anbieten?
Genau so war das gemeint. Wie bereits geschrieben, kann der Nutzer mit einem MySQL-Error und einem getöteten Script in der Regel nicht viel anfangen.
Grüße, Matze
...oder
$sql = "SELECT * FROM table WHERE bedingung = zutrifft";
$query = @mysql_query($sql);
if(!$query){
$foo = 1;
}elseif(mysql_num_rows($sql) == 0){
$foo = 2;
}
switch($foo){
case 1:
// Query ist fehlgeschlagen
break;
case 2:
// Query erfolgreich, aber kein passender Datensatz gefunden
break;
default:
// tue etwas sinnvolles
}
mysql_num_rows() ist eventuell besser als empty().
Und das @ verhindert eine MySQL-Fehlermeldung wenn der Query fehlschlägt.
Das sollte es jetzt aber gewesen sein.
Grüße, Matze
echo $begrüßung;
Besser? :)
Nunja. Die unterschiedlichen Fehlerzustände interessieren nur den Admin. Man kann diese ihm direkt zukommen lassen, ohne die Art des Fehlers zwischenzuspeichern und dann abhängig davon zu verzweigen. Denn der Anwender will ja nur wissen, ob es erfolgreich war oder nicht.
"Aussagekräftig" aber bitte aus der Sicht des Anwenders. Den interessiert nicht, dass die Datenbank streikt, der wollte irgendwas erreichen. Wie kommt er sonst noch ans Ziel? Welche Alternative kann man ihm anbieten?
Genau so war das gemeint. Wie bereits geschrieben, kann der Nutzer mit einem MySQL-Error und einem getöteten Script in der Regel nicht viel anfangen.
Ja. Da diesen Punkt jedoch viele Programmierer nicht beachten, weil sie ihr Werk gar nicht aus der Sicht ihrer Anwender betrachten, hab ich das mal mit ein wenig mehr Wörtern gesagt, wie das sinnvollerweise aussehen kann.
echo "$verabschiedung $name";
Hallo dedlfix!
Nunja. Die unterschiedlichen Fehlerzustände interessieren nur den Admin. Man kann diese ihm direkt zukommen lassen, ohne die Art des Fehlers zwischenzuspeichern und dann abhängig davon zu verzweigen.
Mh was würdest du dem Admin denn schicken?
Nur den Fehler oder auch die Art? Den Inhalt von $query in dem Fall?
Meinst du einfach sowas?
if(!$query || empty($query)) /* $query an den Admin schicken */;
Grüße, Matze
echo $begrüßung;
Nunja. Die unterschiedlichen Fehlerzustände interessieren nur den Admin. Man kann diese ihm direkt zukommen lassen, ohne die Art des Fehlers zwischenzuspeichern und dann abhängig davon zu verzweigen.
Mh was würdest du dem Admin denn schicken?
Nur den Fehler oder auch die Art? Den Inhalt von $query in dem Fall?
Direkt beim Auftreten des Fehlers würde ich in dem einfachen Fall von der normalen Verarbeitung abzweigen, nicht erst sammeln und später auswerten. Bei mehreren Fehlermöglichkeiten sind mehrere Abzweige einzubauen. So ungefähr meinte ich das. Man kann bei Bedarf ein Fehlerflag setzen, mit dem dann der nachfolgende Verarbeitungsbereich informiert wird, dass vorher schon alles schief lief.
Meinst du einfach sowas?
if(!$query || empty($query)) /* $query an den Admin schicken */;
mysql_query() liefert entweder eine Ressourcenkennung (ungleich false) oder ein false. false wird von empty() als "leer" erkannt. empty() auf das Ergebnis von mysql_query() anzuwenden ist in deinem Beispiel nicht sinnvoll. Eine leere Ergebnismenge kann man erst erkennen, wenn der erste Fetch-Versuch mit false beendet wird.
echo "$verabschiedung $name";
Hallo und guten Morgen!
Direkt beim Auftreten des Fehlers würde ich in dem einfachen Fall von der normalen Verarbeitung abzweigen, nicht erst sammeln und später auswerten. Bei mehreren Fehlermöglichkeiten sind mehrere Abzweige einzubauen. So ungefähr meinte ich das. Man kann bei Bedarf ein Fehlerflag setzen, mit dem dann der nachfolgende Verarbeitungsbereich informiert wird, dass vorher schon alles schief lief.
Last try.
$sql = "SELECT * FROM table WHERE bedingung = zutrifft";
$query = mysql_query($sql);
if(!$query){
// Query Fehlgeschlagen - Fehler
// $fehlervariable = mysql_error();
}else{
$arr = mysql_fetch_assoc($query);
if(empty($arr)){
// Array leer, kein passender Datensatz gefunden - Fehler
// $fehlervariable = "leeres Array";
}else{
// tue etwas sinnvolles
}
}
Aber was genau würdest du als Admin speichern?
(...) Eine leere Ergebnismenge kann man erst erkennen, wenn der erste Fetch-Versuch mit false beendet wird.
Ja manchmal weiß ich nicht wo mir der Kopf steht. Was mach ich nur, was mach ich nur...
Das Fetch hab ich ja komplett vergessen ôO... *doh
Ok danke für die Aufklärung.
Grüße, Matze
echo $begrüßung;
$sql = "SELECT * FROM table WHERE bedingung = zutrifft";
$query = mysql_query($sql);
if(!$query){
Ich schreibe es lieber andersrum. Erst das normale Verhalten und im else-Zweig die Ausnahme. Aber das ist im Grunde egal.
// Query Fehlgeschlagen - Fehler
// $fehlervariable = mysql_error();
Der Admin bekommt die Nachricht über den Meldungstext, also mysql_error(). Je nach Konzept schriebe ich das beispielsweise ins Logfile oder sendete es per Mail. Dafür kann man sich ja eine Funktion definieren, dass nicht immer das ganze Fehlermeldungshandling geschrieben werden muss.
}else{
$arr = mysql_fetch_assoc($query);
if(empty($arr)){
// Array leer, kein passender Datensatz gefunden - Fehler
// $fehlervariable = "leeres Array";
Ein leeres Array entsteht nicht. Die Fetch-Funktionen liefern entweder ein Array (oder Objekt) mit einem Datensatz oder false. empty() liefert false beim Array oder true bei false. Man kann das empty() auch weglassen. Das Array, weil gefüllt, ergibt immer true im booleschen Kontext und false ist klar.
Aber was genau würdest du als Admin speichern?
Kontextabhängig das, was gerade für den Admin interessant ist. Speichern für den weiteren Scriptverlauf würde ich ohne Notwendigkeit erstmal gar nichts. Die Benachrichtigung tät ich on-the-fly erledigen.
echo "$verabschiedung $name";
Hallo,
Ich bekomme nur die emailadresse zurück. Ich brauche aber auch noch name und vorname. Hier verlässt mich mein Wissen, wie müsste ich die Funktion schreiben, so dass ich drei Werte bekomme?
Indem du alle ausgibst statt nur die Mailadresse.
$adresse = "SELECT anrede, name, vorname, email FROM ma WHERE dienst='ja'";
Hier liest schreibst du das Statement um Anrede, Name, Vorname und E-mail abzufragen.
> ~~~php
> $adresse=mysql_query($adresse) or die("Abfrage Adresse fehlgeschlagen<br />".mysql_error());
>
Ein die() ist übrigens meißt eine schlechte Idee.
while($row = mysql_fetch_assoc($adresse)) {
$mailadresse =$row['email'];
}
return $mailadresse;
Lass mich raten, du kriegst auch noch genau 1 E-mailadresse und zwar genau die letzte.
Ok, Fehleranalyse.
Eine Funktion kann immer nur 1(!) Wert zurück geben.
Das können nicht mehrere Variablen, aber ein Array sein.
Du übergibst die Daten aus $row['email'] an $mailadresse.
Warum übergibst du nicht auch die anderen Werte wenn du sie brauchst?
Diese in ein extra Array zu schreiben wäre aber blödsinn weil sie schon in $row['email'] stehn.
Fehlerbehebung.
`return $row;`{:.language-php}
Dann kannst du natürlich nicht mehr echo $adresse; verwenden sondern musst die Array-Elemente ansprechen.
Grüße, Matze