• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:特定の関数が機能しません)

特定の関数が機能しない障害について

このQ&Aのポイント
  • PHPとJavascriptでアプリケーションを作成していますが、特定の関数が正しく機能しません。障害の詳細や原因、解決策を教えてください。
  • 画面上のTextareaで複数行入力ができるようになっていますが、改行情報「 」をそのまま表示するとエラーになります。PHP側で「 」に変換しているのですが、一部のデータだけ変換されない問題が発生しています。原因や対策方法を教えてください。
  • ローカル環境でテストしたときに問題が発生しており、デプロイしても同様の結果となります。原因が何かわかりますか?解決策やヒントを教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • agunuz
  • ベストアンサー率65% (288/438)
回答No.1

今どき、ネイティブなMySQL関数というのもアレです。しかもmysql_set_charsetを使わずset namesだし、外部から与えられた値をmysql_real_escape_stringも(というか、何のエスケープ処理も)していないし・・・ 早急にPDOなど(&プレースホルダを利用)に書き替えてください。 閑話休題 str_replace("\r\n", '\n', $str) ではなく、str_replace("\n", '\n', str_replace("\r", '', $str)) だとどうなりますか?"\r\n"と思っていたら、実は(他で何らかの処理をしていて)"\n"だけだったなんてこともあり得そうなので、"\r"を削除して、"\n"を'\n'に置換というパターンが確実だと思います。

panasobi
質問者

お礼

「"\r\n"と思っていたら、実は(他で何らかの処理をしていて)"\n"だけだった」 ということのようでした。 $memoTrading = str_replace(array("\n","\r\n","\r"), '\n', $row["memoTrading"]); とやったら、すんなり通ってしまいました。 コードの他の部分も見てみたんですが、 「他で何らかの処理をしていて」というのは見つからなかったのに、なぜだろう。 でも、こういうところまで見抜くとはすごいですね。 本当にありがとうございました。 ご指摘の通り「昭和の匂いのするプログラム」のようです。Prepared Statemment とか勉強して、もっといいプログラムに書き換えていきたいと思います。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

  • coai
  • ベストアンサー率50% (152/301)
回答No.3

私もちゃんと見ていませんが、 $memoCustomer = str_replace("\r\n", '\n', $row["memoCustomer"]); 等の置き換え文字の'\n'をシングルクォーテーションで括っているのは、ちゃんと意図してやってるのだろうか? ソースコード内コメントの // 格納されている改行コード \r\n(CR+LF) から \n(LF) に変換 を読む限り、シングルとダブルの違いを理解せずにやってるようにしか思えない。 まあ、コメントの書き方が悪いだけかも知れないが…

panasobi
質問者

お礼

回答ありがとうございました。 JSONはダブルコートで括らなければいけないものですから、JSONに渡すときはシングルコートでないといけないようです。 コメントの書き方はもっと丁寧に書くようにします。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

真剣にみてないのでなんとも言えませんが javascriptにデータを戻すときに\nを\\nにしてみては?

panasobi
質問者

お礼

回答ありがとうございました。 JSONで渡す前に変換したかったのでこのようになりました。 参考にさせて頂きます。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 改行コードについて

    ファイルの文字コードはutf-8で改行コードはLFです。 メール送信時にメール文面の一部にいれるテキストを mysqlに保存しています。 メール送信のソース内でデータを読み込み送信までは できているのですが改行コードを変換したく $msg = str_replace("\r\n", "\n", $msg); とやってみましたが改行されず普通に\r\nと表示され うまく変換ができません。 いろいろと試した結果以下のソースでは正常に改行されました。 $msg = str_replace("\\r\\n", "\n", $msg); メール送信前にデバッグでしてみましたが読み込むデータの 改行部分は\r\nとなっているのは確認済みです。 \を多くつければ改行はできるようなのですがこれは仕様なの でしょうか? またmysqlに入れてあるデータはフォームから入力し登録 しているのですがLFの改行コードは\nなので登録時に\r\nではなく \nと変換してからmysqlに登録するのがいいものなのでしょうか?

    • 締切済み
    • PHP
  • 改行コードの<BR>への変換がうまくいきません。

    はじめまして よろしくお願いします。 仕事でPHPを触れはじめたところです。 textarea タグで入力されたものをMysqlに保管し、 また表示するというようなものを作ろうとしています。 困っているのは Mysqlがどうのではなくその登録前に 改行コードを <br>タグ に変換をかけておこうというところで躓いています。 セッションを開始しておいてFormタグからの値を 次のページで受け取っています。 ここの過去ログ等を参考にしてみたのですが... $_SESSION['e_biko'] = htmlspecialchars($_POST['biko'] , ENT_QUOTES) ; $tmp_biko = ""; $tmp_biko = str_replace("\r\n", "\r", $_SESSION['e_biko']); $tmp_biko = str_replace("\r", "\n", $tmp_biko); $_SESSION['e_biko'] = str_replace("\n", "<br>", $tmp_biko); このあとでechoを使って$_SESSION['e_biko'] を表示させています。 しかし改行しないんです。<BR>タグへの変換ができておらず、表示されたHTMLのソースコードを見ると改行コードがそのまま出力されています。 HTML及びPHPの文字コードはEUCで記述しています。 開発及び確認はWindows・IE6で行っています。 何か考えられる原因、あるいはバグかあるでしょうか? ちなみに下記でも駄目でした。 $_SESSION['e_biko'] = preg_replace("/\r\n|\r|\n/", "<br>", $_SESSION['e_biko']); お分かりになられる方おられましたらよろしくお願いいたします。

    • ベストアンサー
    • PHP
  • PHP+MySQLを実行するとエラーが出てパソコンがフリーズする。

    次のphpを実行すると、求めるデータは表示出来ますが、その下に引き続き Warnning:mysql_result()[function.mysql_result]: Unable to jump to row 7 on MySQL result index 3 in C:****test.php on line 10; 同文で on line 11; 以下,Unable to jump toの 「 row 7」 が row 8 row 9・・・・・・ と延々と続き、パソコンがフリーズしてしまいます。 実行したphp文。 <?php $con=mysql_connect(localhost,"root","root"); $selectdb=mysql_select_db("sales",$con); $sql="select * from sample"; $result=mysql_query($sql,$con); $row=mysql_fetch_array($result); $price=mysql_result($result,$i,1); $volume=mysql_result($result,$i,2); echo("$price:$volume<br>\n"); mysql_close($con); ?> 参考書を調べて、いろいろ変えてみましたが、分かりません。 幼稚なphp文で恐縮ですが、悪いところをご指摘頂ければ有難いです。

    • ベストアンサー
    • PHP
  • PHPとMySQLについて

    PHPとMySQLについて PHP、MySQLともに初心者の者です。 ネットの情報を参考に以下のようなプログラムを作成しました。 <?php //ファイルを読み込み require_once("DB47.php"); // クエリを送信する $sql = "SELECT * FROM japanDB ORDER BY PREF_CD"; $result = executeQuery($sql); //結果セットの行数を取得する $rows = mysql_num_rows($result); //表示するデータを作成 if($rows){ while($row = mysql_fetch_array($result)) { $tempHtml .= "".$row["PREF_CD"]." ".$row["PREF_NAME"]." "; $tempHtml .= "\n"; } $msg = $rows."件のデータがあります。\n\n"; }else{ $msg = "データがありません。\n\n"; } //結果保持用メモリを開放する mysql_free_result($result); ?> <?= $msg ?> <?= $tempHtml ?> これはデータベースに 1、北海道 2、青森 ・  ・ ・  ・ ・  ・ 47、沖縄 といった情報を与えており、PHP側でMySQLに接続し、その内容をコマンドプロンプト上で表示するといったものです。 しかし、PHPプログラムを実行してしまうと、全データが一気に表示されてしまうので、見づらいものとなっています。 そこで、地名や番号を入力すれば、地名を表示するような検索機能を付けたいのですが、PHPからMySQLデータベース内を検索する方法が分かりません。検索機能をこのプログラムに組み込みたいのですが・・・。 どなたかご教授お願いいたします。 ***環境*** OS : Windows XP Pro PHP4.2.3 、MySQLインストール済み **********

    • ベストアンサー
    • PHP
  • textareaの文章をファイルに書き込む方法

    PHP: 4.4.4です。 <TEXTAREA name="ireru" cols="50" rows="20"></TEXTAREA>に 1.html 2.html 3.html 4.html 5.html ・・・ 20.html と入力し、書き込み形式 1.html\t2.html\t3.html\t4.html\t・・・20.html\t\n 上記の形でlogファイルに書き込みたいのですが、上手くいきません。 (20個以上は書き込めない仕様にしたい) $ireru=htmlspecialchars($_POST['ireru']); $ireru=str_replace("\r\n","\t",$ireru); $ireru=str_replace("\r","\t",$ireru); $ireru=str_replace("\n","\t",$ireru); $ireru=str_replace("\t","",$ireru); $ireru=str_replace(",","\t",$ireru); 改行を\tに置換しているのですが全て\n扱いになってしまいます。 ファイルの内容(5行) $aaa\n $bbb\n $ccc\n $ireru\n (ここに上記の書き込み形式) $ddd・・・ という感じで$***を1行ずつ入れてファイルに書き込みたいのですが、 普通なら5行で済むはずが、24行になってしまいます。 wでfopenしてdata="$aaa\n$bbb\n$ccc\n$ireru\n$ddd\n";でfputsしています。 もうちょっとでいけそうな気がするのですが、もうちょっとが分かりません。置換の設定に問題がありそうな気はするのですが・・・。 ご教授ください。

    • 締切済み
    • PHP
  • 関数(list)の戻り値を他の関数(base)の引数に渡したいんですが

    関数(list)の戻り値を他の関数(base)の引数に渡したいんですが、どうすればいいでしょうか? /****list.php****/ <?php function list($id){ // DB接続 open(); $sql = "SELECT * FROM table WHERE id = $id"; $result = mysql_query($sql); // 実行結果判定 if(!$result){ $res = 9; }else{ while ($row = mysql_fetch_assoc($result)){ $moji .= $row['name']; $moji .= $row['mail']; } echo $moji; $res = 0; } return $res; } ?> /****main.php****/ <?php ・ ・ list($id); ・ ↓$err_cdにlistの戻り値を入れ、$err_msgには戻り値が0なら「正常終了」,9なら「SQLエラー」などを入れるようにしたい。 base($err_cd,$err_msg); ・ ?>

    • ベストアンサー
    • PHP
  • 改行処理がうまくいきません

    今現在、PHPで掲示板を運用しています。 PHP初心者です。 掲示板で訪問者のユーザーのコメントを以下のように処理しています。 $post_arr[$h] = htmlspecialchars($post_arr[$h]); $post_arr[$h] = str_replace("\r\n", "\r", $post_arr[$h]); $post_arr[$h] = str_replace("\r", "\n", $post_arr[$h]); $post_arr[$h] = str_replace("\n", "<br>", $post_arr[$h]); 改行→<br>変換を行っているのですが、ごくたまに(特定の訪問者)改行処理がされず困っています。 これをcsvでログを保存しているのですが、<br>処理をされずデータがずれてしまいます。 ログを調べるとその訪問者の方は、古いものをお使いなのかなと思いましたが、WIN XP,IE6でしたので訪問者側に問題ないと思うのですが。 初心者で大変恐縮ですが、ご返答よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • 【PHP】 DB経由のプルダウンメニューに、DBの変更なしで追加させたい

    毎度毎度の質問失礼します。 今ではおかげ様で、PHPのプルダウンメニューをデータベースから取得し、作成できるようになりました。 今回は、そのプルダウンメニューの一番上に、「選択してください」といった項目を追加したいのです。 なるべく、既存のDBの内容を変更させずにこの変更を行いたいのです。 それとも、やはりDBを変更しない限りできないことなのでしょうか? 以下は既存のソース(PHPのみ)です。 ----------------------------------------------------- <?php //ファイルを読み込み require_once("bussys.php"); // クエリを送信する $sql = "SELECT * FROM scd ORDER BY scd"; $result = executeQuery($sql); //結果セットの行数を取得する $rows = mysql_num_rows($result); //表示するデータを、プルダウンメニューとして作成 $options=""; while($row = mysql_fetch_array($result,MYSQL_ASSOC)){ $options.="<option value='{$row['scd']}'>{$row['sname']}</option>\n"; } $select="<select name='hoge'>\n{$options}</select>\n"; print $select; //結果保持用メモリを開放 mysql_free_result($result); ?> ----------------------------------------------------- 質問ばかりで申し訳ございませんが、どうかよろしくお願いします。

    • ベストアンサー
    • PHP
  • CSVにエクスポートする保存する方法

    【やりたいこと】 MYSQLからSELECT文でデータを抽出して、それをPC(ローカル)に保存したいです。 保存ファイル名をデフォルト【今日の日付.CSV】 【不明点1】 データを抽出して、PCに保存はできるようになりましたが... ファイルのダウンロードダイアログの制御がよくわかりません。 【名前を付けて保存ダイアログ】 現在の表示内容 ファイル名がプログラム名(test.php) ファイルの種類(.phpドキュメント) 【不明点2】 テーブルの1部の項目にTEXTAREAの内容がそのまま入っています。 ダウンロード後、 それをエクセルで開くと非常に見づらいので 改行を<br>に変換して1行にしたらよいかなと思い 「nl2br」でやってみましたが「<br>改行」で表示されました。 <br>の1行にするにはどうしたらよいのでしょうか? 【test.php】 <? header("Content-Type: application/octet-stream"); header("Content-Disposition : attachment; filename=output_".date("Ymd").".csv"); //DB接続は省略 $sql = "select * from table; $result = mysql_query($sql); //項目名出力 for($i=0; $i < mysql_num_fields($result); $i++) { echo "\""; echo mb_convert_encoding(mysql_field_name($result, $i),"SJIS", "UTF-8")."\","; } //データ出力 echo "\r\n"; for($j=0; $j < mysql_num_rows($result); $j++) { for($k=0; $k < mysql_num_fields($result); $k++) { $str=mysql_result($result, $j, $k); echo "\""; echo mb_convert_encoding(nl2br($str), "SJIS", "UTF-8")."\","; } echo "\r\n"; } ?>

    • 締切済み
    • PHP
  • MYSQLにINSERTできません。

    見よう見まねでやっている超初心者です。 恥を忍んで質問させて頂きます。 古いPHP(2003年ごろ)関連書籍に下記のような include.phpファイルがあるのですが、DB接続失敗、クエリ発行エラー等の エラー表示は出ないのですが(65行目位の、管理者パスワードチェック : _chkPass)でパスワードがMYSQLにINSERTできません。 PHPバージョンの違いなのでしょうか(私のはPHPV5 XAMPPです。) 色々試したりMYSQLの確認をしたのですが、どこがイケないのか、 どこをどう直したらいいのか全く分かりません。 このプログラムに不具合は無いのか?あったとしたらどう直したら動くようになるのか? わかる方どうかご教授の程よろしくお願い致します。 具体的にご教授頂けると大変助かります。 <?php putenv("TZ=JST-9"); define( "_DB_SERVER", "localhost"); define( "_DB_NAME", "cgiweb" ); define( "_DB_UID", "root" ); define( "_DB_PASS", "" ); //--------------------------------------------------------- // DB接続 : _dbConnect //--------------------------------------------------------- function _dbConnect(){ //DB接続 $_conn = mysql_connect( _DB_SERVER, _DB_UID, _DB_PASS) or die('DB接続失敗 = ' . mysql_error()); //DB選択 mysql_select_db( _DB_NAME, $_conn) or die('DB選択失敗 = ' . mysql_error()); return( $_conn ); } //--------------------------------------------------------- // DB切断 : _dbDisconnect //--------------------------------------------------------- function _dbDisconnect( $_conn ){ //DB切断 mysql_close($_conn); } //--------------------------------------------------------- // クエリ発行 : _query //--------------------------------------------------------- function _query( $_conn, $_query ){ $_result=mysql_query($_query,$_conn) or die('クエリ発行エラー = ' .mysql_error()); return( $_result ); } //--------------------------------------------------------- // FETCH実行 : _fetchArray //--------------------------------------------------------- function _fetchArray( $_result ){ $_row = mysql_fetch_array($_result,MYSQL_ASSOC); return( $_row ); } //--------------------------------------------------------- // 結果セット開放 : _freeResult //--------------------------------------------------------- function _freeResult($_result){ mysql_free_result($_result); } //--------------------------------------------------------- // 管理者パスワードチェック : _chkPass // 引数:コネクション // チェック対象パスワード // 戻値:_OK or _NG //--------------------------------------------------------- function _chkPass( $_conn, $_input_pass ){ $_err_str = ""; if( ! $_input_pass ){ //パスワード未設定なら入力画面を表示 $_err_str = "パスワードを入力してください"; } else{ //パスワードがあるなら店舗マスタの内容と比較 $_result = _query( $_conn, "SELECT tenpo_pass FROM tenpo_mst" ); $_row = _fetchArray( $_result ); if( $_row ){ //レコードがあればチェック if( $_input_pass != $_row['tenpo_pass'] ){ //認証NGなので、入力画面を再表示 $_err_str = "パスワードが誤っています"; } }else{ //レコードがなければ入力されたパスワードでレコード作成 $_sql = ""; $_sql .= "INSERT INTO tenpo_mst ("; $_sql .= " tenpo_name,"; $_sql .= " tenpo_pass,"; $_sql .= " zei_kbn,"; $_sql .= " zeiritsu,"; $_sql .= " zei_kirisute_kbn,"; $_sql .= " order_status"; $_sql .= " ) VALUES ("; $_sql .= " '',"; $_sql .= " '" . addslashes($_input_pass) . "',"; $_sql .= " 2,"; $_sql .= " 0,"; $_sql .= " 0,"; $_sql .= " 0"; $_sql .= " )"; _query( $_conn, $_sql ); } _freeResult( $_result ); } //入力画面表示の場合 if( $_err_str != "" ){ echo "<HTML>\n"; echo "<HEAD>\n"; echo "<TITLE>管理者認証</TITLE>\n"; echo "</HEAD>\n"; echo "<BODY>\n"; echo "<CENTER>\n"; echo "<FONT COLOR=RED SIZE=5>管理者認証</FONT>\n"; echo "<HR>\n"; echo "${_err_str}<BR><BR>\n"; echo "<FORM ACTION=\"mnt_menu.php\" METHOD=\"POST\">\n"; echo "<FONT COLOR=RED SIZE=2>※記号を除く半角小文字8文字以内</FONT><BR>\n"; echo "パスワード:<INPUT TYPE=\"password\" NAME=\"post_pass\" MAXLENGTH=8>\n"; echo "<INPUT TYPE=\"submit\" VALUE=\"送信\">\n"; echo "</FORM>\n"; echo "<HR>\n"; echo "</CENTER>\n"; echo "</BODY>\n"; echo "</HTML>\n"; _dbDisconnect($_conn); exit; } } ?> 以下省略しました。

    • ベストアンサー
    • PHP