PHP PDO Hazırlanan deyim sorgu kaydı güncellemiyor

2 Cevap php

Ben bir güncelleştirme deyimi hazırlamak için PHP'nin PDO nesnesi kullanılarak ve kayıt güncelleme bir sorun yaşıyorum. Ben çiğ SQL sorgusu alınan ve işlevine geçirilen kendi değerleri ile yerini params ile phpMyAdmin içinde koştu. Hangi amaçlandığı gibi kaydı güncelleştirir. Ancak, güncellemek değil komut koştu. Sıfır hataları atar ve benim anlayış tüm iyi olduğunu söyleyerek PDO yoludur bir errorInfo (00000 arasında) cevap döndürür. Ben başarıyla ekler ve ben güncellemek için çalışıyorum da dahil olmak üzere, veritabanından kayıtları seçer çünkü PDO nesnesi çalıştığını biliyorum. Ben bu güncelleme fonksiyonu çirkin olduğunu anlamak, ben sadece PDO'yu öğreniyorum.

Açıkçası, bu PDO kullanarak, PHP5 kodlanmıştır.

Sınıf Fonksiyon:

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).'</pre>';
            foreach($what as $key => $val)
            {
                if('date_time' === $key) continue;
                $bind = $stmt->bindValue(":{$key}",$val);
                echo ($bind ? 'true' : 'false')." :{$key}=",$val,'<br/>';
            }
            foreach($where as $key => $val)
            {
                if('date_time' === $key) continue;
                $bind = $stmt->bindValue(":{$key}",$val);
                echo ($bind ? 'true' : 'false')." :{$key} ",$val,'<br/>';
            }
        }else{
            return false;
        }
        $this->dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $exec = $stmt->execute();
        echo 'exec: '.($exec === true ? 'true:' : 'false:').':'.$exec.'<br/>';

        echo '<pre>';
        $stmt->debugDumpParams();
        echo '</pre>';

        return $stmt->errorInfo();
    }

Oturumu güncelleme / oturum açma komut seslendi:

$where = array(
    'id' => $user['id'],
    );
$what = array(
    'twitter_key'    => $oauth_token,
    'twitter_secret' => $oauth_token_secret
    );

$update = $db->update('users', $where, $what);

Sınıf işlevi ve arayan yankılanırken ve print_r çıktısı:

// 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
)

2 Cevap

Ben PDO hakkında çok şey bilmiyorum, ama benim duygu parametreleri bağlamak yolu ile yanlış bir şey yoktur. Ancak, kesin olarak söylemek kolay yolu gerçek sorgu görmektir.

Göre docs , you should be able to see the generated query as it went to SQL in $stmt->queryString. Bu açıklamaya after Eğer çıkış vardır için parametreleri bağlayıcı olduğundan şu anda görmek mümkün değil $stmt.

Eğer parametreleri (hatta belki sorgunun yürütülmesinden sonra, ben bilmiyorum) bağlamak sonra print_r() yapın. Sen gerçek bir sorgu dizesi almak ve sorunun altına almak gerekir.

Çalışır ... durumda birisi burada yer alan düzeltildi sınıf işlevi, öğrenmek için kullanmak ya da ne kadar, bunu istiyorum.

public function update($tbl_name, $where = null, $what = null)
    {
        if(is_array($where) && is_array($what))
        {
            $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);
            foreach($what as $key => $val)
            {
                if('date_time' === $key) continue;
                $bind = $stmt->bindValue(":{$key}",$val);
            }
            foreach($where as $key => $val)
            {
                if('date_time' === $key) continue;
                if('id' === $key)
                {
                    $bind = $stmt->bindValue(":{$key}",$val, PDO::PARAM_INT);
                }else{
                    $bind = $stmt->bindValue(":{$key}",$val);
                }
            }
        }else{
            return false;
        }
        $stmt->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $exec = $stmt->execute();
        return $stmt->errorInfo();
    }