| PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Post your PHP questions here! |
 |
|

29-07-2009, 19:47
|
|
PHP&&C++
Registrierter Benutzer
|
|
Registriert seit: Jul 2009
Beiträge: 7
|
|
Habs eh schon... Trotzdem !
|

29-07-2009, 20:08
|
|
h3ll
Registrierter Benutzer
|
|
Registriert seit: Mar 2008
Beiträge: 2.328
|
|
Zitat:
Zitat von piratos
Ich muss das anders ausdrücken
PHP-Code:
$row = mysql_fetch_object($login_query);
Ohne Treffer ergibt das:
|
Trotzdem gehört da das while() nicht hin. Wenn man nur einen Wert erwartet, sollte man keine Schleifen benutzen.
Beispiel:
PHP-Code:
if ($row = mysql_fetch_object($login_query)) { $userid = $row->id; } else { $userid = null; }
|

29-07-2009, 20:11
|
Kropff
  Administrator
|
|
Registriert seit: Mar 2002
Ort: Köln
Beiträge: 11.310
|
|
Zitat:
Zitat von PHP&&C++
Habs eh schon... Trotzdem  !
|
Dann bitte auch die Lösung für andere posten.
Danke
Peter
__________________
Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
Meine Seite
|

29-07-2009, 20:24
|
|
|
Zitat:
Zitat von h3ll
Trotzdem gehört da das while() nicht hin. Wenn man nur einen Wert erwartet, sollte man keine Schleifen benutzen.
|
Wer lesen kann hat manchmal Vorteile:
Für Leute aus der anderen Region - das bedeutet man kann das eine wie das andere machen, wobei ich persönlich auch if bevorzugen würde, aber es gibt keinerlei Zwang bis auf die Meinung anderer.
Und - mal am Rande - Performance:
Jeweils das beste Ergebnis aus 10 Abfragen:
while 4.6014785766602E-5
if 5.1021575927734E-5
Ist zwar für den Fall hier völlig uninteressant, zeigt aber das man nichts verliert.
|

29-07-2009, 20:33
|
|
gourmet
Registrierter Benutzer
|
|
Registriert seit: Feb 2007
Beiträge: 154
|
|
nur mal so zum Verständniss, vielleicht gibt es ja auch andere Lösungen, ich würde es zB. so machen.
PHP-Code:
$row = mysql_fetch_object($login_query);
if(!empty($row['user_id'])) {
echo 'Hallo du .$row['user_id'];
}
else {
echo 'Zugangsdaten falsch!;
}
wie willst du sonst überprüfen ob der Login erfolgreich war, wenn nicht mit einer IF Abfrage?
ich muß auch gestehen das ich mysql_fetch_object nicht verwende.
|

29-07-2009, 20:46
|
|
h3ll
Registrierter Benutzer
|
|
Registriert seit: Mar 2008
Beiträge: 2.328
|
|
Zitat:
Zitat von piratos
Wer lesen kann hat manchmal Vorteile:
Für Leute aus der anderen Region - das bedeutet man kann das eine wie das andere machen, wobei ich persönlich auch if bevorzugen würde, aber es gibt keinerlei Zwang bis auf die Meinung anderer.
Und - mal am Rande - Performance:
Jeweils das beste Ergebnis aus 10 Abfragen:
while 4.6014785766602E-5
if 5.1021575927734E-5
Ist zwar für den Fall hier völlig uninteressant, zeigt aber das man nichts verliert.
|
Es geht weder um Performance noch um den persönlichen Geschmack, sondern es geht um den guten Programmierstil. Wenn man nicht mehrere Werte behandelt, sollte man auch keine Schleifen verwenden, sonst könnte ein anderer Programmierer etwas anderes vermuten.
Natürlich kann man es machen und while verwenden. Man kann sogar sehr vieles machen, ohne dass es technisch gesehen "falsch" ist. Viele Wege führen nach Rom. Aber besser ist, wenn der Weg dreispurig, asphaltiert und vernünftig Beschildert ist. Man sollte niemanden auf den Schotterweg schicken, auch wenn er auch damit zum Ziel kommt.
|

29-07-2009, 21:17
|
|
|
Zitat:
|
den guten Programmierstil
|
Ich möchte dir nicht zu Nahe treten und auch nicht beleidigen, aber das geht mir langsam auf den Senkel.
Schreibe deinen Stil wie es dir gefällt aber bitte trete nicht als selbst ernannter Stilayatollah auf und vor allem zwinge deinen Stil den anderen nicht auf bzw. versuche nicht andere diesbezüglich ständig zu bevormunden.
|

29-07-2009, 21:25
|
|
h3ll
Registrierter Benutzer
|
|
Registriert seit: Mar 2008
Beiträge: 2.328
|
|
Zitat:
Zitat von piratos
Ich möchte dir nicht zu Nahe treten und auch nicht beleidigen, aber das geht mir langsam auf den Senkel.
Schreibe deinen Stil wie es dir gefällt aber bitte trete nicht als selbst ernannter Stilayatollah auf und vor allem zwinge deinen Stil den anderen nicht auf bzw. versuche nicht andere diesbezüglich ständig zu bevormunden.
|
Das ist nicht "mein" Stil. Wenn man in einem Team arbeitet, muss man so programmieren, dass sich auch derjenige sofort auskennt, der den Code zum ersten mal ansieht. Und wenn du for- oder while-Schleifen für Daten verwendest, die nur einmal vorkommen können, dann vermittelst du demjenigen eine falsche Absicht. Das kann im besten Fall den Programmierer nur ein paar Sekunden aufhalten, aber im blödesten Fall neue Fehler provozieren. So oder so ist das einfach eine schlechte Art und Weise.
Von mir aus kannst du in deinem stillen Kämmerlein so programmieren, wie du es für richtig haltest. Aber bring nicht andere dazu zu glauben, dass es "eh egal" ist, wie sie es machen. Das ist es nämlich nicht.
Und ich denke auch, dass mir hier viele Recht geben werden. Und denen hab ich bestimmt nicht "meinen" Stil aufgezwungen, sondern das sagt einem einfach der gesunde "Programmierverstand".
Geändert von h3ll (29-07-2009 um 21:39 Uhr)
|

29-07-2009, 21:36
|
|
|
Jawohl Ayatollah - blah blah und gut ist.
|

30-07-2009, 09:21
|
Kropff
  Administrator
|
|
Registriert seit: Mar 2002
Ort: Köln
Beiträge: 11.310
|
|
Jetzt ist hier Ruhe im Karton.  Sonst hau ich dazwischen.
Peter
__________________
Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
Meine Seite
|

30-07-2009, 09:34
|
|
PHP&&C++
Registrierter Benutzer
|
|
Registriert seit: Jul 2009
Beiträge: 7
|
|
Okay also meine Lösung:
Code:
<?php
$username = $_POST['username'];
$password = $_POST['password'];
$session = session_id();
$connection = mysql_connect('localhost','user','geheim') or die("Keine Verbindung zum Server.");
mysql_select_db('datenbank') or die("Keine Verbindung zur Datenbank.");
$pass = md5($password);
$user = $username;
$login = 'SELECT id FROM members WHERE name="'.$user.'" AND pass="'.$pass.'" LIMIT 1';
$login_query = mysql_query($login);
while($row = mysql_fetch_object($login_query)) {
$userid = $row->id;
}
echo 'Willkommen User-Nummer ';
echo $userid;
?>
<form action="login.php" method="post">
Benutzername: <input type="text" name="username" /><br />
Passwort: <input type="password" name="password" /><br />
<input type="submit" name="submit" value="Einloggen" />
</form>
|

30-07-2009, 09:44
|
|
h3ll
Registrierter Benutzer
|
|
Registriert seit: Mar 2008
Beiträge: 2.328
|
|
Dein Script ist anfällig für SQL-Injections. Außerdem ist die While-Schleife sinnlos.
|

30-07-2009, 14:53
|
wahsaga
 Moderator
|
|
Registriert seit: Sep 2001
Beiträge: 24.486
|
|
Zitat:
Zitat von piratos
Ich muss das anders ausdrücken
PHP-Code:
$row = mysql_fetch_object($login_query);
Ohne Treffer ergibt das:
Notice: Trying to get property of non-object
|
Auch nicht so ganz korrekt.
Die While-Schleife macht ja genau das gleiche - sie wendet mysql_fetch_XY so lange an, bis der Rückgabewert false lautet.
Wenn es kein Ergebnis gibt, dann wird der Anweisungsblock der While-Schleife auch nicht durchlaufen.
Die von dir genannte Meldung bekommt man erst im nächsten Schritt, wenn man versuchen würde, auf Eigenschaften von $row zuzugreifen, obwohl $row eben nicht das erwartete Objekt, sondern auch wieder nur false enthält.
Und die While-Schleife "rettet" im eingangs geposteten Script auch nicht - wenn die nicht durchlaufen wird, dann hat halt $userid keinen Wert, und ist beim anschliessenden Versuch, es auszugeben, nicht vorhanden und wirft dann an der Stelle eine entsprechende Meldung.
Die While-Schleife finde ich jedenfalls auch fehl am Platze, wenn lediglich ein Datensatz erwartet wird. Da nutze ich mysql_num_rows, und entscheide an Hand dessen, ob ich mir einen Wert aus diesem einen Datensatz zur Ausgabe hole, oder melde dass gar nichts gefunden wurde.
__________________
I don't believe in rebirth. Actually, I never did in my whole lives.
|

30-07-2009, 15:37
|
|
|
Es kann hier nie um die letzte Ausarbeitung eines geposteten Fragescripte gehen, das wäre völlig unsinnig, da kommt man wegen kleinster Fragestellung ins Geschwafel ohne Ende und genau das hilft dem Fragenden kein Stück weiter, ja macht sogar das Forum selbst zunehmend uninteressanter.
Ich z.B. würde immer eine DB Klasse (nämlich meine) verwenden, da dort alles abgehandelt ist.
So eine normale Abfrage sieht da z.B. technisch so aus (Auszug):
PHP-Code:
$result = mysqli_query($this->db,$sql); if (preg_match("/^(select|explain|show|describe)\s+/i", $sql) ) { $this->num_rows = mysqli_num_rows($result); } elseif (preg_match("/^(insert|delete|update|replace)\s+/i", $sql) ) { $this->rows_affected = mysqli_affected_rows($this->db); }
und man kann feststellen, das wir, wenn man es selbst macht, eigentlich identisch abarbeiten.
Man muss auch klar sehen, das hier in der Regel Leute Fragen die nicht so gewaltige Kenntnisse haben.
Ein solches Ausschweifen würde diesen nichts bringen und nur höchst verunsichern.
So auch das ewige Stilgeschwafel - das macht einen Anfänger bestimmt nicht schlauer.
Wer einen tollen Stil hat oder sich stur an eine interne Arbeitsanweisung seiner Firma hält und meint das wäre Gott und die Welt - ok - seine Sache, der soll das doch hier in ein Tutorial verkünden, das können dann alle lesen und sich dran halten oder nicht und nicht immer dann die Wundertüte öffnen, wenn einem nichts anderes mehr einfällt.
So etwas als tollen Stil zu bezeichnen kann ja wohl nicht das richtige sein.
PHP-Code:
if ($row = mysql_fetch_object($login_query)) { $userid = $row->id; } else { $userid = null; }
dann würde das besser aussehen.
PHP-Code:
// var deklarieren und initalisieren $userid = null; if ($row = mysql_fetch_object($login_query)) $userid = $row->id;
|
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
|
| Themen-Optionen |
|
|
| Thema bewerten |
|
|
Forumregeln
|
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.
HTML-Code ist aus.
|
|
|
|
PHP News
|