MySQL Abfrage in PHP-Funktion
ccc
- php
Hallo,
gibt es irgendeine Regel oder irgend etwas, was verbietet in einer Funktion eine MySQL Abfrage zu machen? Ich habe nämlich sowas feines zusammengeschrieben, bekomm aber immer ne hübsche Fehlermeldung.
hier mal der Code:
function site($i)
{
$connect = mysql_connect($db_host,$db_user,$db_pass);
mysql_select_db($db1_name);
if($i != "x")
{
$site_reason = "SELECT * FROM \_sites
WHERE id
= '".$i."'";
}
else
{
$site_reason = "SELECT * FROM \_sites
WHERE id
= '1'";
}
echo $site_reason;
$get_site = mysql_query($site_reason);
$sitename = mysql_fetch_array($get_site);
mysql_close($connect);
$n = $sitename[name];
return $n;
}
und die Fehlermeldung:
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in C:\xxx\functions.php on line 16
Wenn jemand einen Hinweis hat, ich wäre sehr Dankbar.
Ich habe nämlich sowas feines zusammengeschrieben,
Was feines? Soso, dann schauen wir mal:
$connect = mysql_connect($db_host,$db_user,$db_pass);
Woher weißt Du, daß die Verbindung geklappt hat?
$site_reason = "SELECT * FROM
\_sites
WHEREid
= '".$i."'";
Hier nicht unbedingt wichtig, aber informiere Dich trotzdem mal über mysql_escape_string().
$get_site = mysql_query($site_reason);
Woher weißt Du, daß die Abfrage geklappt hat?
$sitename = mysql_fetch_array($get_site);
Wie kommst Du darauf, das Ergebnis von mysql_query() benutzen zu können, wo Du ohne Fehlerprüfung gar nicht weißt, ob da überhaupt ein brauchbares Ergebnis drin ist?
Fazit: Nicht fein, eher reichlich vertrauensselig.
Gruß,
soenk.e
$connect = mysql_connect($db_host,$db_user,$db_pass);
Woher weißt Du, daß die Verbindung geklappt hat?
$site_reason = "SELECT * FROM
\_sites
WHEREid
= '".$i."'";Hier nicht unbedingt wichtig, aber informiere Dich trotzdem mal über mysql_escape_string().
$get_site = mysql_query($site_reason);
Woher weißt Du, daß die Abfrage geklappt hat?
$sitename = mysql_fetch_array($get_site);
Wie kommst Du darauf, das Ergebnis von mysql_query() benutzen zu können, wo Du ohne Fehlerprüfung gar nicht weißt, ob da überhaupt ein brauchbares Ergebnis drin ist?
Also, ersteinmal danke, das du es dir angesehn hast. ich weiß, das alles funktioniert, da wenn ich mal das function site() und die netten 2 { } klammern wegnehm, das es dann funktioniert... also ist die abfrage, verbindung aufbauen usw... richtig und die variableninhalte stimmen auch alle ... nur die mysql abfrage funzt nicht ....
Hello,
Also, ersteinmal danke, das du es dir angesehn hast. ich weiß, das alles funktioniert, da wenn ich mal das function site() und die netten 2 { } klammern wegnehm, das es dann funktioniert... also ist die abfrage, verbindung aufbauen usw... richtig und die variableninhalte stimmen auch alle ... nur die mysql abfrage funzt nicht ....
Warum fragst Du uns dann, wenn Du es doch besser weißt? *mit dem Fuß aufstampf und kreisch*
Schau Dir mal die Antwort von Thomas Luethi an, und dann komm runter von Deinem Sockel.
Liebe Grüße aus http://www.braunschweig.de
Tom
Hallo,
bei mir geht eine MySQL in einer function, aber alle variablen musst du übernehmen:
ich hab es so gemacht:
$extra = "extra";
function extraformular($tbhtml, $extra)
{
$ex_abfrage = "SELECT * FROM $extra ORDER BY id";
$ex_ergebnis = mysql_query($ex_abfrage);
while($ex_row = mysql_fetch_object($ex_ergebnis))
{
echo "mein Text";
}
return $tbhtml;
}
das geht ohne probleme.
MFG
Andavos
Hello,
$site_reason = "SELECT * FROM
\_sites
WHEREid
= '".$i."'";
Wenn jemand einen Hinweis hat, ich wäre sehr Dankbar.
Erst, wenn Du mir erklärt hast, wofür die Backticks um _sites und um id gut sind.
Liebe Grüße aus http://www.braunschweig.de
Tom
Hallo,
gibt es irgendeine Regel oder irgend etwas, was verbietet in einer Funktion eine MySQL Abfrage zu machen?
Nein.
Dein Problem ist, dass Du in der Funktion drin
gewisse Variablen verwenden willst, die Du
ausserhalb der Funktion definiert hast.
function site($i)
{
$connect = mysql_connect($db_host,$db_user,$db_pass);
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
wo sind die definiert?
Tip: mit der Zeile
global $db_host, $db_user, $db_pass;
ganz am Anfang der Funktion kannst Du diese
Variablen verfuegbar machen.
Zudem hast Du kein vernuenftiges Fehlermanagement.
Bei jedem Schritt solltest Du im Fehlerfall eine
Meldung ausgeben, damit Du sofort weisst, _wo_
etwas schief laeuft.
Statt nur
$connect = mysql_connect($db_host,$db_user,$db_pass);
solltest Du z.B. schreiben:
$connect = mysql_connect($db_host,$db_user,$db_pass)
OR die("Fehler: Konnte nicht mit dem Datenbankserver verbinden.");
u.s.w.
Woher hast Du diesen schlechten Code ohne Fehlermanagement?
Lies unbedingt mal das Manual und nimm dessen Code als Beispiel!
http://www.php.net/manual/de/ref.mysql.php
$site_reason = "SELECT * FROM
\_sites
WHEREid
= '".$i."'";
=> http://www.dclp-faq.de/q/q-sql-select.html
und die Fehlermeldung:
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in C:\xxx\functions.php on line 16
... ist vermutlich ein Folgefehler.
Weil die Verbindung nicht hergestellt wurde,
gibt es auch kein Resultat. So einfach ist das. ;-)
Gruesse,
Thomas
Moin!
Woher hast Du diesen schlechten Code ohne Fehlermanagement?
Hallo Thomas!
Schau Dir die gämgigen Bücher, selbst die so renomierter Verlage wie O'Reilly, Addison Wesley... an. Da steht der Schrott wirklich drin. Auch ein gewisser bekannter Herr K. veröffentlicht sowas. (gefunden erst kürzlich wieder mal in einem teuren und durchaus umfassenden Buch über MySQL). Es ist ein Trauerspiel. Wie sollen die "Jungprogrammierer" etwas vernünftiges lernen, wenn Ihnen ständig solcher Schrott vorgesetzt wird?
MFFG (Mit freundlich- friedfertigem Grinsen)
fastix®
Woher hast Du diesen schlechten Code ohne Fehlermanagement?
Schau Dir die gämgigen Bücher, selbst die so renomierter Verlage wie O'Reilly, Addison Wesley... an. Da steht der Schrott wirklich drin.
Ohne die Bücher im Einzelnen zu kenen: Hier und da wird extra auf die Fehlerabfrage verzichtet, um sich ganz auf die Funktionsweise des Beispielcodes zu konzentrieren. IMHO auch eine durchaus akzeptable Vorgehensweise.
Ist natürlich dumm für Leute, die nur den Code abtippen, anstatt auch mal den Begleittext zu lesen (in dem ausdrücklich auf den gekürzten Code hingewiesen wird)..
Kurz: Nicht jedes Buch ist schlecht, es kann auch am Leser liegen.
Gruß,
soenk.e
Hallo,
Schau Dir die gängigen Bücher, [...] Da steht der Schrott wirklich drin.
Das glaube ich sofort.
Die armen Newbies tun mir ja schon leid.
Da wagen sie sich an etwas neues, und beim
ersten Fehlerchen wissen sie nicht weiter
und fragen hier um Hilfe.
Es ist wirklich eine Schande, was da offenbar
an schlechten Beispielen in all den Buechern
steht.
Und ich kann mir durchaus vorstellen, dass es
Buecher gibt, die das Fehlermanagement wirklich
aussen vor lassen und genauso vertrauensselig
und blauaeugig programmieren wie der "ccc" hier.
Wie sollen die "Jungprogrammierer" etwas vernünftiges lernen, wenn Ihnen ständig solcher Schrott vorgesetzt wird?
Wahrscheinlich bleibt uns wirklich nicht viel
anderes uebrig, als sie auf die guten Vorbilder
(Manual, dclp-FAQ) hinzuweisen und ihnen halt
auch hier - so gut es geht - beizubringen, was
sauberes und stabiles Programmieren bedeutet.
Bei einem arroganten Script-Kiddie, das es erst
noch wagt, sich "ccc" zu nennen, sind aber
unsere didaktischen Bemuehungen wohl umsonst. ;-)
Nachdem innert Stunden gleich zwei Newbies
hier mit inexistenter Fehlerbehandlung
aufgefallen sind, denke ich wieder mal,
wie schoen es doch waere, wenn wir sie
einfach zu einem Artikel oder FAQ-Eintrag
schicken koennten, wo das ganze Schritt
fuer Schritt erklaert ist.
Gerade bei MySQL-Problemen kommen die
Newbies ja oft mit der Fehlermeldung:
"supplied argument is not a valid MySQL result resource"
und wir sollen dann glaskugeln, an
welcher Stelle der Fehler ist.
Wenn ich's mir richtig ueberlege,
sollte diese Fehlermeldung gar nie
auftauchen, nicht wahr?
Sei's drum - ich gehe jetzt offline...
Schoenen Abend allerseits,
Thomas
Moin!
Die armen Newbies tun mir ja schon leid.
Da wagen sie sich an etwas neues, und beim
ersten Fehlerchen wissen sie nicht weiter
und fragen hier um Hilfe.
Naja. Die hier antworten tun das ja aus den verschiedensten Motiven und deren beliebigen Mischungen heraus. Ich finds daher gut, wenn gefragt wird. Das Problem des Fragers ist weniger trivial als man allgemein annimmt. Es ist für "Newbies" nicht gerade ganz einfach den Umgang mit Funktionen und Variablen zu beherrschen.
Es ist wirklich eine Schande, was da offenbar
an schlechten Beispielen in all den Buechern
steht.
Da mag ja auch gelten, was Sönke Tech geschrieben hat. Aber es ist ein Fakt: Die Fehlerbehandlung kommt oft schlecht weg. Statt desse wird oft auch noch "schön" programmiert (komplexe Einzeiler...) Gerade bei komplexeren Themen sollten sich die Autoren mehr "am Arsch reissen".
Wahrscheinlich bleibt uns wirklich nicht viel
anderes uebrig, als sie auf die guten Vorbilder
(Manual, dclp-FAQ) hinzuweisen und ihnen halt
auch hier - so gut es geht - beizubringen, was
sauberes und stabiles Programmieren bedeutet.
... Was Du sehr gut und absolut umfassend gemacht hast. Ich verteile eben manchmal ganz gerne Stupser um die Leute in die richtige Richtung zu weisen und hoffe auf deren eigene Intelligenz. Oder hoffe das die selbst darauf kommen, daß vor dem in phpinfo(); aufgeführten "_SERVER['yxz']" ein "$" gehört. Mir ist das ja seinerzeit auch gelungen.
Da fällt mir auf: Du hast ihn nicht auf die ungarische Notation und deren unglaubliche Vorteile hingewiesen :)
Bei einem arroganten Script-Kiddie, das es erst
noch wagt, sich "ccc" zu nennen, sind aber
unsere didaktischen Bemuehungen wohl umsonst. ;-)
Du vermutest er meint mit "CCC" den bekannten Club? Naja. Das ist eine Möglichkeit. Eine andere ist "christiansen cash crash". Arrogant finde ich ihn jedenfalls nicht. Da gibt es gaaaaanz andere, die gleich mal loslegen wollen um einen Server zu kaufen und hosten zu lassen und hier fragen, welches OS und welcher Webserver denn zu empfehlen wäre. Nick selbstredend: "WebmasterGott" - oder sich hartnäckig weigern Quelltext zu veröffentlichen. Nein, ich habe Dein Smylie nicht übersehen.
Gerade bei MySQL-Problemen kommen die
Newbies ja oft mit der Fehlermeldung:
"supplied argument is not a valid MySQL result resource"
und wir sollen dann glaskugeln
Naja. Ich selbst vermute bei der Fehlermeldung: die Verbindungaufnahme... obwohl die im bei mir .z.B. standardmäßig includierten Skript selbstredend eine Fehlermeldung ausgibt. Übrigens hatte er die ja... vielleicht hat er das Skript für die Veröffentlichung gekürzt.
MFFG (Mit freundlich- friedfertigem Grinsen)
fastix®
Hallo fastix,
Da fällt mir auf: Du hast ihn nicht auf die ungarische Notation und deren unglaubliche Vorteile hingewiesen :)
Wie bitte? Davon habe ich noch nie etwas gehoert.
OK, mit einem Stichwort und einer Suchmaschine
kann man sich ja rasch weiterbilden. Gesagt - getan.
Es geht offenbar um ein Schema, wie man
Variablennamen bilden sollte.
Verwendest Du es, oder meintest Du den
Satz voellig ironisch?
Du vermutest er meint mit "CCC" den bekannten Club?
Ja, das vermutete ich, und fand es etwas
anmassend
Arrogant finde ich ihn jedenfalls nicht.
Das erste Posting war nicht arrogant, und
die Problembeschreibung und das
Quellcode-Fragment waren fuer jemanden,
der noch nie etwas von globalen und
lokalen Variablen [*] gehoert hat und somit
IMHO am Anfang seiner PHP-Karriere steht,
sogar ueberdurchschnittlich brauchbar.
(Mit Freuden stellte ich fest, dass er sich
sogar die Query anzeigen laesst, bevor
er sie an die Datenbank schickt.)
Arrogant fand ich aber sein zweites Posting
von 20.19 Uhr [pref:t=67286&m=384783].
Dort lehnt er Soenkes Vorschlag, ein
Fehlermanagement zu machen, schnoede
ab mit einer Behauptung im Stil "es funktioniert
ja normalerweise, nur jetzt in der Funktion
nicht..." Das fand ich engstirnig, faul und dumm.
Aber was soll's - Du hast recht, es gibt
noch viel schlimmere und arrogantere
Newbies...
Und ja, es faellt mir manchmal schwer, mich
in die Newbies hineinzuversetzen.
Dass Konzepte wie Funktionen oder
verschiedene Variablentypen ein
Problem sein koennen, ist mir gar nicht
mehr bewusst, da ich schon vor ca.
12 Jahren mit TurboPascal "so richtig"
zu programmieren anfing und mir diese
Konzepte seither sehr gelaeufig sind.
Gruesse,
Thomas
[*] http://www.php.net/manual/de/language.variables.scope.php
Hello Thomas,
jezt hast Du aber immer noch nicht die ungarische Notation erklärt. *schnüff*
Muss ich jetzt tatsächlich selber googlen?
http://www.bytelords.de/cowiki/251.html?cowiki=a925ea113ab9302558ca7e21342d9289
Datentyp Präfix Beispiel
------------------ ---------- ----------
globale Variable g gVariable
Zeiger (Pointer) p pZeiger
Feld (Array) a aiFeld
Struct s sAdresse
Void v pvDaten
Unsigned u ucZeichen
Short s siAnzahl
signed s scZeichen
Long l liPrimzahl
Char c cZeichen
Int i iNummer
Float f fGehalt
Double d dKapital
zero-terminated
string sz szString
Ich finde allerdings, dass in PHP andere Dinge viel wichtiger sind:
-----PHP--------
ALLESGROSS Konstante -> eigene und PHP
$ALLESGROSS mit $ davor -> PHP-Systemarray (sollten die ändern!)
$_POST mit $_ -> PHP-Systemarray, meistens mit externen
Daten
$doof einfache Scriptvariable, benutzerdefiniert! Globals(OFF)
$php_errormsg einzige Funktion mit $davor, liefert den
letzten Fehler. Nach Aufruf gelöscht
-----eigene-----
$_schlau mit $_ davor benutzerdefiniertes Array
$_SERVER["PHP_SELF"] PHP-definiertes Array-Element
$_data["name"] benutzerdefiniertes Array-Element Scriptintern
$_data["NAME"] benutzerdefiniertes Array-Element mit Datenkopplung
z.B. zur Datenbank
... na, und so weiter. Wichtig ist ja, dass man es für seine
Scripte irgendwo dokumentiert und bei solchen, die man weitergibt
auch auf die Doku hinweist.
Und für Funktionen sollte man sich auch Konventionen überlegen:
(das ist meine Konvention, so als Idee)
get_value() liefert einen Wert oder ein Wertearray zur Weiter-
verarbeitung
put_value() führt eigenständig eine Ausgabe auf die Standardausgabe
durch, natürlich HTML-gerecht
make_value() erzeugt einen HTML-gerechten Ausgabestring, der dann
später z.B. mit echo ausgegeben werden kann.
... na und auch hier usw.
Und wenn man nicht OO programmiert dann kann als Präfix noch die Kennzeichnung der Include-Datei sinnvoll sein. Sonst kann es leicht passieren, dass die eigenen Includes später nicht mehr zusammenpassen und man einen cannot-redefine-Error bekommt.
So, nun habe ich diesen Thread auch mal missbraucht, um meine Gedanken zu sortieren. Vielleicht gebt Ihr ja mal Rückmeldung, was Ihr von derartigen Konventionen haltet.
Liebe Grüße aus http://www.braunschweig.de
Tom