Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

montano

[Resolvido] session_start() already send

Recommended Posts

boa tarde,

 

Dificil explicar meu problema mas vamos la..

 

Esta ocorrendo um Warning no meu sistema, porque eu estou enviando duas vezes para a session iniciar.

 

index.php

<?php 
session_start(); 
// Codigo que necessita da sessio;
require_once('ajax.php'); 
?>

ajax.php

<?php 
session_start(); 
// require do controller, aqui tudo é requisitado por ajax. O ajax manda requisicao para essa msm pagina
require_once('controller');
?>

 

O problema é o seguinte, se eu tiro o session_start de ajax.php, o meu AJAX nao mantem minha variaveis de SESSION ao chamar a pagina ajax.php.

 

 

ajax.js // exemplo de como funcoina

//REGISTROS DE PME
function buscar(form)
{
var xmlhttp;
if (window.XMLHttpRequest)
  {
  // code for IE7+, Firefox, Chrome, Opera, Safari
  xmlhttp=new XMLHttpRequest();
  }
else if (window.ActiveXObject)
  {
  // code for IE6, IE5
  xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
  }
else
  {
  alert("Your browser does not support XMLHTTP!");
  }
var midia = form.busca_midia.value;
var url="ajax.php";
url=url+"?busca_midia="+midia;
url=url+"&acao[]=Buscar";
xmlhttp.open("GET",url,true);
xmlhttp.send(null);
xmlhttp.onreadystatechange=function()
{
if(xmlhttp.readyState==1)
  {
$("#msg").text("Carregando dados de busca...").show().fadeOut(2000);
  }
if(xmlhttp.readyState==2)
  {
$("#msg").text("Iniciando Busca...").show().fadeOut(2000);
  }
if(xmlhttp.readyState==3)
  {
$("#msg").text("Buscando nos registro...").show().fadeOut(2000);
  }
if(xmlhttp.readyState==4)
  {
$("#msg").text("Busca efetuada com sucesso!").show().fadeOut(2000);
  document.getElementById("rsp_buscar").innerHTML=xmlhttp.responseText;
  }
}
}

 

Eu executo minha ajax.php dentro da index.php porque eu uso o ajax.php para receber os templates do controller, e somente para isso,poise se eu chamasse direto do index.php os conteudos como menu seriam requisitados de novo pelo ajax ao controller.php.

 

Se eu botar um iframe ao invez de require no ajax.php daria para usar o session_start dentro de uma pagina que ja usa session start?

 

vlw

Compartilhar este post


Link para o post
Compartilhar em outros sites

montano,

 

Tenta colocar no seu ajax.php:

 

<?php
if ( !session_id() ) session_start();
require_once 'controller';

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você não pode iniciar duas tags session_start(). Cada sessão é única, o que impede que você crie sessões dentro de sessões. Quando você define uma variável $_SESSION em qualquer página COM A SESSÃO ABERTA, é claro, essa variável fica disponível em TODO o seu site, basta você iniciar a sessão para utilizá-la. No caso do seu ajax, se a sessão já tiver sido iniciada, você vai poder usar as variáveis registradas normalmente.

Compartilhar este post


Link para o post
Compartilhar em outros sites

montano,

 

Tenta colocar no seu ajax.php:

 

<?php
if ( !session_id() ) session_start();
require_once 'controller';

 

sua idéia é boa, pois esse if só sera True quando o ajax executar.

Voce tem ideia porque a pagina requisitada por ajax em ajax.php que esta required na minha index nao mantem minhas SESSION do index.php?

Compartilhar este post


Link para o post
Compartilhar em outros sites

o sistema estah mal estruturado,

por isso encontrou esse tipo de situacao.

 

encontrarah tb diversos outros problemas

 

sugiro remodelar a estrutura.

 

se quiser continuar desse modo,

 

nao bastaria remover o session_start() do ajax.php e no script javascript, ao invss de chamar ajax.php, chame index.php

 

obs: essa sugestao eh baseada nos codigos apresentados.

Compartilhar este post


Link para o post
Compartilhar em outros sites

hinom,

 

Eu estou chamando ajax.php porque é a pagina que me traz somente os resultados de INSERT, DELETE, SELET, UPDATE, e a pagina index.php contem outros conteudos como menu, e etc.. se eu chamar pela index.php quando o ajax for retornar a resposta para mim,ele vai retornar a pagina index.php inteira de novo. no caso vai ficar 2 paginas uma dentro da outra, entende?

 

Oque eu nao entendo é porque ele nao pucha a session para o ajax.php, porem se eu boto sessoin_start no ajax.php ele acha.

Compartilhar este post


Link para o post
Compartilhar em outros sites

é necessário iniciar session_start() a cada nova página,

 

contudo, não pode repetir a chamada a session_start() numa mesma execução pois estará enviando cabeçalhos em duplicidade, provocando o conflito

 

"headers already sent" -> cabeçalhos já enviados

Compartilhar este post


Link para o post
Compartilhar em outros sites

hinom,

 

O certo seria ter session_start() somente na minha index.php pois o ajax.php é um require_once. Sendo assim parte da minha index.php e nao uma nova pagina. correto?

 

Porem dentro da pagina ajax.php existe o AJAX fazendo requisições para a pagina ajax.php e é aqui que a coisa complica, pois quando o ajax faz a requisição ele nao inxerga a pagina ajax.php como require_once e sim como uma nova pagina, me obrigando por outro session_start() em ajax.php. Porem o erro ocorre pois para a pagina index.php vai aparecer como dois envios de session_start().

 

Teria como eu por o session_start() somente na hora da requisição ajax, fazendo isso nao ficaria dois session_start() na index.php.

 

Acontece duas vezes a execução da pagina ajax.php:

1ª ela sendo require na index.php.

2ª ela sendo requisitada pelo AJAX (é aqui que me obrigo a por session_start() novamente).

 

 

agradeço a ajuda.

Compartilhar este post


Link para o post
Compartilhar em outros sites

é algo simples de resolver..

 

precisa apenas estruturar melhor, mas resolvendo de forma rápida e sem complicações, basta utilizar um pouco de lógica.

 

index.php

<?php

session_start(); 

require_once('ajax.php'); 


// aqui embaixo tem outros códigos, certo ?
?>

 

no código javascript que chama o script ajax.php,

 

var url="ajax.php";
url=url+"?busca_midia="+midia;

adicione um parâmetro e troque ajax.php por index.php:

var url="index.php";
url=url+"?ajax=1&busca_midia="+midia;

 

 

no index.php, troque para

 

index.php

<?php

session_start(); 

require_once('ajax.php'); 

$v  = 'ajax';
if( isset( $_GET['ajax'] ) )
{
exit; // isso aqui vai interromper o script restante.. executará somente o que estiver acima..
}

// aqui embaixo tem outros códigos, certo ?
?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Certo...entendi a sua logica, atribuir um parametro na requisição para interromper os codigos que eu não quero que repita. Teria como usar a mesma logica porem assim?:

 

No ajax.php

if( isset( $_GET['ajax'] ) )
{
session_start();
}

 

vlw hinom

Compartilhar este post


Link para o post
Compartilhar em outros sites

Resolvido..

 

Valeu hinom, sua ideia me ajudou, eu fiz oque voce falou.. tirei o ajax.php fora, dechei tudo no index.php só que invez de usar o exit eu usei os scripts dentro de um if, pois tem codigo em cima e embaixo que nao podem repitir.

 

O mais estranho disso é que eu vi agora que o erro só ocorre no momento da requisiçao AJAX. :S quando eu do um require_once da pagina ajax.php que tem session_start() tambem, ele nao da erro de 2 session_start().

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.