Archiv verlassen und diese Seite im Standarddesign anzeigen : php erkennt leeres feld nicht?
// Mandant anhand des Firmenschalter suchen
$mandant = $db->queryRow('SELECT * FROM kundenlizenzen WHERE Firmenschalter = \''. $this->get['f'] .'\'');
if(!$mandant) {
$mandant = $db->queryRow('SELECT * FROM kundenlizenzen WHERE FB1 = \''. $this->get['fb1'] .'\'');
} else {
return $mandant['ID'];
wenn der firmenschalter leer ist, soll der nach fb1 suchen...
wenn beide leer sind, wird ein neuer eintrag in der datenbank angelegt.
das problem liegt nun darin, dass php wohl nicht erkennt, dass eine datenfeld leer ist.
wenn das datenfeld leer ist, wird wohl ein leerzeichen oder sontiges mitgegeben, sodass falsche einträge entstehen.
hat jmd. rat?
dankeschön :)
Die das was du übergibst per var_dump ausgeben lassen. Und den Query auch.
danke erstmal.:jo:
Leider bin ich kein phpler, sondern vbler =/.
mir wurde das skript überlassen...weil unser phpler abgangen ist.
es wäre also sehr nett, wenn du den code scheiben koenntest :)
es wäre also sehr nett, wenn du den code scheiben koenntest :)
Wenn du willst, dass dir das jemand schreibt, dann verschiebe ich es zur Projekthilfe. Ansonsten gibt es hier keinen fertigen Code.
Peter
das problem liegt nun darin, dass php wohl nicht erkennt, dass eine datenfeld leer ist.
Wieso soll PHP das "erkennen"?
Erst mal müsstest du uns mitteilen, was die Methode $db->queryRow macht - liefert die direkt einen Feldinhalt zurück?
Andernfalls wäre es unsinnig, aus ihrem Rückgabewert Schlüsse über Feldinhalte ziehen zu wollen.
Und dann wäre auch "leer" erst mal zu definieren. Feldtyp, Feldinhalt? Ein Leerstring ist etwas anderes als wirklich leer.
Dann hol ich mal weiter aus:
ich habe in vb eine lizensierungssoftware geschrieben. mit jedem login eines kunden wird eine url mit relevanten daten ans uns geschickt.
Diese url geht dann an das php-skript.
Dieses prüft nun, anhand des firmenschalters, ob der mandant schon vorhanden ist.
Nun gibt es kunden, die keinen firmenschalter haben. also soll nach der firmenbezeichung1 (fb1) gefragt werden.
Die eingeloggten clienten werden anhand einer Kunden ID an die ID der Mandanten gebunden:
in vb habe ich also 2 tabellen: eine mit mandanten, eine mit clienten.
Nun trat das problem auf, dass unter einem mandanten clienten waren, die garnnicht zu dem mandanten gehoerten.
Bsp.:
der erste kunde,der keinen firmenschalter hat, loggt sich ein. die firma wird also in der datenbank angelegt und der kunde wird der firma zugeordnet
nun loggt sich ein zweiter kunde eine, einer anderen firma versteht sich, auch ohne firmenschalter.
Anstatt nun eine neue firma anzulegen, und den kunden dort unterzubringen, legt er ihn unter der firma an, die vorher auch ohne firmenschalter angelegt wurde.
d.h.: so wie es aussieht, wird wenn das feld firmenschalter leer ist, doch irgendein wert mitgegeben....
// Mandant anhand des Firmenschalter suchen
$mandant = $db->queryRow('SELECT * FROM kundenlizenzen WHERE Firmenschalter = \''. $this->get['f'] .'\'');
if(!$mandant) {
$mandant = $db->queryRow('SELECT * FROM kundenlizenzen WHERE FB1 = \''. $this->get['fb1'] .'\'');
} else {
return $mandant['ID'];
..würde heissen, dass er nie in die if zeile springen würde, was er auch nicht tut, wenn das feld leer ist.
d.h.: so wie es aussieht, wird wenn das feld firmenschalter leer ist, doch irgendein wert mitgegeben....Hast du das mal Überprüft???
Anders kann ich mir das nicht vorstellen, waere es leer, würde er in die if zeile gehen und mir dementsprechendes in die db schreiben, was leider nicht der fall ist...
ich habe versucht es mit emppty abzufangen, bzw. ein kollege. aber es klappte leider nicht.
Nochmal: ist das "Feld" leer, oder nicht?
Dann hol ich mal weiter aus:
Nicht viel schwafeln, sondern die explizit gestellten Rückfragen beantworten bitte, danke.
ja das feld in der datenbank ist leer.
zu den andren fragen: feld ist als variant deklariert, soviel ich weiss.
zum qurey row, ja sollte direkt nen feldinhalt wiedergeben
ja das feld in der datenbank ist leer.Vielleicht verwechsel ich jetzt was, aber was hat das Datenbankfeld mit der IF-Abfrage zu tun, die du etwas weiter oben ansprichst?
sry, bin kein phpler =/.
$mandant = $db->queryRow('SELECT * FROM kundenlizenzen WHERE Firmenschalter = \''. $this->get['f'] .'\'');
if(!$mandant) {
$mandant = $db->queryRow('SELECT * FROM kundenlizenzen WHERE FB1 = \''. $this->get['fb1'] .'\'');
} else {
return $mandant['ID'];
aber für mich erklärt sich das so:
in der ersten zeile wird die variable $mandant deklariert, soll aber nicht deklariert werden, wenn das feld firmenschalter in der datenbank leer ist.
Die zweite Zeile mit if erklärt sich mir so, dass er nur in diese prozedur geht, wenn der variablen in der ersten zeile nichts übergeben wurde. oder versteh ich das falsch?
ich bin kein phpler, daher denk ich, dass ich eher nen denkfehler habe :).
Oder dient die if abfrage dazu, zu checken ob in der datenbank bereits ein feld ist mit dem wert?
Lass dir endlich die Queries ausgeben!
onemorenerd 08-07-2009, 20:54 Die erste Zeile zieht einen Datensatz mit gewünschtem Firmenschalter-Wert aus der DB. Gibt es keinen solchen Datensatz, gibt queryRow() dennoch etwas zurück. Wahrscheinlich ist das NULL, könnte aber auch FALSE oder ein leeres Array sein.
Du kannst das herausfinden, indem du im WHERE mal 1 = 0 einbaust und dann ein var_dump($mandant) machst.
Um herauszufinden ob die If-Bedingung in diesem Fall wahr wird, kannst du im If-Block ein die('im IF') einsetzen.
Noch etwas: Die Logik dieses Codeschnipsels ist sehr fragwürdig. Wenn der Firmenschalter passt, wird die ID des Mandanten zurückgegeben. Wenn sie nicht passt, wird anhand eines anderen Kriteriums ein Mandant bestimmt. Aber was dann? Sollte dann nicht auch dessen ID zurückgegeben werden?
@ unset, muss dich leider enttäuschen, aber ich hab 0 Ahnung von php, ausserdem hab ich den code zu hause eh nicht testen.
danke onemorenerd, auf die bestätigung habe ich gewartet.
d.h. also wenn das datenbankfeld leer ist, gibt queryrow doch irgendeinen wert mit...somit kommt die if abfrage erst garnicht zum zug, wenn ich das richtig verstanden habe.
danke schonmal, ich werde das morgen am telefon mit meinem Kollegen klären.
@ unset, muss dich leider enttäuschen, aber ich hab 0 Ahnung von php, ausserdem hab ich den code zu hause eh nicht testen.
Du wirst ja wohl in der Lage sein, dich in einem Handbuch schlau zu machen (auch wenn ich dir die entsprechenden Befehle schon Eingangs genannt habe)? Ansonsten: Wenn du dazu _nicht_ in der Lage bist, solltest du dir evtl. einen anderen Job suchen. PHP ist nicht VB, aber das sind Basics!
Ohne zu wissen, was in deinen Queries steht und was deine Klassen zurückgeben, ist das hier ein Ratespiel.
onemorenerd 08-07-2009, 21:05 d.h. also wenn das datenbankfeld leer ist, gibt queryrow doch irgendeinen wert mit...somit kommt die if abfrage erst garnicht zum zug
Das ist so nicht korrekt. Die If-Bedingung wird auf jeden Fall evaluiert.
Ob sie wahr wird und deshalb der If-Block betreten wird, hängt davon ab was $mandant enthält und wie PHP das automatisch zu einem Boolean castet.
@ unset, ich progarmmiere auch erst seit bischen mehr als 2 monaten vb, komme da auch gut voran. dass es nicht nur bei vb bleiben wird ist klar, aber für den anfang kann ich auch nicht 5 programmiersprachen gleichzeitig lernen.
und das man förmlich bleiben und man mir trotz dem helfen kann zeigen hier andere :)
danke onemorenerd..ich werde das morgen abklären, kannst du mir als abschluss in etwa sagen, was drin stehen darf und was nicht?
Bedanke mich an der Stelle an alle hilfbereiten und wünsch allen noch einen schönen Abend.
Gruß Jan.
@ unset, ich progarmmiere auch erst seit bischen mehr als 2 monaten vb, komme da auch gut voran. dass es nicht nur bei vb bleiben wird ist klar, aber für den anfang kann ich auch nicht 5 programmiersprachen gleichzeitig lernen.
Dann kommst du nicht aus der VB Ecke sondern kannst nichts. Das ist nicht bös' gemeint, aber wichtig für helfende zu wissen.
Gerne etwas ausführlicher:
Lass dir den entscheidenen Query ausgeben. Lass dir das Ergebnis ausgeben:
$query = 'SELECT * FROM kundenlizenzen WHERE Firmenschalter = \''. $this->get['f'] .'\'';
var_dump($query);
$mandant = $db->queryRow($query);
var_dump($mandant);
if(!$mandant) {
$mandant = $db->queryRow('SELECT * FROM kundenlizenzen WHERE FB1 = \''. $this->get['fb1'] .'\'');
} else {
return $mandant['ID'];
Was auf true/false gecastet wird, wird hier erklärt: PHP: PHP type comparison tables - Manual (http://de.php.net/manual/de/types.comparisons.php)
Damit sollte dir genügend Hilfe zur Selbsthilfe gegeben worden sein.
Okay, dass noch dabei bin und NOCH ( =D ) nicht in die "vb ecke" gehoere muss ich wohl eingestehen.
und danke unset, werd mich dran machen.
Noch etwas: Die Logik dieses Codeschnipsels ist sehr fragwürdig. Wenn der Firmenschalter passt, wird die ID des Mandanten zurückgegeben. Wenn sie nicht passt, wird anhand eines anderen Kriteriums ein Mandant bestimmt. Aber was dann? Sollte dann nicht auch dessen ID zurückgegeben werden?
function check_mandant()
{
$db = &singleton('database');
// Mandant anhand des Firmenschalter suchen
$mandant = $db->queryRow('SELECT * FROM kundenlizenzen WHERE Firmenschalter = \''. $this->get['f'] .'\'');
if(!$mandant) {
$mandant = $db->queryRow('SELECT * FROM kundenlizenzen WHERE FB1 = \''. $this->get['fb1'] .'\'');
} else {
return $mandant['ID'];
}
if(!$mandant) {
$ssql = 'INSERT INTO kundenlizenzen (FB1, FB2, PLZ, Firmenschalter, AngelegtAm) '.
'VALUES (\''.$this->get['fb1'].'\', \''.$this->get['fb2'].'\', \''.$this->get['p'].'\', \''.$this->get['f'].'\', NOW())';
$db->query($ssql);
$id = $db->insertId();
$this->log($this->user_id, sprintf($this->config['msg_mandant_not_found'], $this->get['fb1'], $id));
return $id;
} else {
return $mandant['ID'];
}
}
onemorenerd 09-07-2009, 00:58 Vertausche mal if- und else-Zweig und negiere dementsprechend die if-Bedingung. Dann brauchst du auf einmal das else gar nicht mehr ...
// Auswahl nach Firmenschalter
$mandant = ...;
if ($mandant) {
// hat geklappt, wir sind fertig
return $mandant['id'];
}
// Auswahl nach FB1
$mandant = ...;
if ($mandant) {
// hat geklappt, wir sind fertig
return $mandant['id'];
}
// neu anlegen
...
return $id;Das nennt sich early return. Sehr übersichtlich, sehr flach.
Eine andere Variante wäre verschachteltes if-else.
// Auswahl nach Firmenschalter
$mandant = ...;
if (!$mandant) {
// hat nicht geklappt, versuche Auswahl nach FB1
$mandant = ...;
if (!$mandant) {
// hat nicht geklappt, neu anlegen
...
return $id;
}
}
return $mandant['id'];Early return ist was für Funktionen, die nur etwas "besorgen" und zurückgeben, verschachteltes if-else hat dagegen den Vorteil, dass man vor dem return noch irgend etwas mit den Daten anstellen kann.
function check_mandant()
{
$db = &singleton('database');
// Mandant anhand des Firmenschalter suchen
$fschalter = str_replace(" ", "", $this->get['f']);
if(!empty ($fschalter) && strlen($fschalter) > 0){
$mandant = $db->queryRow('SELECT * FROM kundenlizenzen WHERE Firmenschalter = \''.$fschalter.'\' ');
}else{
$mandant = false;
}
if(!$mandant) {
if(!empty($this->get['fb1'])){
$mandant = $db->queryRow('SELECT * FROM kundenlizenzen WHERE FB1 = \''. $this->get['fb1'] .'\'');
}
} else {
return $mandant['ID'];
}
if(!$mandant) {
$ssql = 'INSERT INTO kundenlizenzen (FB1, FB2, PLZ, Firmenschalter, AngelegtAm) '.
'VALUES (\''.$this->get['fb1'].'\', \''.$this->get['fb2'].'\', \''.$this->get['p'].'\', \''.$this->get['f'].'\', NOW())';
$db->query($ssql);
$id = $db->insertId();
$this->log($this->user_id, sprintf($this->config['msg_mandant_not_found'], $this->get['fb1'], $id));
return $id;
} else {
return $mandant['ID'];
}
}
...habs gelöst!
in der Datenbank wurde tasächlich immer ein leerzeichen mitgegeben, warum auch immer.
Danke an alle für eure Mithilfe.
Grüße Jan
|
-
- |