PDO -> prepare und bindParam funktioniert nicht

NetBull

Erfahrenes Mitglied
Hi,

habs länger nicht mehr gemacht und bekomm grad die Krise:

PHP:
$iId=1;
    $opt = array(
            PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8',
            PDO::ATTR_EMULATE_PREPARES, false           
    );
    $oDb = new PDO( $dsn, $usr, $pss, $opt );
    $sQuery = 'SELECT * FROM users WHERE id = :id';
    $oStatement = $oDb->prepare($sQuery);
    $oStatement->bindParam(':id', $iId);
    $oStatement->execute();
    var_dump($oStatement->queryString);

Am Ende hätte ich nun erwartet das statt :id nun der richtige Wert im Query steht. Oder habe ich irgenwas vergessen?

cu NetBu||
 
Falsch.
Es wird nicht einfach :id im String ersetzt und dann als SQL-String an die DB geschickt.

Grob gesagt, so wie ich das verstandenh abe: Es wird das SQL mit prepare() an die DB geschickt.
Nachher wird der Param übergeben und die DB handelt es dann auch so. Darum musst du mit PreparedDatemetns keine Angst vor Injections haben.

Wenn du das Pseudo-SQL ansehen willst, dann brauchst du Umwege.
zB. so http://wiki.yaslaw.info/dokuwiki/doku.php/php/libraries/ypdostmt
Aber auch dabei, gesendet wird nicht ein zusammengesetztes SQL.
 
Hab dann doch noch ein Problemchen:
Irgendwie scheint das mit den Parametern nicht so recht zu wollen und wenn ich error_info abrage bekomme ich ein array mit leeren elementen.

Zum Code:
PHP:
private function loadByMail($sMail, $sPass){
            $sPass = $this->spiceIt($sPass);
            $sQuery = '
                    SELECT
                        id, pre, name, mail, registered, blocked, admin, regdate as rawdate,
                        date_format(regdate, "%d.%m.%Y") as regdate,
                        date_format(regdate, "%h.%i.%s") as regtime
                    FROM
                        user
                    WHERE
                        mail = ":mail" and pass = ":pass"';
            $aParams = array(
                    array('key'=>':mail', 'value'=>$sMail, 'type'=>PDO::PARAM_STR),
                    array('key'=>':pass', 'value'=>$sPass, 'type'=>PDO::PARAM_STR)
            );
            $oResult = $this->getDataResult($sQuery, $aParams);
            $this->setAllMembers($oResult);           
        }

PHP:
protected function getDataResult($sQuery, $aFields) {
            $this->connect();
            $oStmnt = $this->oDataBase->prepare($sQuery);
            $i=1;
            foreach($aFields as $aField){
                $this->addData('i' . ($i++), $aField['key'] . " -> " . $aField['value']. " -> " . $aField['type']);
                if( isset( $aField['type'] ) ){
                    $oStmnt->bindParam($aField['key'], $aField['value'], $aField['type']);
                } else {
                    $oStmnt->bindParam($aField['key'], $aField['value']);
                }
            }           
            $oStmnt->execute();
            $oResult = $oStmnt->fetchObject();
            $this->addData('result', print_r($oResult, true));
            return $oResult;
        }

Das Result ist leer. Ersetz ich im Query die Platzhalter aber mal durch die echten gesuchten Werte, dann funktioniert es. Beispiel:

Code:
WHERE
     mail = "'.$sMail.'" and pass = "'.$sPass.'"';

Hat hier noch jemand eine Idee? Irgendwas scheine ich zu übersehen....

@einfach nur crack
@Yaslaw
 
lol... ich ich hab gesucht und gesucht,... dabei waren nur die " zu viel. lol.... geil, ... Klappt...
 

Neue Beiträge

Zurück