php、jquery and .post():mysql_real_escape_stringは物事を台無しにします
-
18-09-2019 - |
質問
私はしばらくの間、これで髪を引き裂いてきました。
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は機能しません)。そのため、mysql_real_escape_stringが行うものでなければなりません。誰かが私が間違っていることを考えていますか?
index.phpには、settings.phpも含まれます。
編集:以下の投稿により、私は明確になりたいと思いました。パスはすべて正しいです。 settings.php(およびその他のスクリプト)はすべて、すべてのルートフォルダーの外側に配置され、Webユーザーがアクセスできないようにします。スクリプトからアクセスすると、それらはうまく機能しています。
解決
説明されているように PHPマニュアルで, 、mysql_real_escape_stringには、mysql_connect(2番目のパラメーター)で確立された実際のデータベース接続が必要です。存在しない場合、mysql_connect()を呼び出すだけで作成しようとします。これも機能しない場合、falseを返します。
したがって、最初にデータベース接続を作成する必要があります。しかし、あなたがこれを始める前に:それは 本当に悪い考え 単にすべての投稿を取得して変数を取得し、グローバルネームスペースに唾を吐きます。
他のヒント
まず、変数変数を回避します。これらはこのコンテキストでは本当に必要ではなく、実際にそのスクリプトに到達しているキーがわからない場合は、感動的なターゲットを作成します。彼らが作成すること。代わりに、settings.php内の脱出値を配列に入れます。次に、settings.phpを含めた後、var_dump()を単に配列()に単純に確認し、利用可能なものを確認できます。
function extract_requests(){
$res = array();
foreach ($_REQUEST as $key => $value) {
if($key){
$res[$key] = $value;
}
}
return $res;
}
第二に、正しいURL文字列でlogin.phpを手動で呼び出します。正確にJavaScriptに呼びかけたいと思うように、行動の問題は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のみに基づいて、when-a-connection-has-been initiatedのもので、上記のコードから脱出を削除しました。 SQLに。
さらに、ログインにJavaScriptを使用することに注意してください 意思 基本的かつ必要なログインとして機能している機能を備えた噛み付きに戻って、JavaScriptエラーが視聴者がログインする能力を破る必要はありません。ここでそうします。
有効なmysqlリンクはありますか?
string mysql_real_escape_string ( string $unescaped_string
[, resource $link_identifier ] )
場合
link identifier
指定されていませんが、最後に開いたリンクmysql_connect()
想定されています。そのようなリンクが見つからない場合、それはまるでそれを作成しようとしますmysql_connect()
議論なしで呼ばれました。接続が見つからない場合、または確立されている場合、E_WARNING
レベルエラーが生成されます。
エラー報告設定が無視される場合があります E_WARNING
レベルエラー。
index.phpは明らかにウェブサイトのルートディレクトリにありますが、呼び出しているスクリプトは「バックエンド」カタログにあります。
使用してみてください include_once
それ以外の include
そして、相対ではなく絶対パスを使用します。
例:
<?php
include_once($_SERVER['DOCUMENT_ROOT']."/settings.php"); //absolute path to file
echo $uid;
echo $_POST['uid'];
?>
ファイルを移動すると、絶対的なパスを使用すると、あなたの生活が容易になります。