JavaScript経由で文字列をPHPサーバーに送信する方法

WBOY
リリース: 2016-06-23 14:40:12
オリジナル
1417 人が閲覧しました

ログイン後に特定のユーザーが mysql クエリ コマンドを入力できるページがあります。
php サーバーはコマンドを受信すると、コマンド文字列を直接 mysql に渡して実行し、結果をページに表示します

最初は、編集可能なコントロールの内容が JavaScript でサーバーに直接送信されましたが、コマンド文字列内の「>」や「<」が異常でした。 encodeURIComponent 関数が変換されて送信され、サーバー側で php の html_entity_decode 関数を使用して逆変換されます。このように、使用するコマンドのほとんどは問題ありませんが、コマンド内の引用符が正常ではありません。

あちこち調べてください、方法が見つかりません。


ディスカッションに返信してください (解決策)

encodeURIComponent がそれを使用した後。トランスコード、php で直接受信できます Bar!もう乗り換える必要はありません!

html_entity_decode() を rawurldecode(); に置き換えます

htmlspecialchars_decode この関数を試してください

さまざまなトランスコーディング関数を試してください


1. フォーム送信であっても、次の場合でも処理は必要ありません。 ajax 経由で送信する

2. ajax 経由で送信する場合、ページが utf-8 ではなく、送信される文字列に中国語が含まれる可能性があります。 Ajax コンポーネントを設計するときは、URL エンコードを行うために encodeURIComponent を追加することを検討する必要があり、サーバーは文字セット変換を実行する必要があります

3. データを受信した後、サーバーは get_magic_quotes_gpc のステータスに基づいてエスケープ操作 (ストリップスラッシュ) を実行する必要があります

php5 以降。 3 magic_quotes_gpc スイッチはデフォルトでオフになり、キャンセルされます。この手順は不要になります。 4. encodeURIComponent は、utf-8 文字セットに従って URL エンコードを実行します。つまり、ページの文字セットに関係なく、サーバーは URL エンコードを実行します。 utf-8 データです。

5. html_entity_decode は htmlentities の逆関数であり、URL エンコードとは何の関係もありません

これらの基本的な知識を理解した後、続行できると思います

読んだ後、ありがとうございます!慎重に、詳細にテストしました。
入力が編集可能な DIV であるだけです。
単に「select * from tablename」と入力した場合、変換は行われません。 select * from tablename where id>5 の場合は問題ありません。
送信時に encodeURIComponent 関数を追加すると、select * from tablename が可能になります。ここで id>5 とすると結果は正常になります

この encodeURIComponent を使ってみたら、あ、これを見つけて試してみたのですが、PHP には対応するデコード関数がないので、 html_entity_decode を使ってみました

以下。は私のテストコードです:
クライアント

<!DOCTYPE html><html><head>	<title>测试</title>	<meta http-equiv="Content-Type" content="text/html"; charset="utf-8">	<script>		function handleStateChange(){			if(xmlHttp.readyState==4){				if(xmlHttp.status==200){					document.getElementById("md").innerHTML=xmlHttp.responseText;				}			}		}				function createXMLHttpRequest(){			try {				xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");			} catch (e) {				try {					xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");				} catch (oc) {					xmlHttp=null;				}			}			if (!xmlHttp && typeof XMLHttpRequest !="undefined"){				xmlHttp=new XMLHttpRequest();			}			return xmlHttp;		}				function sendstr(){			var xmlHttp=createXMLHttpRequest();			//var str="str="+document.getElementById("sqlstr").innerHTML;			//var str="str="+document.getElementById("sqlstr").value;			//var str="str="+encodeURIComponent(document.getElementById("sqlstr").value);			var str="str="+encodeURIComponent(document.getElementById("sqlstr").innerHTML);			var url="t2_1get.php";			xmlHttp.open("POST",url,true);			xmlHttp.onreadystatechange=handleStateChange;			xmlHttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded;");			xmlHttp.send(str);		}		</script>	</head><body><!--	<input type="text" id="sqlstr" />-->	<div id="sqlstr" contenteditable="true" style="border:1px solid #ccf;width:200px;height:20px;"></div>	<input type="submit" value="query" onclick="sendstr()"/>	<div id="md"></div></body></html>
ログイン後にコピー


サーバー
<!DOCTYPE html><html><head>	<title>测试get</title>	<meta http-equiv="Content-Type" content="text/html"; charset="utf-8"></head><body><?php	$mysqli=new mysqli("localhost","minhaouser","24994012499401",'test');	if ($mysqli->connect_error){		printf("连接失败:%s\n",$mysqli->connect_error);		exit();	}	$mysqli->query("set names 'utf8'");	//$sqlstr=$_POST['str'];	$sqlstr=html_entity_decode($_POST['str'],ENT_COMPAT,'UTF-8');	//$sqlstr=html_entity_decode($_POST['str']);	echo "sqlstr=".$sqlstr."<br />";	$res=$mysqli->query($sqlstr);	if (!$res){		echo $mysqli->error;		exit;	}	$finfo=$res->fetch_fields();	echo "<table border='1'><tr>";	foreach($finfo as $val){		echo "<td>".$val->name."</td>";	}	echo "</tr>";	while($row=$res->fetch_row()){		echo "<tr>";		for ($i=0;$i<$res->field_count;$i++){			echo "<td>".$row[$i]."</td>";		}		echo "</tr>";	}	echo "</table>";?></body></html>
ログイン後にコピー


カプセル化された jquery を直接使用して、ajax の機能要件を実装することをお勧めします

私は初心者であり、jquery を理解していません
それは私のプログラムです。 JavaScript は複雑ではないはずです

私は初心者なので jquery を理解していません

JavaScript を使い始めれば問題ありません。初心者... へー、勉強すれば 2 時間で取得できます

サーバーを
<?phpprint_r($_POST);exit;
ログイン後にコピー
に変更すると、実行後にわかります


同じコードですが、私のコードは次のようになります:



Apache と php のバージョンに問題がありますか? それとも設定に問題がありますか?
私の Apache は 2.2.4、

php は 5.2.3 です


テストコードを添付します:

<!DOCTYPE html><html><head>	<title>测试</title>	<meta http-equiv="Content-Type" content="text/html"; charset="utf-8">	<script>		function handleStateChange(){			if(xmlHttp.readyState==4){				if(xmlHttp.status==200){					document.getElementById("md").innerHTML=xmlHttp.responseText;				}			}		}				function createXMLHttpRequest(){			try {				xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");			} catch (e) {				try {					xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");				} catch (oc) {					xmlHttp=null;				}			}			if (!xmlHttp && typeof XMLHttpRequest !="undefined"){				xmlHttp=new XMLHttpRequest();			}			return xmlHttp;		}				function sendstr(){			var xmlHttp=createXMLHttpRequest();			var str="str="+document.getElementById("sqlstr").innerHTML;			var url="t2_1get.php";			xmlHttp.open("POST",url,true);			xmlHttp.onreadystatechange=handleStateChange;			xmlHttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded;");			xmlHttp.send(str);		}		</script>	</head><body>	<div id="sqlstr" contenteditable="true" style="border:1px solid #ccf;width:200px;height:20px;"></div>	<input type="submit" value="query" onclick="sendstr()"/>	<div id="md"></div></body></html>
ログイン後にコピー


t2_1get。 php:

<?php	print_r($_POST);	exit();?>
ログイン後にコピー


encodeURIComponent がクライアントに追加されると、次のようになります:






>'5'
が >' 5'

になる場合は、magic_quotes_gpc スイッチがオンになっていることを意味し、エスケープは自動的に実行されます

が必要です

if(get_magic_quotes_gpc()) {  $_POST['str'] = stripslashes($_POST['str']);}
ログイン後にコピー

ご協力いただきました xuzuning モデレーターに感謝します
以上です、ありがとうございます!

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート