| Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
| Autor |
Nachricht |
Sensei User
Anmeldungsdatum: 10.03.2009 Beiträge: 17
|
23.03.2009 15:57 PEAR-Fehlermeldung bei Zugriff mittels PHP auf mySql-DB |
|
|
Hallo,
ich habe ein Formular in dem sich ein User registrieren kann. Nachdem der User das Formular mit dem senden-Button abschickt, sollen die einzelnen Felder einer Gültigkeitsprüfung unterzogen werden - unter anderem auch, ob der Login-Name bereits existiert. Und genau hier liegt das Problem!
In der Datei agent_reg.php wird diese Überprüfung mit folgendem Code durchgeführt:
| PHP: | <?php //Prüfung, ob der Login bereits vergeben ist
if (isset($_POST['submit']) && ($error == false) ) {
$find_login = Spedition::findByCondition("login = '$login'");
$test = count($find_login);
if (count($find_login) != 0) {
$error_msg .= $error_code[12];
$error = true;
}
} |
Über Spedition::findByCondition wird diese Funktion in der Datei spedition.php aufgerufen:
| PHP: | <?php public static function findByCondition($sql_where_clause) {
$sql = "Select login from spedition where ";
$sql .= "$sql_where_clause";
$erg = MDB2_util::query($sql);
return $erg;
} |
Die Funktion query in der MDB2_util wiederrum sieht folgendermaßen aus:
| PHP: | <?php static function query($sql, $data=array()) {
if (! array($data))
$data = array($data);
$db = self::get_connection();
if (preg_match('/^\s*(update|delete|insert)\s+/i', $sql))
$mode = MDB2_PREPARE_MANIP;
else
$mode=null;
$stmt =& $db->prepare( $sql, null, $mode);
if (PEAR::isError($stmt))
die("<pre>$sql </pre>:".$stmt->getMessage()." / ".$stmt->getDebugInfo());
$res =& $stmt->execute( $data);
if (PEAR::isError($res)) {
$err_msg =& $res->getMessage();
$err_msg.= $res->getDebugInfo();
die("execute: <pre>$sql</pre> [".join(",", $data)."]: $err_msg");
}
$results = array();
if (is_Object($res)) {
while($row =& $res->fetchRow(MDB2_FETCHMODE_ASSOC))
$results[] = $row;
return $results;
} else {
return $res;
}
} |
Nun ist das genaue Problem folgendes:
Ich kann bereits die ausgefüllten Felder in die Datenbank schreiben. Jedoch hatte Probleme mit der UTF-8 Codierung, da Anfangs ständig "ä", "ö", "ü", "ß"... in merkwürdigen Symbolen dargestellt wurden. Daraufhin habe ich im Internet gelesen, dass man dies mittels dem PHP-Befehl utf8_decode() beheben kann, was auch funktioniert - die Buchstaben werden richtig in die DB geschrieben.
Wenn ich nun mittels den obigen Funktionen einen Login eingebe, der bereits vergeben ist ABER keine "ä", "ö", "ü", "ß"... enthält, bekomme ich wie gewollt bei der Registrierung eine Meldung, das der Login-Name bereits vergeben ist.
Enthält der Login jedoch ein "ä", "ö", "ü", "ß"... bekomme ich duch die MDB2_util Methode query() folgende Fehlermeldung:
execute:
INSERT INTO spedition (unternehmen, zusatz, strasse, hausnr, plz, ort, ap_vorname, ap_nachname, telefonvorwahl, telefonnr_zentr, telefonnr_ap, faxvorwahl, faxnr, email, steuernummer, login, passwort) VAlUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
[test,,test,111,55555,test,test,test,6666,,4444,,,test@ggggg.gg,,���,b]: MDB2 Error: constraint violation_doQuery: [Error message: Could not execute statement] [Last executed query: EXECUTE MDB2_STATEMENT_mysql_31110ea3006b88201b31c11e9ccb1619 USING @0, @1, @2, @3, @4, @5, @6, @7, @8, @9, @10, @11, @12, @13, @14, @15, @16] [Native code: 1062] [Native message: Duplicate entry '���' for key 2]
Falls es relevant ist: Die Formularfelder werden, wie gesagt, vor dem Eintragen in die DB mit folgendem Befehl decodiert:
| PHP: | <?php $utf8_login = utf8_decode($login); |
Was mich ebenfalls verwundert ist, wenn ich mir die Varible $find_login aus der Datei agent_reg.php ausgebe, nachdem die Query ausgeführt wurde, steht hier jedesmal "Array" in der Ausgabe (wenn ich Login-Namen nutze, die in der DB existieren jedoch kein ä,ö,.... enthalten. Bei Login mit ä,ö,ü... kommt der oben besagte Fehler).
Ich nutze PHP 5 mit einer mySQL 5 Datenbank.
Über eure Hilfe wäre ich euch echt sehr dankbar, da ich bereits seit mehreren Tagen an dem Probleme hänge und nicht weiß, wie ich es lösen soll/kann.
Vielen Dank!!! |
|
| Nach oben |
|
 |
mark Power User
Anmeldungsdatum: 31.05.2004 Beiträge: 970
|
23.03.2009 23:00 |
|
|
Wegen wenig Zeit nur kurz zu dem String 'Array': Du scheinst das Ergebnis der Funktion, die $find_login bestimmt, nicht zu prüfen. Vermutlich gibt dir MDB2 (oder etwas, das darauf aufbaut) im Fehlerfall ein Array zurück. Ein var_dump($find_login); nach der Bestimmung dieser Variablen sollte klären, wo das Array herkommt und was es enthält. Ggf. kannst du dann ja passend darauf reagieren.
Zu den Encoding-Problemen meldet sich hoffentlich noch jemand anderes. |
|
| Nach oben |
|
 |
MaGdev Site Admin

Anmeldungsdatum: 04.02.2004 Beiträge: 715 Wohnort: Hamburg
|
23.03.2009 23:19 |
|
|
Zum Thema encoding:
Ich würde in heutigen Zeiten generell mit UTF-8 arbeiten. Wenn also die Formularseite als UTF-8 im Browser angezeigt wird, werden die Formulardaten auch als UTF-8 gesendet. Die Datenbank sollte dann ebenfalls UTF-8 als Zeichensatz verwenden. Ich habe mit MDB2 nie etwas gemacht, aber wenn du direkt nach dem Aufbau der Datenbankverbindung
| Code: |
set names 'utf-8';
set character set utf8;
|
sendest und dann die utf8_decode()-Befehle weglässt, sollte es gehen.
Viele Grüße,
Marco _________________ Auch der längste Weg beginnt immer mit einem kleinem Schritt!
Vorgehen bei Problemen:
1. PHP-Handbuch oder PEAR-Handbuch lesen!
2. Forensuche benutzen!
3. Fragen posten und dabei die Regeln beachten! |
|
| Nach oben |
|
 |
Sensei User
Anmeldungsdatum: 10.03.2009 Beiträge: 17
|
25.03.2009 22:33 |
|
|
Hey,
vielen Dank für Eure Hilfe!
Also, das mit dem Encoding hat geklappt, wie du gepostet hast! Tausend Dank!
Das mit dem dem Befehl vor der Variable hat auch geklappt, ich erhalte eine Ausgabe mit dem eigentlichen, gewünschten Inhalt - jedoch nicht in der Form, wie ich es verarbeiten kann.
Nachfolgend die Ausgabe des Arrays mit den Testdaten in der DB:
| Code: | | array(1) { [0]=> object(Spedition)#5 (18) { ["id:protected"]=> string(2) "59" ["unternehmen:protected"]=> string(13) "Wese Logistik" ["zusatz:protected"]=> NULL ["strasse:protected"]=> string(16) "Lüdertalstraße" ["hausnr:protected"]=> string(2) "10" ["plz:protected"]=> string(5) "36137" ["ort:protected"]=> string(9) "Frankfurt" ["ap_vorname:protected"]=> string(6) "Markus" ["ap_nachname:protected"]=> string(9) "Schneider" ["telefonvorwahl:protected"]=> string(4) "0661" ["telefonnr_zentr:protected"]=> NULL ["telefonnr_ap:protected"]=> string(5) "55555" ["faxvorwahl:protected"]=> NULL ["faxnr:protected"]=> NULL ["email:protected"]=> string(14) "test@test.test" ["steuernummer:protected"]=> NULL ["login:protected"]=> string(4) "test" ["passwort:protected"]=> string(4) "test" } } |
Zurück kommt ja ein Array. Ich glaube aber irgendwie, dass ich zu unfähig bin, dieses korrekt auszulesen. Wie mach ich das korrekt? Habe schon in der PHP-Hilfe geguckt, aber irgendwie will es nicht so wie ich will...
Danke für Eure Hilfe!!! |
|
| Nach oben |
|
 |
mark Power User
Anmeldungsdatum: 31.05.2004 Beiträge: 970
|
25.03.2009 22:38 |
|
|
Du bekommst ein Array zurück, das als einzigen Wert ein Objekt enthält. Auf die Werte kannst du z.B. mittels | Code: | | $unternehmen = $find_login[0]->unternehmen; | zugreifen. |
|
| Nach oben |
|
 |
Sensei User
Anmeldungsdatum: 10.03.2009 Beiträge: 17
|
27.03.2009 18:05 |
|
|
Super, jetzt funktioniert´s wie gewollt
Danke für eure Hilfe!!! |
|
| Nach oben |
|
 |
|
|
|
Zu Deinen Favoriten hinzufügen
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum nicht posten Du kannst Dateien in diesem Forum herunterladen
|
|