php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger

PHP Einsteiger PHP Problemlösungen für Spracheinsteiger
Archive: 2004, 2004/2, 2005, 2005/2, 2006, 2007, 2008, 2009, 2010,

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 17.01.2012, 11:16  
Moderator
 
Registriert seit: 06.06.2008
Beiträge: 4.945
PHP-Kenntnisse:
Fortgeschritten
Wolla ist ein wunderbarer AnblickWolla ist ein wunderbarer AnblickWolla ist ein wunderbarer AnblickWolla ist ein wunderbarer AnblickWolla ist ein wunderbarer AnblickWolla ist ein wunderbarer AnblickWolla ist ein wunderbarer Anblick
Wolla eine Nachricht über ICQ schicken
Standard PDO: Wie ermittelt man den fertigen Querystring

PHP-Code:
    $sql "SELECT
                userid
            FROM
                user
            WHERE
               email = :email
            AND
                passwort = :passwort"
;
    
$stmt $db->prepare($sql);
    
$stmt->bindValue(':email',        $email,        PDO::PARAM_STR);
    
$stmt->bindValue(':passwort',    $pass_sha1,    PDO::PARAM_STR);
    
$result $stmt->execute(); 
So weit, so gut. Aber ab dieser Stelle schweigt die Doku, und mir fehlte die Phantasie, in Google die richtigen Fragen zu stellen. Wenn ich bei diesem Querystring $sql nämlich einen nicht fatalen Fehler beim Zusammenbau mache, wenn also in $email z.B. nicht das steht, was eigentlich drin stehen sollte, dann wird $stmt->rowCount() = 0 sein und ich müsste im Zuge der Debug-Maßnahmen irgendwie herausfinden, wie $sql denn beim Ausführen genau aussieht.
Frage also: Wie kann man ermitteln, wie der fertige Querystring aussieht?

In diesem einfachen Fall kann man sich die beiden Variablen ja anzeigen lassen und dann knobeln, aber bei komplizierteren Abfragen mit z.B. 10 Komponenten ist das doch sehr mühsam.
__________________
Warum denkt mein Hund eigentlich immer dann, wenn es an der Tür klingelt, es sei für ihn?
Wolla ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 17.01.2012, 11:27  
Erfahrener Benutzer
 
Benutzerbild von tr0y
 
Registriert seit: 26.07.2010
Beiträge: 4.874
PHP-Kenntnisse:
Fortgeschritten
tr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblick
tr0y eine Nachricht über MSN schicken
Standard

Zitat:
Zitat von Wolla Beitrag anzeigen
PHP-Code:
    $sql "SELECT
                userid
            FROM
                user
            WHERE
               email = :email
            AND
                passwort = :passwort"
;
    
$stmt $db->prepare($sql);
    
$stmt->bindValue(':email',        $email,        PDO::PARAM_STR);
    
$stmt->bindValue(':passwort',    $pass_sha1,    PDO::PARAM_STR);
    
$result $stmt->execute(); 
Frage also: Wie kann man ermitteln, wie der fertige Querystring aussieht?
Ich kann das nicht anders definieren als mit: So funktioniert das nicht.

Prepared Statements werden an die Datenbank beim executen gesendet und danach nurnoch die Werte die auf das Prepared-Statement angewendet werden sollen.

Die einzigste möglichkeit wie du dort "fertige Queries" rausbekommst, ist indem du vor PDO einen Decorator spannst und die Prepares abfängst mitloggst und auch die Statements abfängst und gegen die geloggten Prepares wirfst sodas am ende das prepared Statement as managed in Database with injected values-Produkt rauskommt, das du haben möchtest.
__________________
Lasse mir ohne Anwendung von Gewalt Dinge schenken, Amazon weiß darüber bald mehr.
tr0y ist offline   Mit Zitat antworten
Alt 17.01.2012, 11:56  
hts
Erfahrener Benutzer
 
Registriert seit: 07.09.2010
Beiträge: 722
PHP-Kenntnisse:
Fortgeschritten
hts befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von Wolla Beitrag anzeigen
und mir fehlte die Phantasie, in Google die richtigen Fragen zu stellen.
Code:
php pdo prepared query string
Die Antworten bei Stackoverflow sind immer ganz gut.

http://stackoverflow.com/questions/2.../210693#210693
http://stackoverflow.com/questions/3...ared-statement
http://stackoverflow.com/questions/2.../210693#210693
hts ist offline   Mit Zitat antworten
Alt 17.01.2012, 12:08  
Erfahrener Benutzer
 
Benutzerbild von tr0y
 
Registriert seit: 26.07.2010
Beiträge: 4.874
PHP-Kenntnisse:
Fortgeschritten
tr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblick
tr0y eine Nachricht über MSN schicken
Standard

Bis auf prepared query emulation läufts auf SQL-Query-Logs hinaus..

Was wäre denn wenn du dir einen Bypass baust, das du auf das preparierte Statement setzt:
PHP-Code:
class psDebugTracer {
    
    private
        
$preparedStatementObject,
        
$currentQueryData = array(),
        
$evaledQueries = array();
        
    public
        
$queryString;
    
    
    public function 
__construct PDOStatement &$stmt ) {
        
$this->queryString $stmt->queryString;
        
$this->preparedStatementObject = &$stmt;
    }
    
    public function 
routeValue$queryKey$valueOf$paramType ) {
        
$data = array(
            
'key' => $queryKey,
            
'value' => $valueOf,
            
'type' => $paramType
        
);
        
        
$this->currentQueryData[] = $data;
        
$this->preparedStatementObject->bindValue($queryKey$valueOf$paramType);
    }
    
    public function 
execute() {
        
$curq $this->queryString;
        
$replaceKeys = array();
        
$replaceValues = array();
        foreach ( 
$this->currentQueryData as $therm ) {
           
$replaceKeys[] = $therm['key'];
           switch(
$therm['type']) {
              case 
PDO::PARAM_INT$replaceValues[] = $therm['value']; break;
              case 
PDO::PARAM_STR$replaceValues[] = "'".$therm['value']."'"; break;
              case 
PDO::PARAM_NULL$replaceValues[] = 'NULL'; break;
              case 
PDO::PARAM_BOOL$replaceValues[] = (string)(bool)$therm['value']; break;
              case 
PDO::PARAM_LOB$replaceValues[] = '{LOB STREAM}'; break;
              default:
                 
$replaceValues[] = "{NOT GIVEN OR UNMANAGED}";
           }
           
        }
        
$this->evaledQueries[] = str_replace($replaceKeys$replaceValues$curq);
        
$this->preparedStatementObject->execute();
        
$this->currentQueryData = array();
    }
    
    public function 
getEvaledQueries() {
        return 
$this->evaledQueries;
    }
    

PHP-Code:
$q $db->prepare('SELECT * FROM a WHERE b = :b AND c = :c');

$debug = new psDebugTracer($q);
    
$debug->routeValue(':b'10PDO::PARAM_INT);
$debug->routeValue(':c'10PDO::PARAM_INT);

$debug->execute();

/* use $q after here for data fetch process */

var_dump($debug->getEvaledQueries()); 
P.S.: Der source hier ist erstmal nur theoretisch.
__________________
Lasse mir ohne Anwendung von Gewalt Dinge schenken, Amazon weiß darüber bald mehr.

Geändert von tr0y (17.01.2012 um 12:14 Uhr).
tr0y ist offline   Mit Zitat antworten
Alt 17.01.2012, 12:23  
Erfahrener Benutzer
 
Registriert seit: 26.11.2008
Beiträge: 264
dsentker befindet sich auf einem aufstrebenden Ast
Standard

http://de.php.net/manual/en/pdostate...cute.php#98804 ?
__________________
dsentker ist offline   Mit Zitat antworten
Alt 17.01.2012, 12:25  
Erfahrener Benutzer
 
Benutzerbild von jspit
 
Registriert seit: 19.08.2011
Beiträge: 701
PHP-Kenntnisse:
Anfänger
jspit wird schon bald berühmt werden
Standard

debugDumpParams liefert zumindest z.T. die notwendigen informationen was da gelaufen ist.
Edit: Leider nicht die aktuellen Parameter wie man annehmen könnte, somit fast nutzlos.
PHP-Code:
$stmt->execute(); 
$stmt->debugDumpParams(); 

Geändert von jspit (17.01.2012 um 13:08 Uhr).
jspit ist offline   Mit Zitat antworten
Alt 17.01.2012, 12:26  
Erfahrener Benutzer
 
Benutzerbild von tr0y
 
Registriert seit: 26.07.2010
Beiträge: 4.874
PHP-Kenntnisse:
Fortgeschritten
tr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblick
tr0y eine Nachricht über MSN schicken
Standard

Das "Ding" wirft LOBs weg und knetet NULL nicht zu "NULL" sondern zu "".
__________________
Lasse mir ohne Anwendung von Gewalt Dinge schenken, Amazon weiß darüber bald mehr.
tr0y ist offline   Mit Zitat antworten
Alt 17.01.2012, 13:15  
Moderator
 
Registriert seit: 06.06.2008
Beiträge: 4.945
PHP-Kenntnisse:
Fortgeschritten
Wolla ist ein wunderbarer AnblickWolla ist ein wunderbarer AnblickWolla ist ein wunderbarer AnblickWolla ist ein wunderbarer AnblickWolla ist ein wunderbarer AnblickWolla ist ein wunderbarer AnblickWolla ist ein wunderbarer Anblick
Wolla eine Nachricht über ICQ schicken
Standard

Danke erstmal, reichlich Lesestoff. Das es auf einen Workaround hinausläuft und man die Query zusammenemulieren muss dachte ich mir schon fast. Da kann ich mir natürlich auch wieder Gurken reinbauen.
Ich dachte da an eine ePDO-Klasse, die von PDO erbt und die dann diese Infos irgendwie zusammenbastelt, wollte aber erstmal sicher gehen, dass ich nichts originäres übersehen habe.
Bisher kam ich immer ohne aus, aber gestern hab ich ne Viertelstunde gerätselt, warum ich keine Zeile finde - da hatte ich in einem langen Where-Konstrukt
WHERE DATE_FORMAT(datum,'%d') = :tag
und an :tag hatte ich 5 statt 05 gebunden.
__________________
Warum denkt mein Hund eigentlich immer dann, wenn es an der Tür klingelt, es sei für ihn?
Wolla ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
[Erledigt] Warum PDO verwenden JeremyK PHP Einsteiger 25 24.11.2011 08:27
PDO mit Stored Procedures unsinnig ? dreamcatcher Datenbanken 4 18.03.2011 13:53
PDO : Fehler abfangen rejoice Datenbanken 21 06.01.2011 19:14
MySQL UTF-8 und PHP PDO webbies Datenbanken 3 01.12.2010 16:32
mit PDO Feldnamen, alle Feldeigenschaften auslesen litterauspirna PHP Tipps 2010 3 16.11.2010 17:20
[Erledigt] Ein PDO allen Klassen zur Verfügung stellen matthiasl Datenbanken 2 27.10.2010 20:01
[Erledigt] MySql Transaktionen und PDO Leichti PHP-Fortgeschrittene 9 02.10.2010 21:41
[Erledigt] PDO prepare Problem in einer Klasse da.eXecutoR PHP Tipps 2010 4 11.07.2010 18:07
Array im Querystring - wie auslesen? jonSchmidt PHP Tipps 2010 1 27.03.2010 20:15
[Erledigt] PDO: Allgmeine Fragen, Zeit messen christophM Datenbanken 2 19.05.2009 23:12
[Erledigt] pdo datenbankverbindung in jeder funktion? nuna PHP Tipps 2009 3 14.02.2009 19:54
Frage PDO und Sicherheit RickoDD Datenbanken 4 07.02.2009 09:33
Ist Include PDO mysql Library möglich? robert PHP Tipps 2009 1 09.01.2009 20:56
PDO oder PEAR::DB stefant42 PHP-Fortgeschrittene 2 29.08.2008 11:49
Ich bin auf der Suche nach einem fertigen Menü Upload Script Beitragsarchiv 7 22.08.2004 18:53

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
querystring herausfinden, pdo get query string, herausfinden query string, wie bekommt man querystring, querystring ermitteln, $querystring, php pdo query ausgeben, pdo debug last exec command, debug query php pdo, pdo string, $db->query wie bekomme ich das fertige statement, php query string auslesen, stackoverflow php pdo mysql query, prepared statements querystring, pdo querystring mit params ausgeben, php pdo mysql query debugging, pdo abfrage als string anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 18:55 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum