php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > PHP Developer Forum
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Fragen zu Laravel, YII oder anderen PHP-Frameworks.

Antwort
 
LinkBack (1) Themen-Optionen Bewertung: Bewertung: 6 Stimmen, 5,00 durchschnittlich.
  1 links from elsewhere to this Post. Click to view. #1 (permalink)  
Alt 22-05-2008, 14:33
frabron
 Newbie
Links : Onlinestatus : frabron ist offline
Registriert seit: Apr 2004
Beiträge: 113
frabron ist zur Zeit noch ein unbeschriebenes Blatt
Standard PDO bindParam datatype Konstanten

Hallo Forum,

ich habe eine Frage zu PDO Statements, im speziellen zur bindParam Methode. Laut Handbuch kann man ja dem bindParam Aufruf einen (optionalen) Datentyp als Parameter mitgeben.

Parameter sind ja als Konstanten definiert, wie z.B. PDO::PARAM_INT oder PDO::PARAM_STR. Mir fehlen da aber in der Auflistung bei http://www.php.net/manual/en/pdo.constants.php ein paar essentielle Parameter, wie zum Beispiel der real oder numeric Datentypen, oder sowas wie date und time Datentypen.

Meine Annahme, dass die Dokumentation lückenhaft ist, hat sich leider nicht bestätigt, denn z.B. einen Datentyp PDO::PARAM_NUMERIC/REAL/DATE/WTF scheint es nach meinen Tests wirklich nicht zu geben.

Weiss da jemand mehr darüber? In mir wächst der Verdacht, dass ich den Absatz über die Reife von PDO in PHP überlesen habe, oder einen anderen essentiellen Abschnitt.

Hintergrund über die Verwendung von preparted Statements war eigentlich zum einen die Übersichtlichkeit des Codes und der einfacheren Verhinderung von Injections. Durch die Bindung von Variablen zu Spalten in der Datenbank und zu bestimmten Datentypen wollte ich das eigentlich geschickt lösen, aber wie ich bereits sagte, irgendwie scheine ich den Absatz verpasst zu haben, der die fehlenden Datentypen erklärt.

Vielleicht ist PDO aber auch einfach noch nicht so weit, als dass es wirklich produktiv eingesetzt werden kann. Die meisten Tutorials und Texte datieren zwischen 06 und 07 und kauen auch nur die Texte aus dem Handbuch wieder.

Für jegliche Hinweise (PDO Tauglichkeit, fehlende Datentypen) bin ich dankbar, die Licht in die Sache bringen.

Gruss Frank
Mit Zitat antworten
  #2 (permalink)  
Alt 22-05-2008, 15:29
tontechniker
 PHP Senior
Links : Onlinestatus : tontechniker ist offline
Registriert seit: Jul 2005
Beiträge: 1.972
tontechniker ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Der optional anzugebene Datentyp bezieht sich nicht auf den Datentyp der Tabellenfelder sondern auf die Interpretation des PHP internen Typs - so auch die Manual:PDO ist also keinenfalls unausgereift, unfertig oder ungeeignet für den produktiv Einsatz. Vielmehr bietet es eine Möglichkeit auf das interne Handling einzuwirken - ein Beispiel:
PHP-Code:
$foo 'null';
$bar null;

$statement -> bindParam  ':foo'$fooPDO::PARAM_NULL );
$statement -> bindParam ':bar'$bar ); 
Beide Zeilen tun genau das selbe, sie setzten ein Feld auf NULL, soweit die Felder NULL sein dürfen. Eine explizite Angabe ist deshalb weder nötig noch gewünscht, denn einerseits möchtest du nicht Feldtypen wie DATE in PHP umsetzen, zum anderen ist es meist viel einfacher zum Beispiel execute zu benutzen um alle Paramter zu übergeben.
__________________
Die Regeln | rtfm | register_globals | strings | SQL-Injections | []
Mit Zitat antworten
  #3 (permalink)  
Alt 22-05-2008, 16:41
frabron
 Newbie
Links : Onlinestatus : frabron ist offline
Registriert seit: Apr 2004
Beiträge: 113
frabron ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Original geschrieben von tontechniker
Der optional anzugebene Datentyp bezieht sich nicht auf den Datentyp der Tabellenfelder sondern auf die Interpretation des PHP internen Typs ...
D.h. der angebene Datentyp dient lediglich zur Interpretationshilfe der PDO Klasse von diesen Datentypen, nämlich denen von PHP, und nicht meiner Datenbank, richtig? Und dass solche Datentypen wie floats fehlen, liegt an der Eindeutigkeit des Datentyps? Oder wie kann ich das verstehen?
Analog zu deinem Beispiel, wie würde denn das Handling aussehen, wenn

PHP-Code:
$foo '1.78';
$bar 1.78
wäre. Bei dem Beispiel <<null>> ist es ja relativ einfach nachzuvollziehen, dass einmal der Zustand null bei einem Textfeld angewandt wird, d.h. das Feld wird geleert, und einmal 'null' als String in ein Textfeld eingefügt wird. Bei PDO::PARAM_INT ist mir das schon weit weniger klar, denn dann müsste es meinem Verständnis nach ja auch für weitere Datentypen diese Konstanten geben. Weiterhin steht im Handbuch

Zitat:
PDO::PARAM_NULL (integer)
Represents the SQL NULL data type.
PDO::PARAM_INT (integer)
Represents the SQL INTEGER data type.
PDO::PARAM_STR (integer)
Represents the SQL CHAR, VARCHAR, or other string data type.
dem ich entnehme, dass die Datentypen dort die SQL Datentypen repräsentieren. Deshalb meine ursprüngliche Annahme, dass es da mehr geben müsste. Wie der geneigte Leser bemerkt, ist mir diese Sache so klar wie Rheinwasser nach einem Hochwasserereignis ...

Um aber auf den Ursprung meiner Recherchen bezüglich PDO::PARAM_* zurückzukommen - inwieweit ist denn die Behandlung von Daten bei PDO notwendig, um SQL-Injections vorzubeugen?
Ich weiss z.B. von der pg_convert Funktion bei den Postgresql Funktionen, dass da eine automatische Typumwandlung auf den entsprechenden Datentyp geschieht. pg_convert greift da auf die Tabellendefinition in der Datenbank zurück und gibt bei nicht möglicher Konvertierung einen Fehler aus. Passiert da ähnliches im Hintergrund bei der PDO Geschichte?

Zitat:
PDO ist also keinenfalls unausgereift, unfertig oder ungeeignet für den produktiv Einsatz.
Das ist doch mal ne Hausmarke. Da komme ich doch glatt auf dich zurück
Mit Zitat antworten
  #4 (permalink)  
Alt 22-05-2008, 20:07
tontechniker
 PHP Senior
Links : Onlinestatus : tontechniker ist offline
Registriert seit: Jul 2005
Beiträge: 1.972
tontechniker ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Und dass solche Datentypen wie floats fehlen, liegt an der Eindeutigkeit des Datentyps? Oder wie kann ich das verstehen?
Also grundsätzlich hat SQL bei Querys ja sowieso nur zwei Typen Werte ohne und Werte mit Anführungszeichen, dass heißt eine SQL Engine kümmert sich intern um den richtigen Typen und die Entsprechung für den Feldtyp (MySQL setzt zum Beispiel '' wenn man versucht 'Blubb' in ein Feld des Typs Integer zu schreiben). Genau das gleiche gilt natürlich auch für Querys, die, als Pepared Statement oder normale Query, über PDO abgesetzt werden. Dass heißt PDO sendet da auch bei angegeben Typen nicht mehr an den SQL Server. Der angegeben Parameter geht direkt an den Zend Parser wo er zur Typenumwandlung dient - ein Ausschnitt aus pdo_stmt.c und zend_API.c:
PHP-Code:
static int register_bound_param(INTERNAL_FUNCTION_PARAMETERSpdo_stmt_t *stmtint is_param/* {{{ */
{
...
    if (
FAILURE == zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIETZEND_NUM_ARGS() TSRMLS_CC,
            
"lz|llz!", &param.paramno, &param.parameter, [b]&param.param_type[/b], &param.max_value_len,
            &
param.driver_params)
...
}

// Funktion die innerhalb von zend_parse_parameters_ex die Parameter umwandelt
static char *zend_parse_arg_impl(int arg_numzval **argva_list *vachar **spec TSRMLS_DC)
{
...
    switch (
c) {
    case 
's'// Zieltypp
        
{
...
            switch (
Z_TYPE_PP(arg)) { // Ausgangstyp
                
case IS_NULL:
                    if (
return_null) {
                        *
NULL;
                        *
pl 0;
                        break;
                    }
                case 
IS_STRING:
                case 
IS_LONG:
                case 
IS_DOUBLE:
                case 
IS_BOOL:
                    
convert_to_string_ex(arg);
                    *
Z_STRVAL_PP(arg);
                    *
pl Z_STRLEN_PP(arg);
                    break;
...
            }
        }
        break;
...

Mit der Datenbank hat der angegebene Typ also nichts zutun - nur mit der Art der internen Behandlung. Es sind nicht alle Typen implementiert weil es bei einigen Typen keinen Unterschied macht was tatsächlich angegeben wird. Eine Typen angabe ist also im Prinzip nur beim Large Object Type interessant.
Zitat:
Um aber auf den Ursprung meiner Recherchen bezüglich PDO::PARAM_* zurückzukommen - inwieweit ist denn die Behandlung von Daten bei PDO notwendig, um SQL-Injections vorzubeugen?
Welche Art von SQL Injections sollte es dort geben? Wenn du mit Prepared Statements arbeitest hast du gar keine Probleme mit SQL Injections, da die Paramter ja erst nachträglich vom Server eingesetzt werden. Die Manual dazu:
__________________
Die Regeln | rtfm | register_globals | strings | SQL-Injections | []

Geändert von tontechniker (22-05-2008 um 20:15 Uhr)
Mit Zitat antworten
  #5 (permalink)  
Alt 23-05-2008, 09:17
frabron
 Newbie
Links : Onlinestatus : frabron ist offline
Registriert seit: Apr 2004
Beiträge: 113
frabron ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Erst einmal vielen Dank für deine wirklich ausführlichen Antworten - ich denke, das Thema ist für mich jetzt klarer geworden.

Code:
...
case IS_STRING:
case IS_LONG:
case IS_DOUBLE:
case IS_BOOL:
    convert_to_string_ex(arg);
...
Die o.g. Typen werden also zu String konvertiert und die Datenbank entscheidet dann, was damit zu tun ist.
Der Ausgangstyp wird mittels Z_TYPE_PP(arg) übergeben. Wobei Z_TYPE_PP ein Zend interner Pointer ist (Z_TYPE_PP -- Get type field from zval pointer pointer). Aber das wird mir zu dann zu Programmiersprachen-intern
Dennoch verstehe ich das Konzept dahinter - denke ich


Zitat:
... Welche Art von SQL Injections sollte es dort geben? Wenn du mit Prepared Statements arbeitest hast du gar keine Probleme mit SQL Injections ...
Vielen Dank, aber ich frage da lieber noch einmal mehr nach als nachher im Regen zu stehen. Auch wenn ich mich jetzt dunkel daran zu erinnern meine, den von dir zitierten Absatz zu Prepared Statements im Handbuch gelesen zu haben.

Vielen Dank noch einmal für deine Mühe
Mit Zitat antworten
Antwort

Lesezeichen


LinkBacks (?)
LinkBack to this Thread: https://www.php-resource.de/forum/php-developer-forum/92096-pdo-bindparam-datatype-konstanten.html
Erstellt von For Type Datum
Levi's Men's 501 Jean This thread Refback 27-06-2012 15:38

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre 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


PHP News

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni

Wissensbestand in Unternehmen
Wissensbestand in UnternehmenLebenslanges Lernen und Weiterbilden sichert Wissensbestand in Unternehmen

25.05.2018 | Berni


 

Aktuelle PHP Scripte

ebiz-trader 6.0 - Das professionelle PHP Marktplatz Script ansehen ebiz-trader 6.0 - Das professionelle PHP Marktplatz Script

Mit unserer Lösungen können Sie nahezu jeden B2B / B2C Marktplatz betreiben den Sie sich vorstellen können. Ganz egal ob Sie einen Automarktplatz, Immobilenportal oder einfach einen Anzeigenmarkt betreiben möchten. Mit ebiz-trader können Sie Ihre Anforder

11.10.2018 Berni | Kategorie: PHP/ Anzeigenmarkt
PHP Server Monitor

PHP Server Monitor ist ein Skript, das prüft, ob Ihre Websites und Server betriebsbereit sind.

11.09.2018 Berni | Kategorie: PHP/ Security
PHP WEB STATISTIK ansehen PHP WEB STATISTIK

Die PHP Web Statistik bietet Ihnen ein einfach zu konfigurierendes Script zur Aufzeichnung und grafischen und textuellen Auswertung der Besuchern Ihrer Webseite. Folgende zeitlichen Module sind verfügbar: Jahr, Monat, Tag, Wochentag, Stunde Folgende son

28.08.2018 phpwebstat | Kategorie: PHP/ Counter
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 11:20 Uhr.