PHP Ein paar Fragen | Suche Tutor ;D

Timdaroxxa

Lieutenant
Registriert
März 2009
Beiträge
954
Hi,
ich bin kompletter Anfänger in PHP (bzw. allgemein im Programmieren), lerne es nach dem Motto "learning by doing" und habe nun ein paar Fragen:

(Ich bin dabei ein Login/Registrierungssystem zu bauen)

Wenn ich meine Formular-Daten an mein PHP-Script weitergebe, möchte ich falls leere Felder bestehen, das einen Teil des Scripts abbrechen und etwas ausgeben.
Da ich mehrere Felder habe und alle gefüllt werden sollen, reicht es aus wenn ein Feld leer ist, damit das Script einen Teil überspringt.
Nun Frage ich mich, ob es eine schönere Variante gibt als
Code:
if (!$variable or !$variable or !$variable or !$variable)

Nächste Frage: Ich möchte jedem User eine eindeutige User-Id geben, also einfach immer
Code:
Userid++;
.
Da die Daten alle in einer MySQL-Tabelle gespeichert werden, soll dort auch zu jedem Nutzer seine Id.
Wie lasse ich am besten die Id zählen? Einfach eine neue Tabelle erstellen mit einem Feld, welches jedes mal bei einer Registrierung abgefragt wird und dann, bei erfolgreicher Registrierung, +1 macht?

Und noch eine Frage: Ist es theoretisch möglich, dass zwei Id's doppelt vergeben werden, wenn sich 2 Leute gleichzeitig registrieren? (Oder werden 2 PHP-Scripte immer nacheinander ausgeführt? Wäre doch ein bisschen langsam für große Seiten oder?)


Und mein letztes Anliegen: Ich fände es suuuuper, falls es einen ComputerBase-User gibt, der mir eben solche leichten Anfängerfragen, einfach abends schnell per Skype beantworten könnte... Einfach mal per PM melden. Ich wäre sehr dankbar! :D

Also ich hoffe das ist nicht zuviel für euch...

Liebe Grüße
Tim
 
Nun Frage ich mich, ob es eine schönere Variante gibt als
if (!$variable or !$variable or !$variable or !$variable)
PHP:
if(isset($_POST['sent'])){
  if(empty($_POST['nickname']) OR empty($_POST['password'])){
    // Leer
  } else {
    // Nicht Leer
  }
}
Du prüfst ob die Variable existiert, und sie existieren immer. (bis auf checkbox)
Da die Daten alle in einer MySQL-Tabelle gespeichert werden, soll dort auch zu jedem Nutzer seine Id.
Wie lasse ich am besten die Id zählen? Einfach eine neue Tabelle erstellen mit einem Feld, welches jedes mal bei einer Registrierung abgefragt wird und dann, bei erfolgreicher Registrierung, +1 macht?
Keine Sorge, das übernimmt MySQL.
Einfach einen neuen User anlegen und beim Inserten die userid auf NULL setzen, dann wird incremented. :)

Natürlich sollte das userid-Feld kein int sondern serial auto_increment sein.

Falls dir die Begriffe nichts sagen solltest du dich erst mal damit auseinandersetzen bevor du los programmierst.
 
Was schöner ist oder nicht lässt sich an einer Zeile nicht sagen... aber man kann auch einfach die ganzen Bedingungen in eine eigene Funktion auslagern dass es so aussieht

function isInputValid()
{
if (!$variable) return false;
if (!$variable) return false;
if (!$variable) return false;
return true;
}

...
if (!isInputValid())

ich hoffe nur, du nimmst $_GET und $_POST für die Variablen...

Und das ID-Zählen würde ich den SQL-Server überlassen...

@Adam Gontier: ich glaub das mit dem IF hast du nicht kapiert, bei mir hat's auch länger gedauert... es geht denke ich um verschiedene Variablen, nicht um eine...
 
@Adam Gontier: ich glaub das mit dem IF hast du nicht kapiert, bei mir hat's auch länger gedauert... es geht denke ich um verschiedene Variablen, nicht um eine...
Es soll doch geprüft werden ob ein Feld leer ist, und ich prüfe doch ob mind. ein Feld leer ist.

Würde gerne wissen ob ich was falsch gemacht habe oder ob ich das o.g. Problem falsch verstanden habe.
 
Hi,
Danke für die Antworten...
Tut mir Leid, dass ich mich so unklar ausgedrückt habe.

1668Mib hat es trotzdem wie gewollt beantwortet.

Das mit dem Server zahlen lassen sehr ich mir an, vielen dank.

Mir waren bis jetzt nur GET und POST bekannt. Gibt es irgendwo eine Auflistung von Methoden dieser Art mit Vor und Nachteilen?

Grüße und vielen Dank an euch beide!
 
Eure Vorschläge erreichen genau das gleiche, was ja schonmal super ist. Mir ging aber um schöne Schreibweise und da ist 1663 Minuten seine einfach schöner :freaky:
 
SelfPHP wäre wohl neben php.net die pasende Einsteigslektüre...

@Adam Gontier: ich glaube nicht, dass er vier mal prüfen muss, ob die selbe Variable leer ist... nehme ich mal an ;-)
 
Hi,
ich habe noch eine neue Frage:

Wenn ich z.B.
$a = TRUE //Wird von einer function zurückgeben
habe, kann ich mithilfe von
if(!$a) {echo "blabla"}

bestimmen, ob die function true oder false ausgespuckt hat?

(Bei mir jedenfalls Funktionierts so gerade nicht :D, aber ich war mir nicht sicher ob ich einfach ein Fehler programmiert habe oder die Syntax falsch!)

Gruß
Tim
 
Timdaroxxa schrieb:
Hi,
Wenn ich meine Formular-Daten an mein PHP-Script weitergebe, möchte ich falls leere Felder bestehen, das einen Teil des Scripts abbrechen und etwas ausgeben.

Wenn du das öfter hast solltest du überlegen, ob du das nicht vereinfachen kannst. Ich würde für sowas eine eigene Klasse bauen, der ich einfach nur ein Array oder einen String mit den gewünschten Variablen mitgeb, und die true oder false ausgibt, je nachdem ob alle Variablen gesetzt sind. Die kannst du immer wieder verwenden.
Code:
class CheckPost {
  public function checkRequired($aRequired) {
    foreach($aRequired as $key => $sRequired) {
      if(!isset($__POST[§sRequired]) || empty($__POST[§sRequired])) {
        return false;
      } else {
         return true;
      }
    }
  }
}

In deinem Programm dann normal inkludieren und mit $oBu = new CheckPost() instantiieren, dann einfach die gewünschten Variablen als Array übergeben und cheken:
Code:
if($oBu->checkRequired(array('variablenname', 'variablenname2'))) {
  echo 'alles ausgefüllt.';
} else {
  echo 'da fehlt was.';
}

du bekommst dann true zurück wenn alles gesetzt ist.

Timdaroxxa schrieb:
Nächste Frage: Ich möchte jedem User eine eindeutige User-Id geben

Und noch eine Frage: Ist es theoretisch möglich, dass zwei Id's doppelt vergeben werden, wenn sich 2 Leute gleichzeitig registrieren? (Oder werden 2 PHP-Scripte immer nacheinander ausgeführt? Wäre doch ein bisschen langsam für große Seiten oder?)

Du definierst userid einfach als primary key deiner Usertabelle in SQL, Primary Keys sind immer einzigartig und zählen selbst hoch, da brauchst du nichts mehr zu machen. Deine Problemstellung ist aber eine gute, belies dich dazu zu Datenbanken, Locks und Transactions.
Ergänzung ()

Timdaroxxa schrieb:
Wenn ich z.B. bestimmen, ob die function true oder false ausgespuckt hat?

Kannst du. Was du wissen mußt: alles ist Eins, außer die Null. Dazu solltest du das PHP Manual nochmal etwas genauer zu "bool" befragen. Im Wesentlichen:

function a() {
return false;
}

if(a()) ->gibt false, denn false ist != true

if(!a()) -> gibt true, denn false == nicht true

True und false lassen sich durch (Alles außer 0 und false) und (0 und false) ersetzen. Aussnahme ist NULL, das solltest du je nach Sprache googlen (um von PHP wegzukommen), leere Strings solltest du mit empty() abprüfen, und wenn du nicht sicher bist o es eine Variable überhaupt schon gibt nimm erstmal isset() eh du irgendwas machst.
 
mambokurt schrieb:
Code:
class CheckPost {
  public function checkRequired($aRequired) {
    foreach($aRequired as $key => $sRequired) {
      if(!isset($__POST[§sRequired]) || empty($__POST[§sRequired])) {
        return false;
      } else {
         return true;
      }
    }
  }
}
Du hast gerade (mal abgesehen von den Syntaxfehlern) nur die erste Variable geprüft.
Ungarische Notation ist auch eher unschön.
"if (...) return true; else return false;"-Konstrukte sollten ebenfalls nochmal zum Nachdenken anregen.

@Topic: Ich halte nicht viel von PHP als Einstiegssprache, weil es zum Frickeln verleitet. Wenn es aber unbedingt sein muss, dann schau dich mal auf http://www.phptherightway.com/ um.
 
character schrieb:
Du hast gerade (mal abgesehen von den Syntaxfehlern) nur die erste Variable geprüft.
Ungarische Notation ist auch eher unschön.
"if (...) return true; else return false;"-Konstrukte sollten ebenfalls nochmal zum Nachdenken anregen.

War nur schnell hingeklatscht, wenn du schon meckerst hättest du auch gleich korrigieren können :D

Code:
class CheckPost {
  public function checkRequired($aRequired) {
    foreach($aRequired as $iKey => $sRequired) {
      if(!isset($__POST[$sRequired]) || empty($__POST[$sRequired])) {
        return false;
      } 
    }
    return true;
  }
}

Was die ungarische Notation angeht: gerade bei PHP find ich das relativ sinnvoll, einfach weil man weiß was was ist und nicht so schnell verleitet wird sein Array zwischenzeitlich als Bool zu verwursten ^^ In Verbindung mit sprechenden Bezeichnern erhöht das IMHO die Lesbarkeit ein ganzes Stück, aber jedem wie es ihm gefällt :D
 
mambokurt schrieb:
In Verbindung mit sprechenden Bezeichnern erhöht das IMHO die Lesbarkeit ein ganzes Stück, aber jedem wie es ihm gefällt :D
Wenn du sowas brauchst bzw. sowas "hilft", dann sind deine Variablennamen ohnehin schon komisch gewählt. Außerdem widerspricht es den PHP (und PEAR) Coding Standards. Natürlich hält dich keiner auf, das trotzdem so zu machen.
 
@mambokurt: Wenn es dann vier, fünf Variablen sind, dann wird der Aufruf auch nicht wirklich übersichtlicher... warum man für so eine Methode unbedingt eine Klassen-Instanz braucht, ist mir jetzt auch nicht ganz klar...

Und beim foreach würde ich das (eh nicht genutzte) $iKey weglassen... und

@character: Naja, sind so gewäht, dass das Prefix den Typ sagen soll... was ich ehrlich gesagt auch nicht gut finde, man kann die meisten Variablen auch so nennen, dass der Typ klar ist...
 
character schrieb:
Wenn du sowas brauchst bzw. sowas "hilft", dann sind deine Variablennamen ohnehin schon komisch gewählt. Außerdem widerspricht es den PHP (und PEAR) Coding Standards. Natürlich hält dich keiner auf, das trotzdem so zu machen.

Welchen von den 10 Standards widerspricht es denn ;) Wichtig ist doch letztendlich dass man sich mit seinen Mitentwicklern einigt und den Standard dann durchzieht. Letztendlich sagt nämlich Zend was andres als PEAR und PEAR was andres als CodeIgniter usw.

Und zur ungarischen Notation: public function getElements($elements). Was bekommt diese Funktion? Was ist Elements? Ein Array? Ein String? Schreibst du public function getElements($aElements) siehst du auf einen Blick was Sache ist. Bei vielen Funktionen muß man auf die Art nur den Kopf sehen, um zu wissen was sie machen, und im Endeffekt sparst du dir dadurch sogar noch Schreibarbeit weil der Bezeichner dadurch ein Stückchen 'sprechender' wird. Klar ist das für eine 20-Zeilen Funktion vielleicht umständlich, aber aus 20 Zeilen werden gerne mal 200, und die schreibst vielleicht nicht du als ursprünglicher Entwickler.

1668mib schrieb:
@mambokurt: Wenn es dann vier, fünf Variablen sind, dann wird der Aufruf auch nicht wirklich übersichtlicher... warum man für so eine Methode unbedingt eine Klassen-Instanz braucht, ist mir jetzt auch nicht ganz klar...

zu a) übersichtlicher als wenn du jede mit if prüfst.
zu b) weil du deine Funktion vielleicht an mehr als einer Stelle einsetzen willst. Spätestens wenn du die Methode in die 5. Klasse mit eingebaut hast und dann rausfindest, dass dein 'return true' total falsch gesetzt ist, bist du nämlich froh wenn du es nur in einer Klasse ändern mußt, statt in 5 ;) Davon abgesehen schreit die Klasse danach dass da noch Input validiert wird. Datumsangaben prüfen, Beträge auf Gültigkeit testen usw, würde ich alles mit in die Klasse packen.


Davon ab wollen wir uns nicht streiten, viele Wege führen nach Rom, und was besser oder schlechter ist, ist oft Geschmackssache. Timdaroxxa hat gefragt, jetzt kann er sich aussuchen was ihm an Antworten sinnvoll erscheint. Letztendlich muß jeder seine eigenen Fehler machen und Lehren daraus ziehen, ob wir hier diskutieren oder nicht ;)
 
Zuletzt bearbeitet von einem Moderator:
PHP:
public function getXyz(array $elements)
PHP unterstützt Type Hinting (teilweise). Das kann man verwenden. Abgesehen davon signalisiert schon der Plural, dass es eine Liste sein soll. Dann gibt es auch noch PHPDoc und Co.

Wie du schon gesagt hast, kann das jeder machen wie er will. Aber warum sollte man sich überhaupt etwas angewöhnen, dass in der Praxis nicht (mehr) wirklich verwendet oder wovon sogar abgeraten wird, siehe Java Naming Convention, die PSR-Standards, selbst Microsoft mittlerweile, etc...
 
Zuletzt bearbeitet:
Und schon wieder was gelernt :D
Eure Dikussion ist aüßert Interessant: Bei großen Projekten wird das entsprechende Team ja theoritsch sogar einen eigenen Standard erstellen, was ihren Ansprüchen eher genügt. (?)

Noch mal zurück zu meiner eigentlichen Fragestellung:

Ich habe das nun ähnlich wie in #3 gemacht, nur für jedes if eine function erstellt, da ich noch mehr Prüfe und für jede if -Funktion einen true oder false zurück haben möchte.

Nun ist mir aufgefallen, dass ich aus den 3 functions doch eine machen könnte, welcher ich 3 Variablen gebe und welche auch 3 zurückgibt?
Meine Frage nun: Wenn ich 3 zurückgeben will (3mal true oder false), muss ich dann ein Array zurückgeben oder gibt es eine bessere Variante?


Gruß Tim
 
Wenn du drei Ergebnisse zurückgeben willst, musst du bei PHP ein Array oder eine eigene Implementierung nehmen. Letzteres ist Overkill, also nimm ein Array. Es gibt leider keinen Tupel-Datentypen.
 
Warum 3 Rückgabewerte? Wenn eine der Prüfungen fehl schlägt ist das Gesamtergebnis doch false, also brauchst du nur einen Rückgabewert. Oder interessieren dich die Einzelergebnisse?
 
Zurück
Oben