0

私はしばらくこれで髪を引き裂いています。

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'];

どのエコーも何も返しません。

settings.php:

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

settings.php-include をコメントアウトすると、コードはうまく機能します (もちろん、echo $uid は機能しません)。誰が私が間違っているのか知っていますか?

index.php には、違いがある場合は settings.php も含まれています。

編集: 以下の投稿で、明確にしたいと思いました。パスはすべて正しいです。settings.php (およびその他のスクリプト) はすべてルート フォルダーの外に配置され、Web ユーザーがアクセスできないようにします。スクリプトからアクセスすると、それらはうまく機能しています。

4

4 に答える 4

6

PHP マニュアルで説明されているように、mysql_real_escape_string には、mysql_connect (2 番目のパラメーター) で確立された実際のデータベース接続が必要です。存在しない場合は、単に mysql_connect() を呼び出して作成を試みます。これも機能しない場合は、false を返します。

そのため、最初にデータベース接続を作成する必要があります。しかし、これを始める前に:すべての POST 変数と GET 変数を単純に取得してグローバル名前空間に吐き出すのは、本当に悪い考えであることに注意してください。

于 2010-03-09T16:23:58.130 に答える
3

まず、変数変数は避けます。このコンテキストでは実際には必要ありません。実際にどのキーがそのスクリプトに到達しているかわからない場合は、移動するターゲットになります。セキュリティの問題があるため、変数は不適切です。彼らが作成する。代わりに、settings.php内のエスケープされた値を配列に入れます。次に、settings.phpをインクルードした後、配列をvar_dump()するだけで、何が利用可能かを確認できます。

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

次に、JavaScriptで要求するとおりの正しいURL文字列を使用してlogin.phpを手動で呼び出します。これにより、動作上の問題がlogin.phpスクリプト自体から発生していないことを確認できます。

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

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

最後に、post()で送信しているデータを確認します。私はJavaScriptの第一人者ではありませんが、

uid:uid,
 pwd:pwd

問題が発生する可能性があるため、データが期待どおりに送信されていることを確認することをお勧めします。

$(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;
    });
});

編集:mysql_real_escape_string-only-when-a-connection-has-been-initiatedに基づいて、上記のコードからエスケープを削除しました。実際には、配置する直前にエスケープしたほうがよいからです。 SQLに。

さらに、ログインにjavascriptを使用すると、ログインと同じくらい基本的で必要な機能を備えたjavascriptエラーが表示され、視聴者がログインする機能が損なわれることはありませんそうする。

于 2010-03-09T16:25:46.587 に答える
1

有効なmysqlリンクはありますか?

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

が指定されていない場合、link identifierによって開かれた最後のリンクmysql_connect()が想定されます。そのようなリンクが見つからない場合mysql_connect()は、引数なしで呼び出されたかのようにリンクを作成しようとします。接続が見つからないか確立されていない場合、E_WARNINGレベルエラーが生成されます。

エラー報告設定がE_WARNINGレベルエラーを無視している可能性があります。

于 2010-03-09T16:27:11.490 に答える
0

index.php は明らかにウェブサイトのルート ディレクトリにありますが、呼び出しているスクリプトは「バックエンド」カタログにあります。

include_once代わりに使用してみてinclude、相対パスではなく絶対パスを使用してください。

例:

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

絶対パスを使用すると、ファイルを移動する場合に作業が楽になります。

于 2010-03-09T16:22:03.723 に答える