Pergunta

Já faz um tempo que estou arrancando o cabelo com esse.

index.php:

$(document).ready(function(){ 
    $(".index_login_subm").click(function(){
        uid = $("input:username").val();
        pwd = $("input:password").val();
        $.post("backend/login.php",{
            uid:uid,
            pwd:pwd
        },function(data){
            alert("Returned data: " + data);
         });
        return false;
    });
});

login.php:

include("../../settings.php");
echo $uid;
echo $_POST['uid'];

nenhum dos ecos retorna nada.

configurações.php:

foreach ($_POST as $key => $value) { 
   $$key = mysql_real_escape_string($value);
}
foreach ($_GET as $key => $value) { 
   $$key = mysql_real_escape_string($value); 
}

O código funciona bem se eu comentar o settings.php-include (bem, é claro que o echo $uid não funcionará), então deve ser algo que o mysql_real_escape_string faz.Alguém tem alguma ideia do que estou fazendo de errado?

index.php também inclui settings.php se isso fizer alguma diferença.

EDITAR:As postagens abaixo me deram vontade de esclarecer;os caminhos estão todos corretos.settings.php (e alguns outros scripts) são colocados fora da pasta raiz para torná-los inacessíveis a um usuário da web.Eles estão funcionando bem quando acessados ​​pelos scripts.

Foi útil?

Solução

Conforme descrito no manual do PHP, mysql_real_escape_string requer uma conexão de banco de dados real estabelecida com mysql_connect (no segundo parâmetro).Se não existir, ele tenta criar um simplesmente chamando mysql_connect().Se isso também não funcionar, retorna falso.

Portanto, você teria que criar primeiro uma conexão com o banco de dados.Mas antes de começar a fazer isso:observe que é um realmente, péssima ideia simplesmente pegar todas as variáveis ​​POST e GET e colocá-las no namespace global.

Outras dicas

Primeiro, eu evitaria as variáveis ​​variáveis, elas realmente não são necessárias neste contexto e são um alvo móvel se você não tiver certeza de quais chaves estão realmente alcançando esse script, e são uma prática ruim devido aos problemas de segurança que eles criam.Em vez disso, eu colocaria os valores de escape em settings.php em um array.Então você pode simplesmente var_dump() o array depois de incluir settings.php e ver o que estava disponível.

function extract_requests(){
    $res = array();
    foreach ($_REQUEST as $key => $value) { 
        if($key){
            $res[$key] = $value;
        }
    }
    return $res;
}

Segundo, chame manualmente login.php com a string de URL correta, exatamente o que você gostaria que o javascript chamasse, para ter certeza de que quaisquer problemas comportamentais não vêm do próprio script login.php.

http://localhost/somewhere/login.php?uid=50

include("../../settings.php");
$input = extract_requests();
var_dump($input);
echo $input['uid'];
echo $_POST['uid'];

Por fim, gostaria de verificar os dados que você está enviando no post().Não sou um guru de javascript, mas

uid:uid,
 pwd:pwd

parece que isso causaria problemas para mim, então seria bom ter certeza de que seus dados estão sendo enviados da maneira esperada.

$(document).ready(function(){ 
    $(".index_login_subm").click(function(){
        uid = $("input:username").val();
        pwd = $("input:password").val();
        var inputData = {uid:uid, pwd:pwd};
        alert(uid+" "+pwd);
        // If you have a console.log() available, just use it on inputData here instead.
        $.post("backend/login.php",inputData
         ,function(data){
            alert("Returned data: " + data);
         });
        return false;
    });
});

Editar:Com base na coisa mysql_real_escape_string-only-when-a-connection-has-been-initiated, removi o escape do código acima, porque, na verdade, será melhor escapar do material antes de colocá-lo no SQL.

Além disso, lembre-se de que usar javascript para login VAI volte para mordê-lo, com funcionalidades tão básicas e necessárias quanto o login, você não quer que um erro de javascript interrompa a capacidade de um visualizador fazer login.Aqui isso acontecerá.

Existe um link mysql válido?

string mysql_real_escape_string  ( string $unescaped_string
                                [, resource $link_identifier  ] )

Se o link identifier não for especificado, o último link aberto por mysql_connect() é assumido.Se nenhum link for encontrado, ele tentará criar um como se mysql_connect() foi chamado sem argumentos.Se nenhuma conexão for encontrada ou estabelecida, um E_WARNING erro de nível é gerado.

Pode ser que sua configuração de relatório de erros seja ignorada E_WARNING erros de nível.

index.php obviamente está localizado no diretório raiz do site, mas o script que você está chamando está no catálogo "backend".

Tente usar include_once em vez de include e use caminhos absolutos, não relativos.

Exemplo:

<?php
    include_once($_SERVER['DOCUMENT_ROOT']."/settings.php"); //absolute path to file
    echo $uid;
    echo $_POST['uid'];
?>

Usar caminhos absolutos facilitará sua vida se você mover arquivos.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top