Versio

[PDO] bindParam fout

Overzicht Reageren

DirkJan Heinen

DirkJan Heinen

01/07/2008 13:07:00
Quote Anchor link
Hallo phpers
ik heb een fout met mijn PDO en ik ben al een tijdje bezig te zoeken maar kan de oplossing niet vinden.

ik krijg deze fout:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
Warning: PDOStatement::bindParam() expects parameter 3 to be long, string given in C:\xampp\htdocs\MyJudain\classes\register.class.php on line 73

Warning: PDOStatement::execute() [function.PDOStatement-execute]: SQLSTATE[HY093]: Invalid parameter number: no parameters were bound in C:\xampp\htdocs\MyJudain\classes\register.class.php on line 74


op de volgende code:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
function safeNewMember($p_sTable,$p_aColums,$p_aData){
        try {
             //Build SQL string
            $SQL = "insert into :table (";
            foreach ($p_aColums as $value){
                $SQL .= $value . ",";
            }
            $SQL = substr($SQL, 0, -1);
            $SQL .= ") values (";
            foreach ($p_aData as $value){
                $SQL .= $value . ",";
            }
            $SQL = substr($SQL, 0, -1);
            $SQL .= ")";
            //execute query
            $query = $this->m_oPDO->prepare($SQL);
            $query->bindParam(':table', $p_sTable, PDO_PARAM_STR, 64);
            $query->execute();
            return true;
        }catch (PDOException $e) {
            unset($query);
            $this->m_aError =  'Connection failed: ' . $e->getMessage();
            return false;
        }
    }


hoe komt dat?

ps. regel 73 is: $query->bindParam(':table', $p_sTable, PDO_PARAM_STR, 64);


Met vriendelijke groet,
DirkJan Heinen
 
PHP hulp

PHP hulp

25/05/2012 09:47:24
Gesponsorde koppelingen:
 
Frank -

Frank -

01/07/2008 13:13:00
Quote Anchor link
Dit gaat niet lukken. Jouw tabelnaam zal een string zijn, PDO zal deze naam dan ook keurig tussen quotes zetten. Dat wil je alleen niet, het betreft namelijk geen waarde, maar een tabelnaam.

Daarnaast is het vreemd, er is niks dynamisch aan een datamodel, je hoeft dus nooit een variabele tabelnaam op te geven. Je weet vooraf namelijk precies welke tabelnaam je nodig hebt. Ook weet je dat dit een veilige waarde is, of je kiest wel hele brakke namen, er valt dus niks te beveiligen.
 
Bo az

Bo az

01/07/2008 13:48:00
Quote Anchor link
pgFrank:
Daarnaast is het vreemd, er is niks dynamisch aan een datamodel, je hoeft dus nooit een variabele tabelnaam op te geven. Je weet vooraf namelijk precies welke tabelnaam je nodig hebt. Ook weet je dat dit een veilige waarde is, of je kiest wel hele brakke namen, er valt dus niks te beveiligen.


Niet helemaal waar, als je bijvoorbeeld kijkt naar Zend_Db_Table is je tabelnaam ook variabel. Het data model hoeft dus niet variabel te zijn wil je toch variabele tabel namen hebben.

Wel is het zo dat het onmogelijk is om een tabelnaam als een parameter te binden in een prepared statement. Is ook logisch er is niks te preparen zonder tabelnaam.
 
DirkJan Heinen

DirkJan Heinen

02/07/2008 10:11:00
Quote Anchor link
ik heb nu een paar dingentjes veranderd alleen hij doet het nog niet :S ik snap er niets van geen foutmelding niks
code
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<?php
function safeNewMember($p_sTable,$p_aColums,$p_aData){
        try {
             //Build SQL string
            $SQL = "INSERT INTO ".$p_sTable." (";
            foreach ($p_aColums as $value){
                $value = $this->m_oPDO->quote($value);
                $SQL .= $value . ",";
            }

            $SQL = substr($SQL, 0, -1);
            $SQL .= ") VALUES (";
            foreach ($p_aData as $value){
                $value = $this->m_oPDO->quote($value);
                $SQL .= $value . ",";
            }

            $SQL = substr($SQL, 0, -1);
            $SQL .= ")";
            //execute query
            $query = $this->m_oPDO->exec($SQL);
            $insert_id = $this->m_oPDO->lastInsertId();
            echo $insert_id ."<br>". $SQL;
            return true;
        }
catch (PDOException $e) {
            unset($query);
            $this->m_aError =  'Connection failed: ' . $e->getMessage();
            return false;
        }
    }

?>


en dit echo't hij nu:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1

INSERT INTO users ('user','pass','email','firstName','LastName','gender','country') VALUES ('dsfs','0MAgR6','dirkjanheinen@gmail.com','','','Male','')


echt raar.. ik kan ook geen fout ontdekken in de sql code die hij heeft opgebouwd.
Gewijzigd op 01/01/1970 01:00:00 door DirkJan Heinen
 
Bo az

Bo az

02/07/2008 11:56:00
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
<?php
foreach ($p_aColums as $value){
                $value = $this->m_oPDO->quote($value);
                $SQL .= $value . ",";
            }
[
/code]

Je gaat alle kolommen ook quoten? Zoals je nu ook in je query kan zien staan er nergens kolom namen in je query, alleen maar strings...
Je hoeft je zelf niet te beschermen tegen je eigen gekozen kolom namen...
En ook hiervoor geld, dit moet al meteen in de query anders valt ook hier niks te 'preparen'.
 
Roland van Wanrooy

Roland van Wanrooy

03/07/2008 05:19:00
Quote Anchor link
Heb zojuist een script geplaatst, waarbij je deze insert alsvolgt doet.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
// hier de class includen

$db = new dbPDO;        

$aFieldList = array(
    'user' => 'dsfs',
    'pass' => '0MAgR6',
    'email' => 'dirkjanheinen@gmail.com',
    'firstName' => 'DirkJan',
    'LastName' => 'Heijnen',
    'gender' => 'Male',
    'country' => 'NL'
);

$iInsertID = $db->dbInsert('users', $aFieldList);

?>



De functie in de class:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<?php
public function dbInsert($sTable, $aFieldList) {
    try {
        if (!($sTable and is_string($sTable))) {
            $sMsg = sprintf('Geen tabelnaam in %s. (param=%s:"%s")'
                ,__METHOD__
                ,gettype($sTable)
                ,
$sTable);
            throw new PDOException($sMsg);
        }

        elseif (!($aFieldList and is_array($aFieldList))) {
            $sMsg = sprintf('Geen fieldlist in %s. (param=%s:"%s")'
                ,__METHOD__
                ,gettype($aFieldList)
                ,
$aFieldList);
            throw new PDOException($sMsg);
        }

        
        // alle parameters in orde
        $this->sql = sprintf('insert into %s (%s) values (%s)'
            ,$sTable
            ,implode(',', array_keys($aFieldList))
            ,
':'.implode(',:', array_keys($aFieldList)));
        
        $stmt = $this->pdo->prepare($this->sql);
        $stmt->execute($aFieldList);
        $this->insertID    = $this->pdo->lastInsertId();
        return $this->insertID;
    }

    catch(PDOException $e) {
        $this->_dbError($e);
    }
}

?>


Misschien heb je er iets aan.
Succes,
Roland
 
Jelmer rrrr

Jelmer rrrr

04/07/2008 12:59:00
Quote Anchor link
Niet helemaal relevant achteraf, maar voor de mensen die ook problemen hebben met de prepared statements van PDO:

PDO: Learn how the PDO SQL parser causes bug reports — Internet Super Hero
 



Overzicht Reageren

Get Adobe Flash player