PHP Problem mit Mysql_fetch_object

Wlan-Kabel

Lt. Junior Grade
Registriert
Juli 2008
Beiträge
297
ich hab ein kleines Problem:

<?php
$pw1 = $_POST["pw1"];
$pw2 = $_POST["pw2"];
$user = $_POST["user"];

$mysql_server = "localhost";
$mysql_username = "brightlife";
$mysql_pw = "PASSWORT";
$mysql_db = "brightlife";

if($pw1 != $pw2)
{
die("die passwörter sind nicht identisch <a href=\"new_user.html\">Zurück</a>");
}

$verbindung = mysql_connect($mysql_server, $mysql_username, $mysql_pw);
mysql_select_db($mysql_db);

$suchanwendung = mysql_query("SELECT ip FROM `users` WHERE username LIKE $user");
$suche = mysql_fetch_object($suchanwendung) ;

if($suche != 0)
{
die("Name ist schon vorhanden <a href=\"new_user.html\">Zurück</a>");
}
$timestamp = time();
$datum = date(dmYHi, $timestamp);

$eintragetext = "INSERT INTO `users` (username, passwort, erstelldatum) VALUES ('$user', '$pw1', '$datum')";
$eintragen = mysql_query($eintragetext);

if($eintrag == false)
{
echo mysql_error();
}
else
{
echo("Account wurde erfolgreich erstellt");
}

mysql_close($verbindung);

leider kommt am ende immer:


Warning: mysql_fetch_object(): supplied argument is not a valid MySQL result resource in /users/brightlife/www/new_user.php on line 20
watt mach ich da nu falsch?

Die eingabe wird in der Tabelle gespeichert, nur das schon vorhandensein wird nicht überprüft.
 
Hi, setze $user mal in einfachen Anführungszeichen, also
PHP:
$suchanwendung = mysql_query("SELECT ip FROM `users` WHERE username LIKE '$user'");

Ansonsten fällt mir nichts auf, ich würde auch mal mysql_fetch_array() ausprobieren.


Gruß
 
$suchanwendung = mysql_query("SELECT ip FROM `users` WHERE username LIKE $user");
leider kommt MySQL nicht mit den variablen klar wie php. Php weiß, dass es sich bei $user um einen string handelt, MySQL bei der mysql_query leider nicht (mehr). deshalb muss vor und nach der variable noch ein anführungszeichen.

$suchanwendung = mysql_query("SELECT ip FROM `users` WHERE username LIKE `$user`");

Edit:
mist, zu spät ^^
 
Zuletzt bearbeitet:
hmm.... nö... daran liegts leider nicht :(. Der hat immernoch keinen bock.
 
Versuche dein Script mal etwas anders zu schreiben. Mit der Funktion mysql_num_rows kannst du auch überprüfen, ob die Suche Treffer fand:
PHP:
$suchanwendung = mysql_query("SELECT ip FROM `users` WHERE username LIKE '$user'");
$suche = mysql_num_rows($suchanwendung);

if($suche != 0)
{
die("Name ist schon vorhanden <a href=\"new_user.html\">Zurück</a>");
}


Gruß
 
Dann bau mal eben so was in der Art nach der Query mit ein:
Code:
if (!$suchanwendung ) {
    die('Ungültige Abfrage: ' . mysql_error());
}
 
Nur mal als Tipp bei der Entwicklung, und falls vorhanden.

PHP:
$sql = "SELECT user WHERE...";
echo $sql;
mysql_query($sql,$link);

Der SQL query wird ja dann auch noch auf dem Bildschirm ausgegeben und Du kannst ihn beispielsweise mit phpmyadmin testen. Du könntest aber auch die mysql_error() Funktion von php nutzen um zu sehen welchen Fehler Deine SQL-Anfrage erzeugt hat.
 
fi.sh schrieb:
leider kommt MySQL nicht mit den variablen klar wie php. Php weiß, dass es sich bei $user um einen string handelt, MySQL bei der mysql_query leider nicht (mehr). deshalb muss vor und nach der variable noch ein anführungszeichen.

die aussage an sich ist blödsinn (du willst aber warhscheinlich auf das "richtigere" hinaus), denn die strings werden in php ausgewertet und dann an die funktion übergeben. d.h. ".$foo." ist das gleiche wie "$foo" oder auch '.$foo.' (letzteres ist immer! zu bevorzugen). die variablen werden in den strings immer zuerst ausgewertet, bevor sie weitergegeben werden.
zeichenbegrenzer sind in mysql übrigens hochkommas, der accent grave wird nur für tabellen und/oder spalten verwendet, sobald diese ein leerzeichen o.ä. enthalten sollten.



mysql_error() wie gestern schon gesagt, dann weißt du auch woran es liegt. ebenfalls hast du wieder die zeichenbegrenzer vergessen.
 
<3 hab euch lieb ^^. 1668mid deine Idee hat mir die Augen geöffnet ^^. Bin im Abkürzungsirrwald etwas durcheinander geraten >.< hatte einfach zwei buchstaben verwechselt. Fiel nur nicht auf, da es beide gibt und beide ungefähr gepasst haben.

@ ChriZzz einen Syntactisch anderen Weg zu benutzen ist zwar eine Idee, da ich aber dabei bin die Sprachen zu lernen möchte ich lieber herraus finden, wo die Fehler sind. Trotzdem Danke
 
da ich aber dabei bin die Sprachen zu lernen möchte ich lieber herraus finden, wo die Fehler sind.
Verständlich ;) Gibt aber halt auch Leute, die einfach nur möchten das es funktioniert, egal wie.
Ich poste mal meine mysql_query-Funktion, vielleicht kannst du sie ja gebrauchen:
PHP:
function query($qry) {
   if(!$result = @mysql_query($qry)) {
        echo "<b>Fehler im MySQL-Query</b><br>Query: ".$qry."<br>MySQL-Error: ".mysql_error();
      die();
   } else {
   return $result;
   }
}
Die Funktion macht genau das, was die anderen hier bereits erwähnt haben ;) Kannst damit genauso arbeiten wie mit mysql_query().
 
Noch besser wäre es aber gleich ein MySQL Objekt zu erstellen um endlich die Vorteile von PHP5 zu nutzen! :)
 
Sparta8 schrieb:
Noch besser wäre es aber gleich ein MySQL Objekt zu erstellen um endlich die Vorteile von PHP5 zu nutzen! :)

Und noch sehr viel besser wäre es, gleich die in PHP5 integrierte PDO zu verwenden. Im Moment übernimmt er einfach ungefiltert Nutzereingaben in die SQL-Queries. Das System würde jeder Anfänger innerhalb weniger Sekunden mittels SQL-Injections zerlegen.

Na dann noch viel Spaß beim lernen.
 
Wenn die PDO auf seinem Server installiert ist dann sicher, aber andererseits würde die PDO ja eigentlich dafür entwickelt um unabhängig vom Typ der Datenbank zu programmieren. Ich glaub aber kaum, dass dieses Programm jemals auf was anderes als MySQL laufen wird. Also halte ich PDO hier für übertrieben.
Ein Vorteil wäre es natürlich wenn er sich damit auseinander setzt und PDO für die Zukunft beherrscht.
Aber gerade für solche einfachen Applikationen eignet sich eine selbst geschriebene Klasse sehr gut.
 
Sparta8 schrieb:
Wenn die PDO auf seinem Server installiert ist dann sicher, aber andererseits würde die PDO ja eigentlich dafür entwickelt um unabhängig vom Typ der Datenbank zu programmieren. Ich glaub aber kaum, dass dieses Programm jemals auf was anderes als MySQL laufen wird. Also halte ich PDO hier für übertrieben.
Ein Vorteil wäre es natürlich wenn er sich damit auseinander setzt und PDO für die Zukunft beherrscht.
Aber gerade für solche einfachen Applikationen eignet sich eine selbst geschriebene Klasse sehr gut.


Jeder Webhoster, der PHP DB-Zugriff über etwas anderes als die PDO anbietet, sollte eigentlich wegen grober Fahrlässigkeit aus dem Verkehr gezogen werden. Es gibt unter PHP de facto keine bessere Möglichkeit, sich vor SQL-Injections zu schützen, als die Prepared Statements mit der PDO zu verwenden. Ich habe nicht umsonst den Wikipedia Artikel verlinkt. Ich verstehe beim besten Willen nicht, warum jeder meint, dass eine DB-Klasse ein guter Einstieg in die Programmierung wäre. Das ist eine sicherheitsrelevante Komponente, da kann man soviel falsch machen.

Mal davon ab, wieso sollte die PDO übertrieben sein? Genau genommen ist ihre Syntax und die von ihr zur Verfügung gestellte API um Welten besser, konsistenter und vor allem weniger umfangreich als die dämlichen nativen Methoden für MySQL und/oder Oracle/OCI. Die PDO lernt sich um ein vielfaches schneller als der andere Mist. Meiner Meinung nach, sollten die alten Schnittstellen in PHP6 komplett entfernt werden, damit die Anfänger, wenn Sie nun schon zu PHP greifen müssen, es dann wenigstens gleich von Anfang an korrekt lernen.

Just my 2 cents.
 
S.Giny schrieb:
Meiner Meinung nach, sollten die alten Schnittstellen in PHP6 komplett entfernt werden, damit die Anfänger, wenn Sie nun schon zu PHP greifen müssen, es dann wenigstens gleich von Anfang an korrekt lernen.

bloß nich! dann is die kompatibilität dahin und kaum noch was funktioniert im internet, wo eine datenbank im hintergrund sitzt. wünschenswert wäre es alle male, da würde ich auch voll und ganz dahinterstehen, aber es wird eh nie passieren, da einfach zu viel davon abhängig ist (ich meine jedes tutorial benutzt mysql_*).
 
@S.Giny

Ich kann deine Aufregung durchaus verstehen, nur ist deine Aussage zu PDO schlicht unvollständig und teilweise falsch, da schlicht nicht alle DB-Schnittstellen darauf portiert wurden. Und was nützt dir dann PDO, wenn du die Datenbank dafür nicht mehr verwenden kannst, schließlich setzt nicht jeder auf MySQL!

Webhoster sollten nebenbei wegen gänzlich anderer Fehler zur Verantwortung gezogen werden, und das gilt nicht nur für die kleinen sondern auch die ganz großen der Branche (nein ich werde keine Details nennen, da sonst morgen der Teufel los wäre).

Nebenbei bemerkt verhindert die PDO-Api nicht eine einzige SQL-Injection, das wird lediglich indirekt verhindert. Das Problem dabei ist aber wohl kaum die Schnittstelle (egal ob PDO ooder die alten, nicht mal auf PHP bezogen) sondern schlicht die Unerfahrenheit von Hobby-Entwicklern, die nun mal gerade im bereich PHP extrem stark vertreten sind.

Das Problem bei PHP ist nicht mal die Inkonsistenz der Spache an sich, sondern das die Entwicklung mit PHP eine enorme Selbstdiziplin erfordert die vergleichbar mit den Richtlinien der C-Entwicklung für den Hochsicherheitsbereich ist (z.B. die Airback oder ABS-Steuerung beim Auto). Nur das steht alles im Widerspruch zu den Bedürnissen eines Neulings. Der will den schnellen Einstieg und alles muss gleich funktionieren. Genau darauf zielen viele der Tutorials ab!
Das heißt nichts anderes das in nahezu keinem Tutorial dem "Schüler" das Basiswissen vermittelt wird sonder nur gezielt das was notwendig ist. Im Endeffekt führt das dann dazu jemand der keine Ahnung von Datenbank design hat, sich noch nie mit Sicherheitsfragen auseinandersetzen musste letztlich irgendwann seine Skripte im Web verwendet, wozu er sie schließlich geschrieben hat. Die Fragen von Anfängern in allen Foren sind ohnehin immer die gleichen, aber jeder meint er würde das Rad besser neuerfinden. Das soll jetzt nicht abfällig wirken aber diesen Trend mag ich absolut nicht, ich bastel auch nicht an einer Rakete rum nur weil ich weiss was ein Drehmoment ist.

Hier sind wir dann an dem Punkt angelangt der wirklich riskant ist. Ein Software die von Anfängern zusammen gebastelt(!) wurde erfüllt so gut wie nie irgendwelchen Standards, wie auch? Schließlich wird im Bereich Java gesagt das man mindestens 2 Berufsjahre(!) benötigt bis man die Basics beherrscht. Ähnliches Bild bei PHP: Eine ursprünglich Prozedural angelegte schwach typisierte Sprache die derzeit in die Richtung OOP umgebaut wird mit stärkerer Typisierung die aber gleichzeit um funktioniale Aspekte ergänzt werden soll in Version 6. Doof gefragt: was soll das? Wissen überhaupt die Core-Entwickler in welche Richtung sie wollen?

Letztlich muss man eine gewisse Verantworung an die Tutorial-Schreiber abwälzen, denn viele dürften sich kaum darüber im klaren sein, welchen Schaden sie langfristig anrichten. Letztlich gehorchen die aber auch nur den Gesetzen des Marktes: Es gibt eine Nachfrage an schneller und unvollständiger Einführung, also wird diese Nachfrage befriedigt.

In diesem Sinne hoffe ich darauf das sich die meisten Einsteiger im klaren darüber sind das es einen unterschied zwischen Hobby-Entwicklern und Profis gibt. Leider versucht aber gerade PHP beide Fraktionen zu bedienen, das Problem wird dadurch bestimmt nicht kleiner.
 
ag3nt schrieb:
@S.Giny
...Nebenbei bemerkt verhindert die PDO-Api nicht eine einzige SQL-Injection, das wird lediglich indirekt verhindert. Das Problem dabei ist aber wohl kaum die Schnittstelle (egal ob PDO oder die alten, nicht mal auf PHP bezogen) sondern schlicht die Unerfahrenheit von Hobby-Entwicklern, die nun mal gerade im bereich PHP extrem stark vertreten sind.
...

Das ist absolut korrekt, den gleichen Mist kann ich natürlich auch in Java oder .NET verzapfen. Die Sprache kann mir ja nicht verbieten Strings zusammen zu setzen. Aber in der Beschreibung der PDO wird explizit auf die Möglichkeit der Prepared Statements und wofür sie gut sind, hingewiesen. Dennoch hast Du Recht, meine Aussage war in dieser Hinsicht unvollständig.

Bezüglich der weiteren Entwicklung von PHP gibt es natürlicherweise einen Disput der Prioritäten. Die Sprache wurde historisch tatsächlich als QnD Lösung eingeführt und ist nun Opfer ihres eigenen Erfolges, weil sie in immer mehr professionellen Lösungen zum Einsatz kommt, da sie einen Ruf als unkompliziert und schnelle Ergebnisse fördernd genießt. Ob dieser gerechtfertigt ist, lasse ich jetzt mal dahin gestellt. Ehrlicherweise sollte Zend einen eigenen Fork starten, der die Sprache mehr in Richtung Java oder .NET verschiebt um den professionellen Bereich abzudecken. Stellt sich mir nur die Frage warum, gibt ja genug andere und zumeist bessere Lösungen (Groovy, Ruby).

BTT: Jedenfalls ändert das nichts an meiner ursprünglichen Aussage, dass der TE/TO besser die PDO erlernen sollte, als diese uralten nativen Schnittstellen. In der Beschreibung der PDO auf www.php.net werden eben wesentlich modernere Konzepte vermittelt, als es bei der MySQL API der Fall ist.

@agent
Ich denke wir sind uns eigentlich einig darüber, dass PHP nicht unbedingt die beste Einstiegssprache ist. Das sollten die Tutorials mal wirklich ehrlicherweise vermitteln.


Ciao
 
Zurück
Oben