2016-07-25 2 views
0

반환이 작동하고 새로운 설정으로 데이터베이스를 설정할 수 있습니다. 유일한 문제는 시간 프레임이 만료 될 때 사용자 상태의 변경 사항을 반영하는 쿠키를 얻는 것입니다.PayPal 반품 전화 후 PHP 업데이트 쿠키

if ($prem_user == 1) { 
    // prem user 
    if ($data->prem_exp < time()) 
    { 
     $query = "UPDATE members SET prem_status='0', prem_exp='0' WHERE id='$data->id'"; 
     mysqli_query($conn, $query); 

     // re build Cookie for new information 
     $sql = "SELECT * FROM members WHERE email = '$data->email' AND password = '$data->password'"; 
     $result = $conn->query($sql) or die(var_dump($conn)); 

     if ($result->num_rows != 1) { 
      // security issue send to index for logic to handle 
      header("LOCATION : /index.php"); 
     } 

     $data = json_encode($result->fetch_array(MYSQLI_ASSOC)); 
     setcookie('account', $data, time() + (86400 * 30), '/'); 
    } 
} 
+0

문제를 이해하는 데 어려움이 있습니다. 'setcookie '가 쿠키를 설정하지 않는 문제입니까? – BeetleJuice

+0

이미 $ _COOKIE [ 'account']로 설정된 쿠키가 있으며 새 정보를 넣으려고합니다. – user3750649

+0

스크립트 실행이 해당 행에 도달했다는 사실을 알고 있습니까? 'setcookie' 직후에'var_dump ($ data); exit;'명령을 실행하면 데이터가 화면에 나타 납니까? – BeetleJuice

답변

2

일부 배경 :

(서버에서 브라우저로) HTTP 응답의 내용에 대한 브라우저 및 콘텐츠 자체를 말할 헤더가 포함되어 있습니다. 헤더는 내용보다 먼저 보내야합니다. 쿠키는 헤더 내에 설정됩니다.

문제

귀하는 일부 콘텐츠가 headers_sent()true 때문에 우리가 이것을 알고 브라우저 (로 전송 된 후에 발생하기 때문에 setcookie이 작동하지 않습니다. 포함 <?php?> 내용은 PHP 태그 이외의 아무것도 포함 모든 HTML과 여는 태그 앞에 빈 공간.

해결 방법 1

알트 ernative fix는 출력 버퍼링을 사용하는 것입니다. 즉, 브라우저에 내용을 보내면 PHP는 버퍼가 꽉 찼거나 스크립트가 끝날 때까지 버퍼에 내용을 보관합니다. 나중에 헤더 (예 : setcookie)를 보내면 아무 것도 실제로 브라우저에 전송되지 않으므로 아무런 문제가 없습니다. 버퍼를 플래시,

<?php 
ob_start(); 

을 다음 스크립트의 끝에 :

모든 콘텐츠가 전송되기 전에 출력 버퍼를 시작,이 솔루션을 사용하십시오. 이 브라우저에 버퍼에

ob_end_flush(); 

See the docs

참고 모든 전송 : 자동, 항상 강제로 전송되기 전에 저장할 수있는 양 (버퍼 크기를 설정하여 출력 버퍼링을 사용하는 PHP를 설정할 수 있습니다 php.ini의

output_buffering = 4096 

해결 방법 2

의 브라우저)에

해결 방법은 콘텐츠를 보내기 전에 쿠키를 설정하는 것입니다. 콘텐츠를 보내는 위치를 모를 경우, 대신 setcookie의 아래의 코드를 실행 : 먼저 브라우저에 내용을 보내 곳

$file=null; 
$line=null; 
if(headers_sent($file,$line)){ 
    //headers have been sent. too late to set a cookie 
    die("Can't set cookie: Content sent in $file on line $line"); 
}else{ 
    setcookie(...); // cookie header can still be set. 
} 

메시지는 당신에게 파일 이름과 라인 수를 줄 것이다.

See the docs.

+0

일부 탐험을 통해 약 30 분 전이 답변을 발견했습니다 - 내 부트 스트랩에 맞습니다. 디버그 이유로 보낼 헤더가있었습니다. – user3750649