Tak na wstępie, nie wiem czy dobry dział, ale innego wybrać nie mogłem, bo hasła do konta zapomniałem, a mail resetujący hasło już jakiś czas nie przychodzi.
Mam problem z funkcją w klasie wspomagającej PDO, a dokładniej niby działa, ale wykonując takie zapytanie
$sql = $db->mexecute('INSERT INTO dupy (id,pid,sid) VALUES (:id,:pid,:sid)',
na 3 wysłane parametry zapisują się tylko 2 pierwsze, a w miejsce 3 zapisuje się 0 (zero). Każda kolumna w bazie jest intem, a funkcja "mexecute" wygląda tak
public function mexecute($query, $binds = null, $val = null) {
try {
if($binds !== null && $val !== null) {
$sql = $this->dba->prepare($query);
foreach($binds as $n => &$bind)
$sql->bindParam(is_int($n) ?
$n+1
: $n, $bind[0
], $bind[1
]);
foreach($val as &$val2) {
$i=0;
foreach($binds as &$bind) {
$bind[0] = $val2[$i++];
}
$sql->execute();
}
return $sql;
}
else {
foreach($binds as $n => &$bind) {
$sql->bindParam(is_int($n) ?
$n+1
: $n, $bind); echo $n.' '.$bind.'<br />'; // oczysiście każde użycie echo czy var_dump jest tylko dla sprawdzenia, czy wartości się przypisują poprawnie }
foreach($val as &$val2) {
$i=0;
foreach($binds as &$bind) {
$bind = $val2[$i++];
echo $i.': '.$bind.'|'.$val2[$i-1].' # '; }
$sql->execute();
$sql->debugDumpParams();
}
return $sql;
}
}
else {
$sql->bindParam(1, $binds);
foreach($val as $binds)
$sql->execute();
return $sql;
}
}
else {
echo '[mexecute] Parametr #3 nie jest tablicą, użyj \'execute\' do wykonania pojedynczego zapytania!'; }
}
else {
echo '[mexecute] Parametr #2 lub #3 jest pusty!'; }
}
catch(PDOException $e) {
echo '[mexecute] Błąd zapytania: '.$e->getMessage(); }
return null;
}
a na stronie wyświetla mi się coś takiego
:id 1
:pid 1
:sid 1
array(3) { [":id"]=> &string
(1) "1" [":pid"]=> &string
(1) "1" [":sid"]=> &string
(1) "1" } 1: 92|92 # 2: 666|666 # 3: 6|6 #
array(3) { [":id"]=> &int
(92) [":pid"]=> &int
(666) [":sid"]=> &int
(6
) } SQL
: [52
] INSERT INTO dupy
(id
,pid
,sid
) VALUES
(:id
,:pid
,:sid
) Params
: 3
Key: Name
: [3] :id paramno
=0 name
=[3] ":id" is_param
=1 param_type
=2
Key: Name
: [4] :pid paramno
=1 name
=[4] ":pid" is_param
=1 param_type
=2
Key: Name
: [4] :sid paramno
=2 name
=[4] ":sid" is_param
=1 param_type
=2
1: 93|93 # 2: 666|666 # 3: 4|4 #
array(3) { [":id"]=> &int
(93) [":pid"]=> &int
(666) [":sid"]=> &int
(4
) } SQL
: [52
] INSERT INTO dupy
(id
,pid
,sid
) VALUES
(:id
,:pid
,:sid
) Params
: 3
Key: Name
: [3] :id paramno
=0 name
=[3] ":id" is_param
=1 param_type
=2
Key: Name
: [4] :pid paramno
=1 name
=[4] ":pid" is_param
=1 param_type
=2
Key: Name
: [4] :sid paramno
=2 name
=[4] ":sid" is_param
=1 param_type
=2
czyli tutaj jest chyba wszystko ok. Dodam jeszcze tylko tyle, że gdy wykorzystam tę funkcję
public function execute($query, $binds = null, $type = 0) {
try {
if($binds !== null) {
$sql = $this->dba->prepare($query);
foreach($binds as $n => $bind)
$sql->bindValue(is_int($n) ?
$n+1
: $n, $bind[0
], $bind[1
]); }
else {
if($type) {
$sql->execute($binds);
return $sql;
}
else {
foreach($binds as $n => $bind)
$sql->bindValue(is_int($n) ?
$n+1
: $n, $bind); }
}
}
else {
$sql->bindValue(1, $binds);
}
$sql->execute();
return $sql;
}
else {
echo '[execute] Parametr #2 jest pusty!'; }
}
catch(PDOException $e) {
echo '[execute] Błąd zapytania: '.$e->getMessage(); }
return null;
}
z takim wywołaniem
$sql = $db->execute('INSERT INTO dupy (id,pid,sid) VALUES (:id,:pid,:sid)',
array(':id' => 9, ':pid' => 666, ':sid' => 5454
));
to oczywiście w bazie zapisują się wszystkie 3 wartości w 3 kolumnach. Ktoś może wie czemu te podwójne zapisanie wartości nie działa tak jak trzeba? Coś robię źle?