ラベル PHP の投稿を表示しています。 すべての投稿を表示
ラベル PHP の投稿を表示しています。 すべての投稿を表示

2011年5月11日水曜日

iPohne用のHTMLで最初につまづいたところは、なんとラジオボタンです

iPhone用にhtml5とCSS3・PHP・MySQL等々でゲームらしきものを作っていたのですが、思わぬところでつまづいてしまいました。
 といいますのは、ラジオボタンそのものを大きくできないというところです。と、文章で書いてもいまいちイメージが浮かばないでしょうから、以下にラジオボタンの使用例を上げておきます。パソコンでマウスを使用するなら何ら問題がないのですが。


ラジオボタン使用例:
  
  


 iPhoneでの操作はタッチスクリーンを使用しますが、ラジオボタンで選択する部分が指で強く触っても中々認識しません。そこでラジオボタン部分のサイズを2本の指で大きくしてからですと認識します。これではせっかくの流れが止まってしまってまったくゲームらしくないのです。普通のsubmitボタン部分はすぐに反応するのですが。

 そこで、ラジオボタンを最初から大きくして置く方法を探しましたが、文字の部分は大きくすることができるのですが、肝心な○の部分をどうしても大きくできません。CSSだけではどうしても無理なようなのでJavaScriptやJQueryも調査して見ましたが、どこにも見あたりません。いやー困りましたな。どうしようかと真剣に悩んでいます。これでまた頭頂部が薄くなってしまった。

 ラジオボタンに替わる方法に変更するしかないのかな、では何を用いればいいのだろうか。私の乏しい知識で思い浮かぶのはsubmitボタンを2つ用意するということですが、ではどちらのボタンが押されたかをどうやって認識すればいいのかということであります。以前にどこかに隠し文字列を持たせてURL文字列につけて飛ばすなんてのを見たような気もするのですが。そうなるとプログラム自体を改造しなければならず、これはこれでやっかいであります。どうにかならないかなラジオボタン

まさかこんなところで躓くとは夢にも思っていませんでした。

ダレカ タジゲデー!!

2011年4月15日金曜日

PHP 空文字判定とnull値判定で大きな誤りを犯していた。empty()とis_null()

 一度ぐらい動作したからといってそれで慢心していてはいけませんね。今朝なにげに先日作成したばかりの自動車試験問題を触っていたら、標識の無い問題でも、その前の問題で表示されていた標識が引き続き表示されるというエラーを発見した。変数が初期化されていないということに気づいた。それでその判断をしている部分がDBのnull値もしくは、空文字列の判断がPHPとしてはまったくのデタラメをやっていることを発見した。さっそく調べてみると・・・・
              ↓これ大嘘^^;
       if( $imgurl=="" or $imgurl == null){}

       ↓どうやらこれが正しいようです。
       if( empty($imgurl) or is_null($imgurl)){}

 おかげでまたひとつ賢くなった。かな?

2011年4月13日水曜日

PHP MySQL JavaScript Jq HTML5 CSS3 混沌としていて頭のなかで繋がってこない

 昨日これまで作成していたWebアプリが完成した。いや完成したことにした。HTML部分のJavaScriptとCSS3部分は以前に学習のために作成しておいた部分を流用した。PHPとMySQLの部分は付け焼き刃で関連するサイトを調べまくりほとんどパクって稼働まで漕ぎ着けた。
 ひとつのアプリを作るのにPHP MySQL JavaScript Jquery HTML5 CSS3これだけのものを使わなくてはいけない時代になったのかと思う。どれも私は中途半端にしか理解していないので、全体を俯瞰してみるとまったく繋がってこないのであります。全部をPHPでやらなくてもJavaScriptで十分な部分もあるだろうし、Jqueryを使えばもっと格好良くできるだろうと思える部分もかなりあるのだが、全部がバラバラの状態で全体が繋がってこないのです。ま、どっちにしても年寄りの冷や水的なプログラムだからしょうがないのだけども。
 ソースを公開するのは、自分のバカさ加減がバレるようで結構恥ずかしいのですが、管理部分を除いた表示部分を一応公開してみるか。これで動作することはしているのですが、どこかに欠陥があったら教えて欲しいです。

 ソースをアップしてから気づいたのですが、DBの接続部分が3回もあります。プログラム的にはかなり饒舌だと思います。これを1回にまとめて関数化して、引数を渡し条件分岐するのが正しいと思う。なにせこれまではエラーなく動作させることばかり考えてきたので、動くなら、何度でも書けばいいやって、まったく余裕のないことをやっていましたので。少し余裕がでてきました。

 因みにDB接続部分だけを関数化して必要な場合だけ呼び出すようにしてみたけど、何故か動作しなかったのであります。なんでかというのを追求しないまま、それぞれの関数の部分に接続文字列をコピペしてしまいました。

実物はこちらにあります。挑戦!一発免許学科試験問題
なぜか、IEで見ると右側に寄ってしまいます。たぶんCSS3を変更しないとダメだと思います。今のところIE以外のブラウザーで見てください(そんなWEBアプリありかよ^^;)HTML5とCSS3で作成していますので、お!っていう部分があると思います。IEはほとんど対応していません。これからIE対応をしなければいけないのですが、気が重いな。やりたくないな。IE捨てちゃおうかな。別にオレ困らないもんね。IEなんか使っているのが悪いのだから。

<?php
/*****************************************************/
/*       学科問題出題システム                        */
/*****************************************************/

 session_name('hogehoge');
 session_cache_expire(90);
 session_start();


//システム全体の制御
    if ($_SESSION[ "btn_caption" ] == "次の問題" or $_SESSION[ "btn_caption" ] == "") {
        making_question();     //新規問題作成へ
    } elseif($_SESSION[ "btn_caption" ] == "答え") {
        answer();     //答えあわせへ
    }

/*****************************************************/
/*       答えの正誤判断する                          */
/*****************************************************/
    function answer(){
    global $radio1,$radio2,$kaitou,$kaisetu,$ketuka;
    global $div_kaitou,$div_kaisetu,$div_ketuka,$end_div;

            $_SESSION[ "btn_caption" ] = "次の問題";
            $radio1 = "";      //ラジオボタンを表示しない
            $radio2 = "";      //ラジオボタンを表示しない

            //正誤判定及びメッセージ作成
            if($_REQUEST["seigo"] == 0){
                 $answer2 = "あなたは上記の問題を○と答えましたが、";
            }else{
                 $answer2 = "あなたは上記の問題を×と答えましたが、";
            }

            if ($_REQUEST["seigo"] == $_SESSION[ "seikai" ]){
                $answer = "おめでとうございます。それは<strong><span style='color: red; font-size: 20pt'>正解</span></strong>です。";
                $_SESSION[ "seikaisu" ]++;
            }else{
                $answer = "残念ですが、それは<strong><span style='color: red; font-size: 20pt'>間違い</span></strong>です。";
            }
            $kaitou = $answer2 . $answer;
            $kaisetu = $_SESSION[ "kaisetu" ];

           //---------------これまでの成績を計算する------------------------------
            $ritu = round($_SESSION[ "seikaisu" ] / $_SESSION[ "count"] * 100,1);
            if ($ritu >= 90) {
                $msg = "<strong><span style='color: yellow; font-size: 17pt'>合格圏内です。この実力をキープしてください。</span></strong>";
            } elseif ($ritu >= 80) {
                $msg = "<strong><span style='color: yellow; font-size: 17pt'>あと1歩です。90%を目指してより一層磨きを掛けてください。</span></strong>";
            } else {
                $msg = "<strong><span style='color: yellow; font-size: 17pt'>もう少しがんばりましょう!。</span></strong>";
            }

            $ketuka = "これまでの<strong><span style='color: red; font-size: 20pt'>正解数は" .$_SESSION[ "count"] ."問中". $_SESSION[ "seikaisu" ]. "問</span></strong>です。<strong><span style='color: red; font-size: 20pt'>正解率は" . $ritu . "%</span></strong>です。<br />" . $msg;

         $div_kaitou = '<div id="kaitou">';
         $div_kaisetu = '<div id="kaisetu">';
         $div_ketuka = '<div id="ketuka">';
         $end_div = "</div>";

            update_go();    //間違った答えをdbに記録する
    }

/*****************************************************/
/*       新しい問題を作る                            */
/*****************************************************/
    function making_question(){
    global $radio1,$radio2,$kaitou,$kaisetu,$ketuka;
    global $div_kaitou,$div_kaisetu,$div_ketuka,$end_div;

           $dbname = "hogehoe";
           $hostname = "mysq5879.db.sakura.ne.jp";
           $userid = "nantara";
           $passwd = "kantara";

          if(!$con=mysql_connect($hostname,$userid,$passwd)){
               print "データベースに接続できません". mysql_error() . "<br />\n";
               exit;
          } else {
               mysql_query("SET NAMES utf8");    //文字化け対策
          }

         mysql_select_db($dbname,$con);

        //問題の総件数を求めます。
        $sql="SELECT * FROM mondai";
        $rst = mysql_query($sql,$con);
        $maxdeta=mysql_num_rows($rst);
        //乱数を発生させます。
        $rand = mt_rand(1, $maxdeta);
        //乱数で得た問題をひとつだけ選択して表示します。
        $sql="SELECT * FROM mondai where id = ".$rand;
        $rst = mysql_query($sql,$con);
 
       if($rst==False){
         print "レコードセット収得に失敗しました。";
         exit;
        }

        $col = mysql_fetch_array($rst);

        $_SESSION[ "id" ] = $col{"id"};
        $_SESSION[ "mondai" ] = $col{"mondai"};
        $_SESSION[ "kaisetu" ] = $col{"kaisetu"};
        $_SESSION[ "seikai" ] = $col{"seikai"};
//        $_SESSION[ "imgurl" ] = $col{"imgurl"};
        $imgurl = $col{"imgurl"};

        if(!$col{"imgurl"} == ""){
           $_SESSION[ "imgurl" ] = '<img src="http://hogehoge.jp/images/' .$col{"imgurl"}. '" />';
        }

        $_SESSION[ "access" ] = $col{"access"}; //アクセス数を求める
        $_SESSION[ "go" ] = $col{"go"};         //間違いの数を求める
        $_SESSION[ "btn_caption" ] = "答え";

        $access = $_SESSION[ "access" ]+1;
        $id = $_SESSION[ "id" ];
        $sql = "UPDATE crowner.mondai SET access = '$access' WHERE id= '$id'";
        $rst = mysql_query($sql,$con);
        if($rst==False){
           print "レコードセット収得に失敗しました。". mysql_error();
           exit;
        }

       mysql_free_result($rst);   //レコードセットの解放
       $con = mysql_close($con);  //データベースの切断
       $_SESSION[ "count" ]++;
       $kaisetu = ""; $kaitou = ""; $ketuka = ""; //コメントを初期化(空に)する。

         $div_kaitou = "";
         $div_kaisetu = "";
         $div_ketuka = "";
         $end_div = "";
       $radio1 = '<input type="radio" name="seigo" value="0" checked />  <strong>正</strong> ';
       $radio2 = '<input type="radio" name="seigo" value="1" />  <strong>誤</strong> ';
    }

/*****************************************************/
/*       間違った問題に+1をつける                  */
/*****************************************************/
    function update_go(){
           $dbname = "hogehoe";
           $hostname = "mysq5879.db.sakura.ne.jp";
           $userid = "nantara";
           $passwd = "kantara";

            if(!$con=mysql_connect($hostname,$userid,$passwd)){
                 print "データベースに接続できません". mysql_error() . "<br />\n";
                 exit;
            } else {
                 mysql_query("SET NAMES utf8");
            }
          mysql_select_db($dbname,$con); //データベースの選択 ☆この一文は必要です。ここを試しに削除したらエラーになった。


        $go = $_SESSION[ "go" ]+1;
        $id = $_SESSION[ "id" ];
        $sql = "UPDATE crowner.mondai SET go = '$go' WHERE id= '$id'";
        $rst = mysql_query($sql,$con);
       if($rst==False){
         print "レコードセット収得に失敗しました。". mysql_error();
         exit;
        }

       mysql_free_result($rst);   //レコードセットの解放
       $con = mysql_close($con);  //データベースの切断
    }
?>

<!--*****************************************************/
/*          HTMLの表示                              */
/*****************************************************-->

<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="utf-8">
    <title>挑戦一発自動車免許!学科問題</title>
    <!-- The below script Makes IE understand the new html5 tags are there and applies our CSS to it -->
    <!--[if IE]>
    <script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script>
    <![endif]-->
    <link rel="stylesheet" href="test.css" />
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

    <!--jquery関連呼出-->
    <script type="text/javascript" src="http://www.google.com/jsapi"></script>
    <script type="text/javascript">google.load("jquery", "1.4");</script>

    <!--twitter呼出関連-->
    <script type="text/javascript" src="http://widgets.twimg.com/j/2/widget.js"></script> 

    <!--基本的なJsを呼び込む-->
        <script src="./kihon.js"></script>

  </head>

  <body>
    <header>
      <hgroup>
        <h1>挑戦一発自動車免許!学科問題</h1>
<!--        <h2>Media Literacy 2010, Crowner.Co.LTD</h2> -->
      </hgroup>
        <script src="./header.js"></script>
    </header>

    <section>
      <article>

    <h2>第<?= $_SESSION[ "count" ] ?>問目</h2>

         <div id="mondai">
            <h3 id="no"> NO.</h3>
            <?= $_SESSION[ "imgurl" ] ?>
            <div id="toi">
                <?= $_SESSION[ "mondai" ] ?>
            </div>
         </div>

         <?= $div_kaitou ?>
             <?= $kaitou ?>
         <?= $end_div ?>

         <?= $div_kaisetu ?>
             <?= $kaisetu ?>
         <?= $end_div ?>

         <?= $div_ketuka ?>
             <?= $ketuka ?>
         <?= $end_div ?>
<div id="frm">
    <form method="POST" action=<? $_SERVER[ "PHP_SELF" ] ?>>
          <?= $radio1 ?>
          <?= $radio2 ?>
        <br />
        <input type = "submit" name = "btn" value=<?= $_SESSION[ "btn_caption" ] ?>>
    </form>
</ div>
      </article>

      <article>
        <script src="./center.js"></script>
      </article>
    </section>
    <nav id="left_nav">

        <script src="./testnavi.js"></script>
    </nav>
    <footer>
        <script src="./footer.js"></script>
    </footer>
  </body>
</html>

2011年4月12日火曜日

PHP セッション変数をグローバル変数として使ったら 見事に失敗した。とほほ

 昨日はのんびりとセッション変数をglobal変数に戻す作業をやり、見事に動作するようになった。ひとつ賢くなりました。関数の中から複数の変数を取り出すということをまだ理解していないことから始まったことなのですが、return で複数の戻り値を得る場合は配列に入れて取り出せばいいのかも知れない。今回は問題解決したから試そうとは思わないけれども。
 もう一つはセッションPHPのセッション(SESSION)の概念を理解していなかったのに起因しています。今でもあんまし理解していないのですが、これはじっくりと取り組まなければと思っていますが、喉元過ぎればなんとやらで、本気でセッション(SESSION)の学習なんてやるのか。結構アヤシイものがある。

2011年4月11日月曜日

PHP セッション変数をグローバル変数として使ったら 見事に失敗した。とほほ

 セッション変数をグローバル変数として使うのは見事に失敗しました。うまく値を渡せなかったのであります。そこであらためてグローバル変数の使い方を調べてみて、最初に自分でやっていた使い方が正しかったということがわかりました。セッション変数はあくまでもセッション変数として使用すべきでありました。成功していたらなんの問題も無くなったのですが、世の中そんなに甘くはないですね。(泣き)
わかりやすいグローバル変数の使い方が出ているサイトはここです。
PHP:変数のスコープ:グローバル変数を使う際の注意点:global他にもあるのでしょうけれども、最初に検索したこのサイトで問題が解決したので、今のところはこのサイトがベストアンサーサイトですね。
これ引用です。
PHPでは、グローバル変数は、関数の内部で使用する場合、関数の内部でグローバルとして宣言する必要があります。
当初これを知らなかったので、関数内部で変数宣言をするのはおかしいので、ルート上?プログラムの一番最初に全部のグローバル変数の宣言をしてしまったほうが合理的だろうと考えたのですが、PHPにおいてはこれが間違いだったようであります。

以下はダメな例
<?php
$a = 1; /* グローバルスコープ */ 
function Test() { 
   echo $a; /* ローカルスコープ変数の参照 */ 
} 
Test();
?> 
以下が正しい例
<?php
$a = 1;
$b = 2;

function Sum() 
{
   global $a, $b;

   $b = $a + $b;
} 

Sum();
echo $b;
?> 

そして私がやった失敗例
<?php
//↓関数内でいちいち変数宣言するのが面倒なので、ここで宣言してしまう。
   global $a, $b;
//エラーにはならないけど変数には値が入らない。
$a = 1;
$b = 2;

function Sum() 
{

   $b = $a + $b;
} 

Sum();
echo $b;
?> 
ということで、本日は元に戻す作業をやりたいと思います。
「履歴は取ってなかったのか?!」と突っ込みをいれられそうですが、「はい、舐めておりました。履歴を取るほどではないと思いこんでいたのであります。」ということで、全部問題なく稼働させるには今日一日はかかるかも知れません。履歴は取っておくべきだったのですが、何しろウン十年ぶりのプログラミングなので、本当は履歴を取るということ自体も忘れていたというのが正直なところであります。いやはやです。

2011年4月9日土曜日

PHP セッション変数をグローバル変数として使ったら

 どうもPHPの変数の振る舞いがいまいちわからずに悩んでいます。PHPでは変数宣言をしなくてはいいらしい。でもグローバル変数の場合は以下のように宣言するというのを知った。これを一番先頭でやったら、自分で作った関数側ではどうも見えないようなのだ。それでそれぞれの関数の中で宣言してやると見えるのだ。ということは、これらの変数を使う関数が10個あればそれぞれの関数の中で10回も宣言しなければならない。これって絶対におかしい。おかしいけれどもそうなのだからしょうがない、私の使い方がおかしいのだろうか。
global $radio1;
        global $radio2;
        global $answer;
 そこで思いついたのはセッション変数である。以下のように別に変数宣言などしなくても、その場で代入してやれば、それだけでどの場所でも使えるのである。グローバル変数でやろうとしていることを全部セッション変数に置き換えたらどこかに不都合が生じるのだろうか。正しい変数の使い方ってどっちを採用すべきなのだろうか。
    $_SESSION[ "id" ] = $col{"id"};
        $_SESSION[ "mondai" ] = $col{"mondai"};
        $_SESSION[ "kaisetu" ] = $col{"kaisetu"};
        $_SESSION[ "seikai" ] = $col{"seikai"};
      ↓これは普通の変数
        $imgurl = $col{"imgurl"};
 かなり悩むところだが、明日は全部をセッション変数でやってみようと思う。駄目だったら元に戻せばいいのだから。なんかオレとんでもなく大きな間違いを犯しそうになっているのかな。わからん

2011年3月10日木曜日

utf8からMySQLへ 文字コードの違いか?文字がバケバケだ。

 昨日まではテーブルを作成したり、削除したりの最初の準備処理を一応終了した。画面周りなどはまったく考えていない。一連の処理ができるかできないかだけ検証できるかだけの話であります。それで出来上がったテーブルに文字を入れてみた。
 その結果、かなりの文字化けがあることを発見した。たぶんそんなことじゃないかなと最初から懸念するところがあったのです。これからのWEBアプリは全てHTML5で作成することにしている。HTML5の文字コードはutf-8と決められているのです。MySQLの文字コードは確かEUCだったと思います。以前にデータベースがらみのWEBアプリを作成したときはHTML側の文字コードはEUCでしたから、何ら文字化けすることもなくすんなりいったので問題にならなかった。
 まだ、調査をしていないので、その解決策は今のところまったくないのであります。どうしょう。

 少し調査したら、MySQL側がEUCではなくて、サーバー側のPHPがEUCになっているみたいです。”原因はサーバで扱うPHPの内部処理の文字コードが、元々EUCをベースである事に起因している様です。”となってました。もっと調査してみたら、最初に私が疑ったMySQL側もEUCのようであります。これは益々問題が深みにはまっていきそうだ。
 やはり同じ現象で悩んでいる人は多いのですね。また試していませんが、メモ代わりに

PHP+MySQL+UTF-8で文字化け対策

 以前に書いた問題で、オートナンバーの設定ってのがありましたがこれもすんなり解決しました。テーブルを作成する時に " id int unsigned not null auto_increment primary key,"このように設定すればなんら問題ないです。データを入れる時はこのidを無視してやれば、自動で連番が降られます。

2011年3月9日水曜日

PHP MySQLでウン十年ぶりのプログラミング

 かなり長い間触っていなかったので、基本的な書き方すら忘れていました。一番心配だったのがデータベースとの接続部分であります。私が使っているのはさくらのレンタルサーバーです。ここでMySQLと接続できるかどうかということが大問題であったわけであります。昨日の午前中はその調査に追われましたが、接続文字列を推測しながら試してみたら、奇跡的に1回のテストで成功しました。とにかくDBと繋がってくれさえすれば、後はなんとかなると思っていたので大満足であります。
 次にさくらレンタルサーバーについているphpMyAdminというツールを使ってhogehogeというテーブルを作成しまして、このテーブルを削除するという処理を書いてみました。
 後はなんとかなると思っていたのとは、逆でなかなか削除してくれません。以下のコードは成功したコードです。で、何が悪いのかわからなかったのでエラーコードを吐き出させるように書き直して実行させると、"No database selected"という文字列が出てきました。これでは何がなんだかさっぱりわかりません。そこでダメモトということで"No database selected"そのものをグーグルで検索してみましたら一発で原因がわかりました。ホントにグーグルには感謝感謝であります。ネットがこれほど発達してない以前でしたら、このエラーを解明するだけでまる1日は費やしていたのではないかと思います。
$str_sql = "DROP TABLE IF EXISTS hogehoge";これがエラーになっていた、で訂正したのが下です。
$str_sql = "DROP TABLE IF EXISTS test.hogehoge";
テーブル名hogehogeの前にデータベース名testをつけなければいけない見たいです。

以下のコードが昨日の収穫であります。

<?php
//テーブル削除
$hostname = "mysq3897.db.sakura.ne.jp";
$userid = "uron";
$passwd = "*******";

//データベース接続
if(!$con=mysql_connect($hostname,$userid,$passwd)){
print "データベースに接続できません". mysql_error() . "
\n";
} else {
print "データベースに接続しました
\n";
}

//テーブル削除
$str_sql = "DROP TABLE IF EXISTS test.hogehoge";
$result = mysql_query($str_sql, $con);

if( !$result ) {
print "エラー内容" . mysql_error() . "
\n";
} else {
print "mondaiテーブルを削除しました。
\n";
}

//データベースサーバへの接続の切断
mysql_close($con);