2012-04-18 3 views
1

私は現在、1つのエリアで動作するデータベースコールを持っていますが、別のエリアでは動作しません。PHP PDOアクセスの問題

私のデータベースクラスは$ databaseとラベル付けされており、$dbデータベースコンストラクタに渡されたPDOオブジェクトを持っています。

これはすべて問題なく動作します。

このコードの呼び出しは、この機能は、これは予想通りのユーザー情報を返します

public function get_user($user){ 
     $user = $this->db->quote($user); 
     $query = "SELECT * FROM login where username = $user"; 
     $user = $this->db->query($query); 
     $user_info = $user->fetch(); 
     return $user_info;} 

と呼ばれる

$user_info = $database->get_user($user); 

作品

別の呼び出しが

 $user = $database->confirm($confirm); 
     $user_info = $database->get_user($user); 

Cでありますonfirm関数は次のようになります

 public function confirm($confirm){ 
     $confirm = $this->db->quote($confirm); 
     $query = "SELECT * FROM temp_data WHERE hash = $confirm;"; 
     $count = $this->db->query($query); 
     $info = $count->fetch(); 

     $user = $info['username']; 
     $user = $this->db->quote($user); 
     $query = "DELETE FROM temp_data WHERE username = $user;"; 
     $this->db->exec($query); 
     $query = "UPDATE login SET confirm = '1' WHERE username = $user;"; 
     $this->db->exec($query); 
     return $info['username'];} 

この呼び出しは完全に機能します。

それは、get_user私はトラブルシューティングを行い、問題がget_userに次の行がどのPDOオブジェクトを返すされていないされていることを発見した

失敗しかしget_user

を受け入れ、引用符で囲まれていない形式でユーザー名を返します。またはすべてのデータ

$user = $this->db->query($query); 

これは興味深い部分です。私はtry catchを行い、PDOはPDO例外を投げていないし、一般的な例外をスローしていない。エラーログにはエラーはありません。それはちょうど働いていないようです。私はPrint_rget_classechoを使用してステップバイステップを経て、die;を出力して結果を出力し、2回目のデータベースコールを実行するまで動作します。フェッチはエラーを返していますが、execが実行されていないことが原因です。

unset()を使用してみましたが、作成された主なDB接続ここで

は、スクリプトが

  1. にランダムなハッシュ
  2. とのリンクをユーザーがクリックすると実行されたときに、システムがGETからハッシュを取得し、あまりにも引くことを使用して何が起こっているかで作成されますtempデータベースのユーザー名。
  3. 次に、ユーザーを確認して変更し、一時的なエントリを削除してから、ユーザー名
  4. を返し、次にget_userを呼び出します。この場合、twilioサブアカウントを設定するためのユーザー情報が返されます。これは、システムが失敗しているところです
  5. その後、何が起こったのですか(そして、私はここでエラーが発生するので、これは私のテストからやろうとします)、twilio APIにアクセスし、AUTHとSIDトークンを取得し、それはユーザーに、新しいユーザーがサインインページへ

をリダイレクトされ、私は近くにカーソルを使用してみましたが、それは働いていない

  • を提出。

    誰かが私に持っている問題についての洞察を私に与えることができ、あるいは私が間違っていることを感謝します。私はPDOオブジェクトを使うのが初めてであるので、私はどこかでばかげたミスを犯したと確信しています。

  • +0

    私はあなたの問題の答えを得ていません。しかし、あなたは 'bindParam()'メソッドを使用してSQLにエスケープして値をバインドしていませんか? – stUrb

    +0

    '$ info'には何が入っていますか?多分この配列は空です。結果として 'username 'が' '' '' ' – stUrb

    +0

    であることが確認された2番目のクエリでは、get_userで問題が解決され、$ infoは正しい情報を返します – StevenDStanton

    答えて

    1

    私は、PHPFreaks IRCチャンネルの素晴らしい人から答えを得ることができました。

    public function get_user($user){ 
         $stmt = $this->db->prepare('SELECT * FROM login where username = :u'); 
         $stmt->bindValue(':u', $user); 
         $stmt->execute(); 
    
         $user_info = $stmt->fetch(); 
         $stmt->closeCursor(); 
    
         return $user_info; 
    } 
    
    
    public function confirm($confirm){ 
         $stmt = $this->db->prepare('SELECT * FROM temp_data WHERE hash = :h'); 
         $stmt->bindValue(':h', $confirm); 
         $stmt->execute(); 
         $info = $stmt->fetch(); 
         $stmt->closeCursor(); 
    
         $stmt = $this->db->prepare('DELETE FROM temp_data WHERE username = :u'); 
         $stmt->bindValue(':u', $info['username']); 
         $stmt->execute(); 
    
         $stmt = $this->db->prepare('UPDATE login SET confirm = '1' WHERE username = :u'); 
         $stmt->bindValue(':u', $info['username']); 
         $stmt->execute(); 
    
         return $info['username']; 
    }