2013-05-22 3 views
0

테이블 결과의 양에 따라 다른 쿼리를 실행하려고합니다.PHP PDO MySQL 결과가 출력되지 않지만 나머지 페이지가로드됩니까?

다음과 같은 내용이 있지만 'echo'데이터가 아닌 끝에있는 텍스트 만 출력합니까?

아무도 내가 잘못한 것을 볼 수 있습니까? 다른 페이지에서 클래스

를 호출

<?php 

require 'dbconfig.php'; 

class User { 

    function checkUser($uid, $oauth_provider, $username, $email, $twitter_otoken, $twitter_otoken_secret) 
    { 

     $query = "SELECT * FROM `users` WHERE oauth_uid = '$uid' and oauth_provider = '$oauth_provider'"; 

     $result = $DBH->query($query); 

     if (!empty($result)) { 
       echo 'user'; 
     } else { 
       echo 'no user'; 
     } 

     $DBH = null; 

    } 

} 
?> 



Test page loads 

나는 아래

...else { 
     $twitter_otoken=$_SESSION['oauth_token']; 
     $twitter_otoken_secret=$_SESSION['oauth_token_secret']; 
     $email=''; 
     $uid = $user_info->id; 
     $username = $user_info->name; 
     $user = new User(); 
     $userdata = $user->checkUser($uid, 'twitter', $username,$email,$twitter_otoken,$twitter_otoken_secret); 
     if(!empty($userdata)){ 
      session_start(); 
      $_SESSION['id'] = $userdata['id']; 
$_SESSION['oauth_id'] = $uid; 
      $_SESSION['username'] = $userdata['username']; 
      $_SESSION['oauth_provider'] = $userdata['oauth_provider']; 
      header("Location: splash.php"); 
     } 
    } 
} else { 
    // Something's missing, go back to square 1 
    header('Location: login-twitter.php'); 
} 
?> 

구성

$host = 'localhost'; 
$dbname = 'dbname was here'; 
$user = 'access'; 
$pass = 'access'; 

try { 
    $DBH = new PDO("mysql:host=$host;dbname=$dbname", $user, $pass); 
    $DBH->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

    } catch(PDOException $e) { 
     echo $e->getMessage(); 
    } 

?> 
,369 내 클래스를 호출
+4

당신도 요구하고있다'checkUser' 기능을

할 수? 지금까지 디버그 한 게 뭐야? – Rikesh

+1

당신은 PDO의 아름다움을 사용하지 않습니다. 준비된 진술서! 이것은 시스템을 SQL Injection에 취약하게 만드는 또 다른 방법입니다 : –

+0

$ DBH는 어디에 생성합니까? 예를 들어 클래스에서 상속되거나 싱글 톤/레지스트리 패턴처럼 클래스 필드로 사용해야합니다. – Robert

답변

0

명령문이 비어 있지만(), PDO :: query()의 결과가 결과 데이터가 아닌 PDOStatement 오브젝트인지 확인합니다.

데이터를 얻으려면 PDOStatement의 설명서를 확인하십시오. fetchObject() 메소드를 사용할 수 있습니다.

또한 직접 쿼리 대신 Prepared Statements을 사용하는 PDO의 기능을 사용하는 것이 좋습니다. 이렇게하면 응용 프로그램을 훨씬 더 안전하게 만들 수 있습니다.

그러나 이것이 작동하지 않는 이유에 대해서는 설명하지 않습니다 (이 경우 작업 없음 = 에코 데이터 없음). 항상 PDOStatement이기 때문에 (또는 FALSE) 쿼리가 작동하지 않을 경우 if 문은 TRUE/FALSE로 평가되어야합니다. 나는 출력이 없다는 것을 나타내는 코드 조각이 아니라고 지적했다. 그러나 위에서 지적했듯이, 결함은있다.

+0

마지막 문장을 확인하십시오. –

+0

예. 답을 편집했으나 여전히 문제가 해결되지 않고 게시물에서 문제를 해결할 수 없다고 언급했습니다. – Robert

+0

참. 그러나 그의 코드에는 몇 가지 근본적인 문제가있다. 주석을 달기엔 너무 길다. –

1

무엇을한다고 설정

$host = 'localhost'; 
$dbname = 'dbname was here'; 
$user = 'access'; 
$pass = 'access'; 

$opt = array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION); 
$DBH = new PDO("mysql:host=$host;dbname=$dbname", $user, $pass, $opt); 

사용자

class User { 

    function checkUser($uid, $oauth_provider) 
    { 
     global $DBH; 

     $query = "SELECT * FROM `users` WHERE oauth_uid=? and oauth_provider=?"; 
     $stmt = $DBH->prepare($query); 
     $stmt->execute($uid, $oauth_provider); 
     return $stmt->fetch(); 
    } 
} 
+2

거기에'global' 키워드를 타이핑 할 때 나쁘다고 느껴진다. –

+0

나는 고양이에게 고양이를 부르는 것이 어떤 특별한 느낌을 주어야한다고 확신하지 못한다. –