ちょっと変な障害に直面して困っています。
PHP(5.4.7)とJavascriptでアプリケーションを作っています。
データベースはMySQL(5.5.27)です。
あるプロジェクトの中で、顧客,担当者,取引の3つの情報に「メモ」欄が
あって、画面上ではTextareaで複数行入力できるようになっています。
Enterキーの入力も許していて改行できるようになっています。
改行情報「\r\n」をそのまま表示するとエラーになりますので、
PHP側で「\n」に変換しています。
それぞれ、こんな感じです。当然別クラスです。
【顧客情報】
$memoCustomer = str_replace("\r\n", '\n', $row["memoCustomer"]);
【担当者情報】
$memoPerson = str_replace("\r\n", '\n', $row["memoPerson"]);
【取引情報】
$memoTrading = str_replace("\r\n", '\n', $row["memoTrading"]);
ところが、どうしても
【取引情報】
$memoTrading = str_replace("\r\n", '\n', $row["memoTrading"]);
ではちゃんと変換せず、JSONで渡したデータについてJavascriptでエラーに
なってしまいます。
【顧客情報】を表示するときはFirebugのコンソールには以下のように出力され、
memoCustomer には "やだな\nどおよ\nでもね\n" とちゃんと「\n」が
セットされています。
[{"customerId":"1325","customerName":"AAA物産","customerRyaku":"AAA物産","customerYomi":"エーエーエー","zip":"","jusyo1":"","jusyo2":"","categoryTrading":"取引","memoCustomer":"やだな\nどおよ\nでもね\n","insertDateCustomer":"2013/06/20","updateDateCustomer":"2014/02/04","validFCustomer":"有効"}]
【取引情報】では見た目には改行されていますが、「\n」がはさまれておらず、Javascript側でエラーになります。
修","stamp":"","testCost1":"0","testCost2":"0","testCost3":"0","afTrustCost":"0","afCoordinateCost":"0","otherCost":"0","totalCost":"0","memoTrading":"どうよ
だから
いいでしょ
","insertDateTrading":"2014/02/04","updateDateTrading":"2014/02/04","validFTrading":"有効"}]
当然ここで登録時のプログラムが疑われるわけですが、3つとも全く同じに、Textarea の内容を何ら編集することなく
パラメータで渡しているだけです。
これはローカルでテストとしている環境ですが、稼働サーバにデプロイしても同様の結果となります。
何かヒントがありましたら教えて下さい。
よろしくお願いします。
PHPのソースは以下です。
<?php
require_once '../../code/common/DBAccess.php';
$tradingId = null;
if(isset($_GET["tradingId"])) {
$tradingId = $_GET['tradingId'];
}
$sql = "SET NAMES utf8";
mysql_query($sql, $conn);
$sql = "SELECT * FROM tbl_trading WHERE tradingId = '" .$tradingId. "'";
$res = mysql_query($sql, $conn);
$result = "[";
while($row = mysql_fetch_array($res)){
// 「登録日」のFormat変換と空白処理
$insertDateTrading = date_create($row["insertDateTrading"]);
$strInsertDateTrading = date_format($insertDateTrading, 'Y/m/d');
if($strInsertDateTrading == "1700/01/01"){
$strInsertDateTrading = "";
}
// 「更新日」のFormat変換と空白処理
$updateDateTrading = date_create($row["updateDateTrading"]);
$strUpdateDateTrading = date_format($updateDateTrading, 'Y/m/d');
if($strUpdateDateTrading == "1700/01/01"){
$strUpdateDateTrading = "";
}
// 格納されている改行コード \r\n(CR+LF) から \n(LF) に変換
$memoTrading = str_replace("\r\n", '\n', $row["memoTrading"]);
$result = $result. "{\"tradingId\":\"" .$row["tradingId"].
"\",\"customerId\":\"" .$row["customerId"].
"\",\"subject\":\"" .$row["subject"].
"\",\"personCompany\":\"" .$row["personCompany"].
"\",\"status\":\"" .$row["status"].
"\",\"situation\":\"" .$row["situation"].
"\",\"orderSheet\":\"" .$row["orderSheet"].
"\",\"billSubject\":\"" .$row["billSubject"].
"\",\"bookFee\":\"" .$row["bookFee"].
一部省略
"\",\"taxFee\":\"" .$row["taxFee"].
"\",\"otherFee\":\"" .$row["otherFee"].
"\",\"taxTreatment\":\"" .$row["taxTreatment"].
"\",\"traficRoute\":\"" .$row["traficRoute"].
"\",\"subjectDetail\":\"" .$row["subjectDetail"].
"\",\"stamp\":\"" .$row["stamp"].
"\",\"otherCost\":\"" .$row["otherCost"].
"\",\"memoTrading\":\"" .$row["memoTrading"].
"\",\"insertDateTrading\":\"" .$strInsertDateTrading.
"\",\"updateDateTrading\":\"" .$strUpdateDateTrading.
"\",\"validFTrading\":\"" .$row["validFTrading"].
"\"},";
}
$len = strlen($result);
if($len != 1){
$result = substr($result,0,($len - 1));
}
$result = $result. "]";
echo $result;
mysql_free_result($res);
?>
お礼
「"\r\n"と思っていたら、実は(他で何らかの処理をしていて)"\n"だけだった」 ということのようでした。 $memoTrading = str_replace(array("\n","\r\n","\r"), '\n', $row["memoTrading"]); とやったら、すんなり通ってしまいました。 コードの他の部分も見てみたんですが、 「他で何らかの処理をしていて」というのは見つからなかったのに、なぜだろう。 でも、こういうところまで見抜くとはすごいですね。 本当にありがとうございました。 ご指摘の通り「昭和の匂いのするプログラム」のようです。Prepared Statemment とか勉強して、もっといいプログラムに書き換えていきたいと思います。 ありがとうございました。