Lupuz.de: Artikel-Portal / Magazin

Zurück   Postpla.net - die Forum Community > PC, Internet und Technik > Coder's Area

mysql oder mysql_query?!

Anzeigen:

Antwort
 
Themen-Optionen
RVD
Alt 16.04.2008, 12:28   #1
Standard mysql oder mysql_query?!

hi, ich hab ein kleines problem.

und zwar bekomme ich beim schreiben in eine datenbank per php folgenden notice:
Code:
Notice:  mysql() [function.mysql]: This function is deprecated; use mysql_query() instead
er schreibt aber einwandfrei die sachen in die datenbank.

benutze ich aber mysql_query statt mysql kommt der fehler:
Code:
mysql_query(): supplied argument is not a valid MySQL-Link resource
und er schreibt nichts in die datenbank.

warum geht das eine mit notice und das andere garnicht?

wenn es mit mysql_query auch weiterhin nicht geht, kann ich den notice irgendwie unterdrücken, damit der nicht angezeigt wird?
 
 
Nach oben
Alp.traum
Alt 16.04.2008, 12:53   #2
Standard

Zeig mal bitte den kompletten Funktionsaufruf und wie du die Datenbankverbindung herstellst. Aber nicht vergessen deine Login-Daten zu verschleiern bzw. rauszunehmen.

Alternativ kannste auch hier mal gucken wie das funktioniert: http://tut.php-quake.net/mysql-connect.html
 
 
Nach oben
Wodar Hospur
Alt 16.04.2008, 13:07   #3
Standard

This function is deprecated; use mysql_query() instead
Bedeutet im Grunde das diese Funktion zwar im Moment noch genutzt werden kann, aber in kommenden Versionen umgeändert bzw. rausgeschmissen wird. Der Nachfolger ist wohl dafür mysql_query(). Dabei wird mysql_query wohl eine andere Struktur als mysql haben, daher der Fehler.

Falls du sicher programmieren willst und dich nicht irgendwann wundern warum nichts geht, nimm dir mysql_query, falls du nur fix was zusammen stümperst nimm mysql !

Leider weiß ich aus dem Kopf nicht genau wie du diese Meldung unterdrücken kannst, aber du könntest versuchen die Fehlerausgaben als Dateistrom auf eine Datei (/dev/null ) zu lenken.
 
 
Nach oben
gagget
Alt 16.04.2008, 13:24   #4
Standard

Zu MySQL: Die Jungs haben schon recht, nimm einfach mysql_query. Allerdings braucht diese Funktion nur eine Query als Übergabe. Eine optionale Übergabe ist die Verbindungs Resource die du von mysql_connect als Rückgabewert bekommst. Ich nehme an du übergibst als zweites den Host, DBNamen oder sowas.

Fehler unterdrücken:
Dazu nehme er folgenden Befehl 'error_reporting( E_ALL ^ E_NOTICE )' und lese sich evtl noch dieses hier durch.
 
 
Nach oben
RVD
Alt 16.04.2008, 13:35   #5
Standard

ich hab das ganze in einer anderen datei genau so gemacht, da lief es ohne einen mucks zu machen auch mit mysql.

die abfrage an sich sieht so aus:
Code:
mysql($db_name, "INSERT INTO `fotos` ( `id` , `dateiname` , `beschreibung` , `sprache` , `kategorie` ) VALUES ('', '$dateiname', '$beschreibung', 'deutsch' , '$kategorie')");
db_connect und db_config werden per include eingebunden, also dürfte da ja nichts dran falsch sein, er bekomm ja seine datenbankverbindung und auslesen geht auch ohne fehler. das auslesen findet aber in einer anderen datei statt, von der auch das schreiben ohne notice usw klappt.

meine dateisturktur sieht so aus:

db_config.php
db_connect.php
foto.php
img ordner
admin ordner
------ htaccess
------ db_config.php
------ db_connect.php
------ upload.php

in der foto.php ist das anzeigen von bildern drin, den pfad usw holt er sich aus der db, klappt auch alles. testweise hatte ich das schreiben in die db mal mit da rein getan, da gehts ohne zu murren mit mysql.

sinnigerweise ist das schreiben in die datenbank aber im passwortgeschützen admin bereich in der upload.php. da werden bilder zum einen auf einem ftp gespeichert und die entsprechenden daten dazu in der datenbank. ich hab auch extra die db_config und connect in den adminbereich kopiert, damit er da nix zu meckern hat, aber ändert nichts.

beim löschen hab ich jetzt genau das gleiche. aus dem ftp löscht er, bei der datenbank wieder der dumme notice und nix wird gelöscht. geb ich den gleichen befehl direkt in der datenbank ein klappts



edit: ok das schreiben funktioniert jetzt mit mysql_query. ihr hattest recht, dass das eine andere syntax erfordert. so gehts:
Code:
mysql_query("INSERT INTO `fotos` ( `id` , `dateiname` , `beschreibung` , `sprache` , `kategorie` ) VALUES ('', '$dateiname', '$beschreibung', 'deutsch' , '$kategorie')");
danke schonmal dafür.

beim löschen kommt so auch kein fehler, allerdings passiert auch nichts.
Code:
 $loeschdatei=$_GET["file"];
 mysql_query("DELETE FROM `fotos` WHERE 'dateiname'='$loeschdatei'");
kann natürlich sein, dass $_GET["file"] einen anderen inhalt hat als ich brauche. muss ich mal nachgucken und ausgeben lassen oder weiß zufällig einer was ich vorhab und weiß auswendig welche variable ich nehmen muss ^^

Geändert von RVD (16.04.2008 um 14:00 Uhr).
 
 
Nach oben
gagget
Alt 16.04.2008, 13:59   #6
Standard

Fehler Nr. 1 sagt dir ja auch nur 'Hey, mysql is veraltet, mir han da etz wat wat besseres namens mysql_query'. Wenn es dir nur darum geht, dass dieser Notice Error nemmer kommt (wobei der woanders dann auch kommen sollte wenn Notice Errors nicht aus sind), dann setz einfach ein @ Zeichen vor den Befehl. Das unterdrückt dann aber alle Fehlertypen.

Mein Ratschlag ist nimm mysql_query ! 'mysql' ist so veraltet, da wächst bald schon Moos drüber. Allerdings musst du an mysql_query als erstes die Abfrage übergeben und als zweites kannst du optional die DB Resource angeben ( nicht verwechseln mit dem Datenbank Namen).

Der zweite Fehler rührt also denke ich daher, dass du mysql_query($db_name,"INSERT ..."); anstatt mysql_query("INSERT ..."); eingibst.

(Ich war doch noch richtig ?.. mit mysql gehts aber mit notice error und mit mysql_query gehts nicht weil wegen not a valid MySQL-Link)
 
 
Nach oben
RVD
Alt 16.04.2008, 14:05   #7
Standard

ja, genau, da hast du recht, ich hab mein post auch dementsprechend editiert, damit ich kein doppelpost mache =)
 
 
Nach oben
Alp.traum
Alt 16.04.2008, 14:08   #8
Standard

Mach aus
Code:
 $loeschdatei=$_GET["file"];
 mysql_query("DELETE FROM `fotos` WHERE 'dateiname'='$loeschdatei'");
das:
Code:
 $loeschdatei=$_GET["file"];
 mysql_query("DELETE FROM `fotos` WHERE `dateiname`='$loeschdatei'");
Bei dateiname die Backticks sind/waren falsch.
 
 
Nach oben
RVD
Alt 16.04.2008, 14:13   #9
Standard

woah ich liebe dich ... da hätt ich wahrscheinlich ewig nach gesucht, ob die anders sind und erstmal tausend andere sachen geändert. jetzt gehts
 
 
Nach oben
Alp.traum
Alt 16.04.2008, 14:15   #10
Standard

Gern geschehen

/edit
Übrigens, ist das eine öffentliche Seite oder hast nur du Zugriff darauf?
 
 
Nach oben
RVD
Alt 16.04.2008, 14:30   #11
Standard

nur ich, aber wieso fragst du?
 
 
Nach oben
Alp.traum
Alt 16.04.2008, 14:34   #12
Standard

Weil dein Skript extrem unsicher ist. Alles Benutzereingaben müssen validiert werden, ansonsten kann man Schabernack treiben. Konkret:

Code:
$loeschdatei=$_GET["file"];
Hier könnte sonstwas drinstehen. Z.B. auch eine Anweisung die dein MySQL-Query um weitere ungewollte Befehle erweitert. Das geht soweit dass man alle Tabellen auslesen kann und auch sonst alles tun kann was der MySQL-User darf. In der Regel heißt das: Man kann sogar die komplette Datenbank löschen oder zumindest alle Tabellen leeren.

Um das zu verhinden gibt es einen Maskierungsbefehl der die entscheidenden Zeichen escaped:
Code:
$loeschdatei=mysql_real_escape_string($_GET["file"]);
Das Ganze nennt sich SQL Injection, google mal danach falls du mehr wissen willst. Regel: Benutzereingaben NIEMALS vertrauen und IMMER überprüfen. Auch du kannst mal Fehler machen, und man sollte sich einen guten Stil angewöhnen.
 
 
Nach oben
RVD
Alt 16.04.2008, 14:48   #13
Standard

danke, werd ich mal nach sehen, aber der ganze bereich ist ja passwortgeschützt, da kommt doch garkeiner rein oder geht das trotzdem was du meinst?

ich denke du meinst, dass wenn jemand eine datei hoch läd, dass der dann nicht bild.jpg, sondern irgendwelche sql befehle rein schreibt, die dann durch das get übergeben werden oder?

natürlich kann die sicherheit nicht hoch genug sein, aber beim löschen wird überprüft, ob die datei existiert. wenn nicht, wird auch nichts gemacht. beim schreiben wär dein vorschlag sinnvoller, denn da muss ich mir dei get variablen ja auch speichern
 
 
Nach oben
Alp.traum
Alt 16.04.2008, 14:53   #14
Standard

Nein ich rede nicht von manipulierten Dateien sondern von GET und POST Parametern (siehe meine Code-Schnipsel). Man kann diese Parameter mit Leichtigkeit manipulieren und SQL Befehle einschleusen.

Das geht natürlich nur, wie du schon sagst, wenn man in den passwortgeschützten Bereich kommt. Aber auch für Besucher der Seite gibt es ja vermutlich SQL-Queries. Und sobald der Benutzer da was auswählen darf (Sortierung, Filter, Suche, ein bestimmtes Album, ...) werden ja POST oder GET Parameter übergeben und du hast das gleiche Problem.

Deswegen gibt es z.B. die Funktion mysql_real_escape_string().

Siehe: http://de.wikipedia.org/wiki/SQL-Injektion
Und: http://de2.php.net/manual/de/functio...ape-string.php
 
 
Nach oben
RVD
Alt 16.04.2008, 14:58   #15
Standard

soso ... registrierte benutzer und so gibt es nicht. lediglich auf der seite, auf der die bilder dann ausgelesen werden treffen besucher auf eine sql abfrage, eben auf die zum auslesen der dateiinformationen.

ich finds ja sinnvoll was du sagst und bin dir dankbar =)
 
 
Nach oben
Alp.traum
Alt 16.04.2008, 15:06   #16
Standard

Jo es geht mir halt darum dass man lieber gleich sicheren Code produziert und nicht erst abwägt ob das auch so klappen müsste
 
 
Nach oben
RVD
Alt 16.04.2008, 15:17   #17
Standard

ja ne is schon klar, aber eine frage hab ich da mal nachdem ich mir das jetzt durchgelesen und angesehen habe. eigentlich dürfte das bei mir bis jetzt kein problem sein, weil besucher nirgends eine eingabe machen und in den adminbreich kommen sie logischerweise nicht rein. aber da es sich ja um bilder mit kategorien handelt sollen natürlich erst die kategorien angezeigt werden und wenn der user dann auf eine klickt, werden die bilder der kategorie angezeigt. also wenn man auf eine kategorie klickt wird der url zb ?kategorie=sport mit gegeben, so dass ich dann per if ($kategorie==sport) usw alle bilder der jeweiligen kategorie anzeigen lassen kann.

das dürfte dann nach dem was ich jetzt gelesen habe extrem scheiße sein, weil jemand einfach hinter die variablenübergabe seine sql injection packen könnte?!
 
 
Nach oben
RVD
Alt 22.04.2008, 17:18   #18
Standard

ok dann mach ich mal keinen neuen thread auf, iss ja auch nur ne kleene frage.

ich bekomme beim auslesen aus der datenbank folgenden fehler durch mysql_error() angezeigt:

Fehler! Mysql Error: Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)

ist das ein serverproblem? kennt den fehler schon jemand? hört sich ja irgendwie danach an, als wär der socket schon mit einer verbindung besetzt und kann nicht noch eine machen. in der datei wird bis jetzt zumindest aber nur diese eine verbindung hergestellt. könnte aus einer anderen datei vielleicht nicht richtig geschlossen worden sein?!


edit: hat sich schon erledigt =)

Geändert von RVD (22.04.2008 um 17:47 Uhr).
 
 
Nach oben
myUnderTakeR
Alt 05.05.2008, 00:40   #19
Standard

Zitat von RVD Beitrag anzeigen
ja ne is schon klar, aber eine frage hab ich da mal nachdem ich mir das jetzt durchgelesen und angesehen habe. eigentlich dürfte das bei mir bis jetzt kein problem sein, weil besucher nirgends eine eingabe machen und in den adminbreich kommen sie logischerweise nicht rein. aber da es sich ja um bilder mit kategorien handelt sollen natürlich erst die kategorien angezeigt werden und wenn der user dann auf eine klickt, werden die bilder der kategorie angezeigt. also wenn man auf eine kategorie klickt wird der url zb ?kategorie=sport mit gegeben, so dass ich dann per if ($kategorie==sport) usw alle bilder der jeweiligen kategorie anzeigen lassen kann.

das dürfte dann nach dem was ich jetzt gelesen habe extrem scheiße sein, weil jemand einfach hinter die variablenübergabe seine sql injection packen könnte?!
Deshalb soltest du $_GET[kategorie] ebensfalls wieder durch die real_escape Funktion jagen.

... das garantiert natürlich auch nicht 100%ige Sicherheit.
Ich würde den Kategorien IDs zuweisen.

... jetzt hast du nämlich weiterhin die Möglichkeit $_GET[kategorie] nach dem escape zu überprüfen, ob die Variable denn wirklich nur aus numerischen Ziffern besteht.

Das ist halt dieser Grundgedanke... es gibt Sicherlich noch zig Möglichkeiten das ganze sicher zu machen und auch wieder zu knacken, aber da hilft die google bestimmt gerne.


Gruß
 
 
Nach oben
Ähnliche Themen, die dich vielleicht interessieren
Thema Autor Forum Antworten Letzter Beitrag
mysql fehler 10061 can`t connect mysql on localhost Calli Coder's Area 6 20.08.2004 15:29
Möglichkeiten in mysql Calli Coder's Area 3 19.08.2004 12:37
php-nuke und mysql marcell0 Coder's Area 4 13.06.2004 13:21
PHP / MySQL tutorial für News gesucht! rölölö Coder's Area 5 22.09.2003 01:35
(online) mySQL Editor ?? neo18tilidie Coder's Area 8 17.02.2003 18:49
Anzeigen:
Antwort

Themen-Optionen



Alle Zeitangaben in WEZ +2. Es ist jetzt 07:44 Uhr.


Lupuz.de - wir können auch anders!
©1998 - 2008, Lupuz:Information-Network
Powered by vBulletin Version 3.7.1 (Deutsch), Jelsoft Enterprises Ltd.
Grüne Links?

SEO by vBSEO 3.1.0 ©2007, Crawlability, Inc.