ホームページ  >  記事  >  バックエンド開発  >  jquery Ajax プログラムが PHP プログラムから返された文字列を分割する場合、常に問題が発生します。

jquery Ajax プログラムが PHP プログラムから返された文字列を分割する場合、常に問題が発生します。

WBOY
WBOYオリジナル
2016-06-23 14:15:20950ブラウズ

たとえば、PHP プログラムは
echo 'yt|'.$row["dig"]; を出力します

Ajax プログラムはそれを分割します:
function Dig(id) { //投票リンクがクリックされたとき
var content = document.getElementById("dig"+id); //「Vote」を表示する要素を取得します
//投票数を表示する要素を取得します。その id 属性値は、id=3 と同様の数値です。 "
var dig = document.getElementById(id);
$.ajax({
type: "get",
url: "service.php",
data: {id:id,n:Math.random()} , // レコード ID を service.asp に送信します
beforeSend:function(){$(dig).html('cc443a9def70861979993533a73bdca3');},
success: function(data ){ / /返されたデータを処理します
r=data.split("|");
alert(r[0]);
if(r[0] == "yt" ) { //投票が行われた状況Cast
(content).html("あなたはすでに投票しました!"); //レコードが見つかりません
{alert("パラメータエラー!") }
else{
$(dig).html(data); /サーバーは正常に変更され、投票数が更新されました
$(content).html("投票は成功しました ") //1 つの投票を成功した投票に変更します
setTimeout("rightinfo("+id+")", 3000); // 3 秒後に rightinfo(id) を呼び出します
テスト後、問題は r[0] == "yt" が false を返すことです。ただし、alert(r[0]); を使用すると、出力結果は yt ですが、yt の上に空白行があるようです。
以前は、ASP プログラム出力を使用する場合にはこのような問題はありませんでした。
Response.Write("yt"&","&rs("Dig"))
この問題はオンラインでは見つかりません。理由は?



ディスカッションへの返信 (解決策)

1. PHP ファイルの前に空白行がないことを確認してください
2. ファイルが utf-8 でエンコードされている場合は、BOM ヘッダーがないことを確認してください

たとえば、PHP プログラムは
echo 'yt|'.$row["dig"]; を出力します

Ajax プログラムはそれを分割します:
function Dig(id) { //投票リンクがクリックされたとき
var content = document.getElementById("dig"+id); //「Vote」を表示する要素を取得します
//投票数を表示する要素を取得します。その id 属性値は、id=3 と同様の数値です。 "
var dig = document.getElementById(id);
$.ajax({
type: "get",
url: "service.php",
data: {id:id,n:Math.random()} , // レコード ID を service.asp に送信します
beforeSend:function(){$(dig).html('cc443a9def70861979993533a73bdca3');},
success: function(data ){ / /返されたデータを処理します
r=data.split("|");
alert(r[0]);
if(r[0] == "yt" ) { //投票が行われた状況Cast
(content).html("あなたはすでに投票しました!"); //レコードが見つかりません
{alert("パラメータエラー!") }
else{
$(dig).html(data); /サーバーは正常に変更され、投票数が更新されました
$(content).html("投票は成功しました ") //1 つの投票を成功した投票に変更します
setTimeout("rightinfo("+id+")", 3000); // 3 秒後に rightinfo(id) を呼び出します
テスト後、問題は r[0] == "yt" が false を返すことです。ただし、alert(r[0]); を使用すると、出力結果は yt ですが、yt の上に空白行があるようです。
以前は、ASP プログラム出力を使用する場合にはこのような問題はありませんでした。
Response.Write("yt"&","&rs("Dig"))
この問題はオンラインでは見つかりません。理由は?
まず、戻り値の前後のスペースを削除します
trim(data) もちろん、trim(r[0]) からスペースを削除することもできます

いいえ、実際に私が考えたスペースはありません。スペースを削除するために Trim 関数を使用したり、整数に変換するために intval を使用したりするなど、さまざまな方法があります。私のファイルはgb2312でエンコードされており、その前にheader("Content-type: text/html; charset=gb2312");

ASPプログラムのrsをphpの$rowに変更しただけですが、変更されませんでした。 work

私 次の記事に記載されている問題が原因だと思います:

Ajax の戻り値のキャリッジリターン (ラインフィードとも呼ばれます) の解決策
http://www.111cn.net/ wy/js-ajax/39612 .htm

記事の方法に従ってアラート付きで出力したところ、Firefoxでは改行がありませんでしたが、IE6では改行が残っており、どちらのブラウザも正常に動作しません

if(r [0] == "yt" ) 判定結果は常に false
でも、r[0] は明らかに yt で、データ型も string なので混乱します


echo base64_encode(file_get_contents('http://localhoust) /service.php?id=3 '));
結果を投稿してください

モデレーター、結果は次のとおりです:
DQoNCjM4

ブラウザでリンクを直接実行すると、結果は 37 ですが、上に 2 つの空行があります, 37 は $row['dig' ] の値です


$s = 'DQoNCjM4';$s = base64_decode($s);echo bin2hex($s);
は戻り値の 16 進内部コードを取得します: 0d0a0d0a3338
その中には:
0d キャリッジリターン文字
0a ラインフィード文字

これは、プログラムに何かがあることを意味します外側 bb9bd6d87db7f8730c53cb084e6b4d2d 2 つの空白行

はこのファイルまたは埋め込みファイル内にある可能性があります


ああ、そうそう、私がインクルードした conn.php ファイルの下部に 2 つの空白行がありました。上に空白行はありませんでしたが、下の行は空です。削除後はすべて正常です。 if(r[0] == "yt" ) が true の場合、

また、4 階で説明した空白行を削除する方法は、実際には役に立ちません。

したがって、プログラム ファイルの最後にある ?> を省略すると、空白行が少なくなります。

このように js を使用して空白行を削除します

data.replace(/[rn]+/g, "")

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
前の記事:PHPの操作配列次の記事:PHPの操作配列