重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

phpスクリプト内でエラーチェックを行って、エラーが有れば、そのスクリプトでエラー表示し、
エラーが無く、結果を画面表示する場合は、そのまま画面表示、
エラーが無く、結果をCSV出力する場合は、別のスクリプトにリンクさせたいと思っています。
いろいろ考えた末、スクリプトを二重に記述する部分を少なくするため、php内で、Javascriptでリンクし、画面表示とCSV出力の部分だけを二重化するだけで済むのではないかと思いたちました。

呼出先のスクリプトにパラメタを渡したいのですが、下記のようにPOSTでやっても、location.hrefでGET渡しにしてもうまくいきません。
javascriptが実行されず無視された状態で、phpの以降の行が実行されてしまいます。

パラメタの無い場合は、location.href でリンクさせることは出来ており、出来上がったソースを見ても、問題は無いように見えるのですが、パラメタとして渡す文字の内容に問題があるのでしょうか?
-----------
★呼出元 [db_out.php]
 (前略) エラーチェック処理 SQL文生成処理
<?php
$sql="select * from mylib.mydata where myrows='%リベート%' and *********";
if ($_POST['csv'] == 1){
?>
<script type="text/javascript">
// location.href = "./db_out2.php?parm=<?php echo $sql; ?>";
var frm = document.createElement('form');
document.body.appendChild(frm);
var inp = document.createElement('input');
inp.setAttribute('type','hidden');
inp.setAttribute('name','parm');
inp.setAttribute('value',"<?php echo $sql; ?>");
frm.appendChild(input);
frm.setAttribute('action','./db_out2.php');
frm.setAttribute('method','post');
frm.submit();
</script>
<?php
(後略)画面表示処理
-----------
☆呼出先 [db_out2.php]
<?php
$sql = $_POST['parm'];
$down_file = date('Ymd').'.csv';
$rst = odbc_exec($cn,$sql) or die("SQLエラー\n".$sql);
$cnt = odbc_num_rows($rst);
while(odbc_fetch_row($rst)){
$i = 1;
for ($i=1; $i<=odbc_num_fields($rst); $i++) {
if ($i == 1) { $csv_data.= ","; }
$csv_data.= odbc_result($rst,$i);
}
$csv_data.= "\n";
}
}
header("Content-Type: application/octet-stream");
header("Content-Disposition: attachment; filename={$down_file}");
header("Content-Type: text/csv; charset=Shift_JIS ");
// データの出力
echo $csv_data;
odbc_close($cn);
?>
-----------
どうぞよろしくお願い申し上げます。

質問者からの補足コメント

  • urlencode($sql)でエンコード後にPOSTして、受け取った後にurldecode($sql)でデコードしたところ、なんとか動作しました。
    ただし、途中で画面表示中に途中でCSV出力をしても、元の画面がhtmlとして中途半端になってしまうためか、CSSで定義した内容が反映されないまま残ってしまい、不細工な出来具合になってしまいました。

      補足日時:2016/05/06 18:00
  • 上記を補足すると、元の画面でCSSを使って表示しているボタンがあるのですが、
    <style type="text/css"> CSSの定義
    <a href="...." class='mnu'>戻る</a> ボタンの表示
    <script type="text/javascript"> CSVを出力するためにPOSTするスクリプト
    の順番で書いているのに、スクリプトが動いた時、ボタンを装飾するCSSが効いていない状態になるのです。(IEだと出る現象。FFは問題なし)
    スクリプトを 下記のように囲ってみても、CSSだけは無視されます。質問の本題と外れてしまっていますが、これは致し方ないものでしょうか?
    window.onload = function(){ xxxxxxx; }

      補足日時:2016/05/06 18:50

A 回答 (2件)

いまいち何をしたいかわかりませんが


<?PHP
$sql="select * from mylib.mydata where myrows='%リベート%' and *********";
$href = "./db_out2.php?parm=".$sql;
?>
だとしたら明らかにパラメータへ渡す値が間違っていますよね?
たとえば
urlencode($sql)とかrawurlencode($sql)しないとURLのルールから逸脱してます。
で$sqlを別のページに渡して実行するってセキュリティを完全に無視してますがホント大丈夫?
    • good
    • 0
この回答へのお礼

ダメ出しを頂きまして有難うございます。

本来ならば、SQLを渡すつもりも無かったのですが、SQL自体をパラメタファイルから受け取って変数値に画面から入れた値を代入して生成して、という処理を行っているため、その部分を一元化したく、イントラ限定という前提つきでせめてPOST渡しで行おうとしたのですが....それ以前の知識不足でした。
でも、include化すれば済むようなことかもしれませんね。

アドバイス感謝致します。

お礼日時:2016/05/06 15:12

>スクリプトを 下記のように囲ってみても、CSSだけは無視されます



もう少しソースを絞ってテストしてみては?
どこかjavascriptがエラーになっているのかもしれないし
    • good
    • 0
この回答へのお礼

コメント有難うございます。
同じCSSだけを使った画面と、CSSを使わないScriptだけの場合は動作しているので、エラーは無いと思います。
付け焼刃で追加を重ねた汚いCSSなので、書き方が悪いのか、矛盾があるせいで、ロード時間が掛かって反映されないのではないかと疑っています。

お礼日時:2016/05/07 10:13

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!