[PDO] bindParam fout
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:
op de volgende code:
hoe komt dat?
ps. regel 73 is: $query->bindParam(':table', $p_sTable, PDO_PARAM_STR, 64);
Met vriendelijke groet,
DirkJan Heinen
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)
1
2
3
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
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)
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
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;
}
}
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
Gesponsorde koppelingen:
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.
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.
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.
ik heb nu een paar dingentjes veranderd alleen hij doet het nog niet :S ik snap er niets van geen foutmelding niks
code
en dit echo't hij nu:
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.
code
Code (php)
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
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;
}
}
?>
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:
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
Code (php)
1
2
3
4
5
6
7
8
9
10
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'.
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'.
Heb zojuist een script geplaatst, waarbij je deze insert alsvolgt doet.
De functie in de class:
Misschien heb je er iets aan.
Succes,
Roland
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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);
?>
// 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)
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
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);
}
}
?>
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
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
PDO: Learn how the PDO SQL parser causes bug reports — Internet Super Hero



