2013-05-21 2 views
1

로그인 스크립트가 약간 있습니다.SQLSTATE [HY000] : PHP 및 PDO의 일반 오류

function login($sql) { 
try {     
    $fbhost = "localhost"; 
    $fbname = "foodbank"; 
    $fbusername = "root"; 
    $fbpassword = ""; 
    $DBH = new PDO("mysql:host=$fbhost;dbname=$fbname",$fbusername,$fbpassword); 
    $DBH->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

    $STH = $DBH->query($sql);  
    $STH->setFetchMode(PDO::FETCH_ASSOC); 

    session_start();   
    if ($row = $STH->fetch()) { 
     $_SESSION['username'] = "$row[username]"; 
     header("Location:index.php"); 
    } 
} catch(PDOException $e) { 
    echo $e->getMessage(); 
} 
} 

편집 :

index.php에 쿼리를 선택 삽입에서 위의 변경

$sql = "SELECT username from users where username = ". $_POST['username'] ." AND password = ". $_POST['password'] .""; 
login($sql); 

. 지금은 새로운 오류가 발생합니다 : SQLSTATE [42S22] : 발견되지 칼럼 : 1054 알 수없는 열 'pvtpyro'에서 제대로 데이터베이스에 연결되지 않은 것을 '절'

+0

$ data 및 $ sql의 값은 무엇입니까? – ChristopheBrun

+0

@Herode 하단에 코드를 추가했습니다 –

+1

제 대답에 편집하십시오. SQL 인젝션으로부터 안전하지 않으므로 제공 한 SELECT 쿼리를 사용하지 마십시오. – stef77

답변

7

을 기반 : 당신은 후 PDO와 함께 결과를 가져올 수 없습니다 INSERT 쿼리를 실행합니다. 여기를보십시오 : http://www.php.net/manual/en/pdostatement.fetch.php#105682

편집 : 함수가 "로그인"이라고 생각하기 때문에 $ sql과 같은 것을 원합니다 : "사용자 이름 WHERE username = : username"을 입력 한 다음 결과를 반복하십시오. while 루프를 사용하고 비밀번호가 일치하면 사용자로 로그인하십시오.

편집 2 : 편집을 기반으로 SELECT 쿼리를 제공합니다. 이 쿼리를 사용하지 마십시오. 당신이하고있는 일은 SQL 인젝션 증거가 아닙니다. 사용자 입력 (예 : $ _POST, $ _GET 외)에서 변수를 사용하여 필터링하지 않은 상태에서 SQL 쿼리에 넣지 마십시오. SO 또는 Google에서 "prepared statements"라는 용어를 찾으십시오. 큰 따옴표 앞뒤에 하나의 틱 (아포스트로피)을 넣는 것을 잊었으므로 MySQL은 문자열의 값을 문자열과 비교하는 대신 입력이 다른 열 ("pvtpyro")을 참조한다고 생각합니다. 항상 ": username", ": password"문법 (콜론이 앞에 붙은 문법)을 사용하면 쿼리가 위험하고 응용 프로그램에 엄청난 위험을 초래할 수 있습니다.

+0

"선택"을 사용하려고했습니다. 이상한 지금은 왜 그것이 이전에 작동하는지 모르겠다. 고마워요 :) –

+0

당신을 환영합니다! while 회 돌이를 단일 -> 반입으로 대체하는 것을 고려해야한다는 힌트를 추가 할 수도 있습니다. 왜냐하면 세션을 여러 번 시작하고 헤더 위치를 두 번 이상 보내는 것이 타당하지 않기 때문입니다. 물론 사용자 이름이 데이터베이스에서 고유하면 아무런 문제도 발생하지 않지만 의도를 분명히하기 위해 while 회 돌이를 대체해야합니다 ("여러 명의 사용자가이 로그를주고 싶지 않습니다"). – stef77

+0

알았어. 좋아, 내가 지금 일할거야, 또 고마워! –

0

이 날 것 같다 ... I 오늘이 오류가 있었고 그 이유 때문이었습니다. 그 중 하나 또는 잘못된 문자열이 있습니다

1

PDO 생성자는 $ fbhost 및 $ fbname과 같이 제공 한 코드에서 정의되지 않은 2 개의 변수를 사용합니다.

편집 :
당신은 오류가 발생할 수 while 루프, 내부 session_start()를 호출하고 있습니다. 루프에서 꺼내십시오.

EDIT 2 :
정말 코드를 디버깅해야합니다. 어느 쪽이든 코드의 다른 부분에 die을 넣거나, 직전에 도움이되는 정보를 출력하거나 (덜 선호되는 방법) xdebug와 IDE를 사용하여 줄 단위로 실행하고 각 줄의 정확한 상태를 볼 수 있습니다 변수 등.

+0

완료. 그래도 같은 오류. SQLSTATE [HY000] : 일반 오류 –

+0

오, 들어 본 적이 xdebug. 감사합니다 :) –

1

값이 올바르지 않은 경우에도 $data$STH->execute($data);은 배열이어야합니다. 그래서, 당신은 $STH->execute(array($data));

편집하여 해당 쿼리를 교체하려고 할 수 있습니다 :

변경하여 선이에 : 최신 편집에

$data = array($_POST["username"], $_POST["password"]); 
$sql = "INSERT INTO users (username, password) value (?, ?)"; 


$STH = $DBH->prepare($sql); 
$STH->execute($data); 
+0

배열은 함수를 통해 전달됩니다 –

+0

나는 통과하는 것을 보여주기 위해 위의 코드를 변경했습니다. 그런 식으로 전달되는 경우 배열을 추가해야합니까? –

+0

예. 그냥 사용해보십시오. 그리고 '일반 오류'이후에는 무엇이 있을까요? 전체 오류 코드 – samayo

관련 문제