У меня проблема с использованием PHP-объекта PDO для подготовки оператора обновления и обновления записи. Я взял необработанный SQL-запрос и запустил его в phpMyAdmin с параметрами, замененными их значениями, которые передаются в функцию. Который обновляет запись как задумано. Однако при запуске из скрипта он не обновляется. Он выбрасывает ноль ошибок и возвращает ответ errorInfo () от 00000, что, на мой взгляд, является способом PDO сказать, что все хорошо. Я знаю, что объект PDO работает, потому что он успешно вставляет и выбирает записи из базы данных, включая ту, которую я пытаюсь обновить. Я понимаю, что эта функция обновления ужасна, я только изучаю PDO.
Очевидно, это закодировано в PHP5 с использованием PDO.
Функция класса:
<code>public function update($tbl_name, $where = null, $what = null)
{
if(is_array($where))
{
$where_str = 'where ';
foreach($where as $key => $val)
{
$where_str .= "{$key} = ':{$key}' and ";
}
$where_str = substr($where_str,0,-5);
$what_str = 'set ';
foreach($what as $key => $val)
{
$what_str .= "`{$key}` = ':{$key}', ";
}
$what_str = substr($what_str,0,-2);
$query_str = "update {$tbl_name} {$what_str} {$where_str} LIMIT 1;";
$stmt = $this->dbh->prepare($query_str);
echo '<pre>'.print_r($stmt, true).'
';
foreach ($ what as $ key => $ val)
{
if ('date_time' === $ key) продолжить;
$ bind = $ stmt-> bindValue (": {$ key}", $ val);
echo ($ bind? 'true': 'false'). ": {$ key} =", $ val, '
';
}
foreach ($ where as $ key => $ val)
{
if ('date_time' === $ key) продолжить;
$ bind = $ stmt-> bindValue (": {$ key}", $ val);
echo ($ bind? 'true': 'false'). ": {$ key}", $ val, '
';
}
} Еще {
вернуть ложь;
}
$ this-> dbh-> setAttribute (PDO :: ATTR_ERRMODE, PDO :: ERRMODE_EXCEPTION);
$ exec = $ stmt-> execute ();
echo 'exec:'. ($ exec === true? 'true:': 'false:'). ':'. $ exec. '
';
echo '
';
$stmt->debugDumpParams();
echo '
';
return $ stmt-> errorInfo ();
}
Вызывается из сценария обновления сеанса / входа в систему:
$where = array(
'id' => $user['id'],
);
$what = array(
'twitter_key' => $oauth_token,
'twitter_secret' => $oauth_token_secret
);
$update = $db->update('users', $where, $what);
Вывод из echos и print_r в функции класса и вызывающей стороне:
// print_r($stmt = $this->dbh->prepare($query_str)) output:
PDOStatement Object
(
[queryString] => update users set `twitter_key` = ':twitter_key', `twitter_secret` = ':twitter_secret' where id = ':id' LIMIT 1;
)
// output from the bing params and execution returns
true :twitter_key=XXXXXXXXXXXXXXXXXXXXXXXXXXXX
true :twitter_secret=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
true :id 20
exec: true:1
// $stmt->debugDumpParams() output:
SQL: [111] update users set `twitter_key` = ':twitter_key', `twitter_secret` = ':twitter_secret' where id = ':id' LIMIT 1;
Params: 3
Key: Name: [12] :twitter_key
paramno=-1
name=[12] ":twitter_key"
is_param=1
param_type=2
Key: Name: [15] :twitter_secret
paramno=-1
name=[15] ":twitter_secret"
is_param=1
param_type=2
Key: Name: [3] :id
paramno=-1
name=[3] ":id"
is_param=1
param_type=2
// print_r($stmt->errorInfo()) output:
Array
(
[0] => 00000
)