PEAR-Forum.de Übersicht Thema anzeigen - PEAR-Fehlermeldung bei Zugriff mittels PHP auf mySql-DB

PEAR-Fehlermeldung bei Zugriff mittels PHP auf mySql-DB


 

PEAR-Forum.de Übersicht » Database
Neues Thema eröffnen Neue Antwort erstellen Diesen Beitrag ausdrucken
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Sensei
User


Anmeldungsdatum: 10.03.2009
Beiträge: 17

Beitrag23.03.2009 15:57    PEAR-Fehlermeldung bei Zugriff mittels PHP auf mySql-DB Antworten mit Zitat

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$sqlnull$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
Benutzer-Profile anzeigen Private Nachricht senden
mark
Power User


Anmeldungsdatum: 31.05.2004
Beiträge: 970

Beitrag23.03.2009 23:00     Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen PEAR-User
MaGdev
Site Admin


Anmeldungsdatum: 04.02.2004
Beiträge: 715
Wohnort: Hamburg

Beitrag23.03.2009 23:19     Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Sensei
User


Anmeldungsdatum: 10.03.2009
Beiträge: 17

Beitrag25.03.2009 22:33     Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
mark
Power User


Anmeldungsdatum: 31.05.2004
Beiträge: 970

Beitrag25.03.2009 22:38     Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen PEAR-User
Sensei
User


Anmeldungsdatum: 10.03.2009
Beiträge: 17

Beitrag27.03.2009 18:05     Antworten mit Zitat

Super, jetzt funktioniert´s wie gewollt Wink

Danke für eure Hilfe!!!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Diese Seite übersetzen
PEAR-Forum.de Übersicht » Database
Neues Thema eröffnen Neue Antwort erstellen Diesen Beitrag ausdrucken
   Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

Zu Deinen Favoriten hinzufügen

 
Gehe zu:  
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