Entwickler-Ecke

Programmiersprachen (Server) - [PHP,MYSQL] Verbindung zur Datenbank funktioniert nicht


andras - Di 10.07.07 12:08
Titel: [PHP,MYSQL] Verbindung zur Datenbank funktioniert nicht
hi!
ich such mittlerweile sicher schon 3 stunden nach dem blöden fehler und cih find ihn nicht... :(
immer wenn ich eine abfrage machen möchte scheitert es schon an der verbindung, sowohl mit localhost (xampp) als auch auf meinem webspace....

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
<? session_start();
include "funktionen.php";
...
$db_link = mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_PASS);
echo $db_link;
                        if ($db_link)
                        {

                        if (mysql_select_db(MYSQL_DATABASE, $db_link))
                        {
                                $sql = "INSERT INTO
                                karten, karten_bestellungen
                                        (id,vorname,nachname,strasse,plz_ort,email,telefon,erwachsene,schueler,bearbeitet)
                                        VALUES
                                        ($id,$vorname,$nachname,$strasse,$plz_ort,$email,$telefon,$erwachsene,$schueler,FALSE);";
                                if(!mysql_query($sql));
                                                       {Header('Location: fehler.php?errornumber=2');
                                                       }
                       }
                       else
                       {
                       header('Location: fehler.php?errornumber=3');
                       }
                       }
                       else
                       {
                       header('Location: fehler.php?errornumber=2');
                       }
@mysql_close($db_link);?>

funktionen.php:

Quelltext
1:
2:
3:
4:
5:
6:
<?
define('MYSQL_HOST','localhost');
define('MYSQL_USER','root');
define('MYSQL_PASS','');
define('MYSQL_DATABASE','karten');
?>


hoff irgendjemand kann mir helfen...


GTA-Place - Di 10.07.07 13:10

Schreib mal hinter die Connection und die DB-Auswahl:

Quelltext
1:
 OR die(mysql_error());                    

Also z.B.:

Quelltext
1:
mysql_select_db(...) OR die(mysql_error());                    

Was für eine Fehlermeldung wird ausgegeben?


Arne K. - Di 10.07.07 14:25

... und lies dir ein Tutorial zum Thema SQL-Injection durch ;)


GTA-Place - Di 10.07.07 14:42

Vielleicht macht er die Variablen ja in dem fehlenden Part (...) unschädlich.


Arne K. - Di 10.07.07 14:47

Hoffentlich ;)


andras - Mi 11.07.07 11:40

user profile iconArne K. hat folgendes geschrieben:
... und lies dir ein Tutorial zum Thema SQL-Injection durch ;)

habs gemacht, jaja wär ja schon wenns einmal ohne diese ganzen apostrophe und anführungszeichen ginge, zu schön um wahr zu sein *gg*

user profile iconGTA-Place hat folgendes geschrieben:
Vielleicht macht er die Variablen ja in dem fehlenden Part (...) unschädlich.

sind nur keine variablen sondern konstanten...

user profile iconGTA-Place hat folgendes geschrieben:
Was für eine Fehlermeldung wird ausgegeben?

Gar keine, weil jetzt gehts mehr oder weniger...
also was war falsch:
ich habe geschrieben:

Quelltext
1:
2:
3:
4:
if(!mysql_query($sql));
      {
          Header('Location: fehler.php?errornumber=2');
      }

mysql_query ist aber kein boolean, oder? dh irgendwie scheint der immer weiterzuleiten, auch wenns in der db drinnen ist...
außerdem ist ein tippfehler drinnen, weil errornummer 2 (im GET) auch die errornummer von "keine verbindung" ist.... muss also 4 heißen...

aber jetzt noch ganz kurz eine frage:
nachdem das mit dem !mysql_query() ja nicht zu funktionieren scheint...
wie kann ich das sonst realisieren?
Bereits schon jetzt Danke!! für alle folgenden Antworten und vielen Dank für alle bisherigen!!!


Heiko - Mi 11.07.07 12:21

Theoretisch lieftert mysql_query eine Fehlermeldung: http://de.php.net/manual/de/function.mysql-query.php .

Du musst beachten: der Befehl liefert nur false zurück, wenn die Übergabe falsch war (Syntaxfehler etc.). Du erhälst keine Information über die Abfrageergebnisse selber (also obs Datensätze gibt). Dafür sind andere Befehle da!


andras - Mi 11.07.07 12:28

ok, danke!
habs jetzt so gelöst und das scheint zu funktionieren:
statt:

Quelltext
1:
2:
3:
4:
if(!mysql_query($sql));
      {
          Header('Location: fehler.php?errornumber=2');
      }


hab ich:

Quelltext
1:
2:
3:
4:
5:
$result=mysql_query($sql);
if(!$result);
      {
          Header('Location: fehler.php?errornumber=2');
      }

geschrieben.
jetzt funktioniert alles.
Also nochmals vielen Dank!!!!


Arne K. - Mi 11.07.07 12:31

user profile iconandras hat folgendes geschrieben:

user profile iconGTA-Place hat folgendes geschrieben:
Vielleicht macht er die Variablen ja in dem fehlenden Part (...) unschädlich.

sind nur keine variablen sondern konstanten...


Zitat:
VALUES ($id,$vorname,$nachname,$strasse,$plz_ort,$email,$telefon,$erwachsene,$schueler, NULL)

Das sind definitiv keine Konstanten. Ich hoffe, du hast das Escapen nicht auf die Verbindungsdaten bezogen?



Ansonsten: Tritt ein Fehler auf, liefert dir den mysql_error(). Rückwärtsschluss: Liefert dir mysql_error() nichts, gab es auch seitens MySQL keinen Fehler.



mysql_query() gibt dir je nachdem, was du für eine Anfrage sendest, unterschiedliche Typen zurück.
Wenn du eine Abfrage durchführst, die ein Resultat liefert (also z.B. SELECT), kannst du z.Bsp. prüfen, ob es sich um eine Ressource handelt (is_resource()).
Ansonsten würde ich nicht das Result direkt prüfen, sondern mit mysql_fetch_row() (oder -_assoc()) die erste Zeile des Datensatzes extrahieren, und dann mit einem einfachen if(isset($data[0])) bzw. bei -_assoc() dem Index eines beliebigen Schlüssels prüfen, ob ein Datensatz zurück geliefert wurde. Das prüft dir aber nur, ob mindestens ein Datensatz zurück geliefert wurde! Nicht, ob deine SQL-Frage fehlerhaft war. Dafür siehe wieder mysql_error().

EDIT:
@andras: Kann ich mir nicht vorstellen; die beiden Quellcodes sind inhaltlich identisch. Du hast nur eine temporäre Zwischenvariable eingefügt. Wenn es jetzt funktioniert, das vorher aber nicht tat, dann liegt es gewiss nicht an der von dir beschriebenen Änderung ;)


andras - Mi 11.07.07 12:46

user profile iconArne K. hat folgendes geschrieben:
user profile iconandras hat folgendes geschrieben:

user profile iconGTA-Place hat folgendes geschrieben:
Vielleicht macht er die Variablen ja in dem fehlenden Part (...) unschädlich.

sind nur keine variablen sondern konstanten...


Zitat:
VALUES ($id,$vorname,$nachname,$strasse,$plz_ort,$email,$telefon,$erwachsene,$schueler, NULL)

Das sind definitiv keine Konstanten. Ich hoffe, du hast das Escapen nicht auf die Verbindungsdaten bezogen?

ok, ganz sooooo schlecht bin ich auch nicht drauf *gg*
hab gedacht, user profile iconGTA-Place hat das auf meine verbindungsdaten (MYSQL_HOST etc) bezogen, weil das sind ja konstanten...

user profile iconArne K. hat folgendes geschrieben:
Ansonsten: Tritt ein Fehler auf, liefert dir den mysql_error(). Rückwärtsschluss: Liefert dir mysql_error() nichts, gab es auch seitens MySQL keinen Fehler.
mysql_query() gibt dir je nachdem, was du für eine Anfrage sendest, unterschiedliche Typen zurück.
Wenn du eine Abfrage durchführst, die ein Resultat liefert (also z.B. SELECT), kannst du z.Bsp. prüfen, ob es sich um eine Ressource handelt (is_resource()).
Ansonsten würde ich nicht das Result direkt prüfen, sondern mit mysql_fetch_row() (oder -_assoc()) die erste Zeile des Datensatzes extrahieren, und dann mit einem einfachen if(isset($data[0])) bzw. bei -_assoc() dem Index eines beliebigen Schlüssels prüfen, ob ein Datensatz zurück geliefert wurde. Das prüft dir aber nur, ob mindestens ein Datensatz zurück geliefert wurde! Nicht, ob deine SQL-Frage fehlerhaft war. Dafür siehe wieder mysql_error().

na gut, ich werd mich einmal mit dem mysql_error näher befassen, der sollte im manual ja ausreichend beschrieben sein, nehme ich an... ansonsten meld ich mich halt wieder :)

user profile iconArne K. hat folgendes geschrieben:
@andras: Kann ich mir nicht vorstellen; die beiden Quellcodes sind inhaltlich identisch. Du hast nur eine temporäre Zwischenvariable eingefügt. Wenn es jetzt funktioniert, das vorher aber nicht tat, dann liegt es gewiss nicht an der von dir beschriebenen Änderung ;)

ist mir auch irgendwie komisch vorgekommen....


Christian V. - Mi 11.07.07 13:22

Zitat:
VALUES ($id,$vorname,$nachname,$strasse,$plz_ort,$email,$telefon,$erwachsene,$schueler, NULL)


Soviel ich weiss müssen alle felddaten in Singelquotes stehen.
Also '$id','$vorname' usw.

//Edit: Zudem musst du NULL nicht extra angeben, kannst einfach die Spalte weglassen(Aber nur wenn kein Standardwert definiert wurde).


andras - Mi 11.07.07 13:30

jaja, danke!!!
das hab ich schon gelöst...


Arne K. - Mi 11.07.07 13:34

user profile iconChristian V. hat folgendes geschrieben:
Soviel ich weiss müssen alle felddaten in Singelquotes stehen.

Nein, das trifft nur auf Stringliterale zu; numerische Datentypen werden ohne Hochkommata geschrieben ;)


Heiko - Mi 11.07.07 13:35

Was man auch mit reinschreiben sollte: wäre das ` bei Tabellenspalten und Tabellennamen ;).


Christian V. - Mi 11.07.07 13:37

@Arne K. Ja stimmt, hast Recht :wink:.


GTA-Place - Mi 11.07.07 13:37

Lass ich immer weg, ist mir zu blöd mit den Akzenten und sieht sch... nicht so hübsch aus.


Arne K. - Mi 11.07.07 13:42

user profile iconGTA-Place hat folgendes geschrieben:
Lass ich immer weg, ist mir zu blöd mit den Akzenten und sieht sch... nicht so hübsch aus.

Mit ein Grund, warum man das nicht machen sollte, ist wohl eher, wenn man bedenkt, wofür die "Akzente" eingeführt wurden: Nämlich um Spalten mit erweiterten Bezeichnungen zu unterstützen. Durch die Backticks kannst du z.Bsp. auch Spalten handhaben, die "Eine sehr merkwürdig benannte Spalte" heißen. Das ist stilistisch und designtechnisch aber äußerst fragwürdig, da die meisten Spalten wohl mit Benennungen wie "userId", "productTitle", "postText" etc. wesentlich sinnvoller und kürzer benannt werden können.

Der eigentliche Grund, warum ich von den Backticks abraten würde, ist aber die Portabilität! Bei der Wahl der Zeichen zur Begrenzung von Spaltennamen und -aliasen bastelt nämlich jede Datenbank ihren eigenen Brei. Unter MSSQL werden die Bezeichner z.B. nicht in Backticks eingeschlossen, sondern in eckige Klammern. Was tun, wenn du nun ein umfangreiches Projekt von einer Datenbank zur anderen Migrieren möchtest? -> Fatal! Und das selbst, wenn du eine Wrapperklasse verwendest.

Ergo: Gutes Datenbankdesign entwerfen, sinnvolle und nach Möglichkeit nur aus von ASCII gedeckten Zeichen bestehende Tabellennamen verwenden, keine datenbankspezifischen Extrawürste braten und gut ist. ;)