CAKEPHP入門3 データベース

データベース

mySQLを利用する。
「app」「config」にあるdatabase.phpをまず修正します。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class DATABASE_CONFIG {

var $default = array(
'driver' => 'mysql',
'persistent' => false,
'host' => 'localhost',
'port' => '',
'login' => '',
'password' => '',
'database' => 'mydata',
'prefix' => '',
'schema'=>'',
'encoding'=>'UTF-8'
);

var $test = array(
'driver' => 'mysql',
'persistent' => false,
'host' => 'localhost',
'login' => 'user',
'password' => 'password',
'database' => 'test_database_name',
'prefix' => '',
);
}

port,login,passwordはサーバー任意のモノを入力してください。

まずはモデルを作成します。
「app」「models」のフォルダの中にファイルを作ります。

1
2
3
4
5
6
7
8
9
10
11
<?php

class Board extends AppModel{
   
    var $name='Board';
   
   
}


?>

作成するファイル名は使用するデータベースのテーブル名と同じものにします。

次にコントローラ

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php

 class BoardsController extends AppController{
     
     public $name = 'Boards';
     
     function index(){
         
         $data = $this->Board->find('all');
         $this -> set('data',$data);
         
     }
 }
 ?>

モデルのメソッドを呼び出し($name)、ビュー渡しています。(set)
モデルはコントローラの中ではメンバ変数として利用することができます。今回は「$this->Board」の形で利用しています。「find」はモデルクラスのメソッドになります。

最後にビューです。

1
2
3
4
5
6
7
8
9
10
11
12
13
<body>
<h1> 送信フォームサンプル</h1>

<table>
<?php

  for($i =0 ; $i<count($data); $i++){
     
     echo $html->tableCells($data[$i]['Board'],array(),array().true);
  }
 
?>
</table>

コントローラから受け取った「$data」を使っています。
HTMLヘルパーを使っています。

おまけ

scaffoldを使えば、モデルとビューなしでデータベース管理するためのシステムを自動生成してくれます。

1
2
3
4
5
6
7
8
9
10
<?php

 class BoardsController extends AppController{
     
     public $name = 'Boards';
     public $scaffold;
     
   
 }
 ?>

データベースの操作

レコードの追加

コントローラ

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?php

 class BoardsController extends AppController{
     
     public $name = 'Boards';
     
     function index(){
         
         $data = $this->Board->find('all');
         $this->set('data',$data);
         
     }
     
     function addRecord(){
         
         if(!empty($this->data)){
             
             $this->Board->save($this->data);
         }
         
         $this->redirect('.');
     }
     
   
}
?>

ビュー

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?php

 echo $form->create(null,array('type'=>'posr','action'=>'./addRecord'));
 echo $form->text("Board.name");
 echo $form->text("Board.title");
 echo $form->textarea("Board.content");
 echo $form->submit("送信");
 echo $form->end();
 
 ?>
 
 <br/>
 <hr />
 <br/>
 
<table>
 <?php
 
  for($i=0;$i < count($data);$i++){
     
      echo $html->tableCells($data[$i]['Board'],array(),array(),true);   
 
 
  }
 
  ?>
 
  </table>

レコードの検索

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?php

 class BoardsController extends AppController{
     
     public $name = 'Boards';
     
     function index(){
         
         $data=null;
         if(!empty($this->data)){
             $data = $this->Board->find('all',array('conditions' =>
             array('Board.id' => $this->data['Board']['id'])));
         }else{
             $data=$this->Board->find('all');
             
         }
         
         
         $this->set('data',$data);
     }
 }
 
         
         
   

?>

大きくはコントローラーが変わっています。
find(第一引数、第二引数)

  • 第一引数:all,first,list,countなど。
  • 第二引数:連想配列でまとめたもの。今回はconditionsは条件を設定しています。入力されたBoard.idに対して等しい値をdata['Board']['id']からの抽出しています。
カテゴリー: プログラミング, 未分類 | コメントをどうぞ

CAKEPHP入門2

ビューは「app」「views」
コントロールは「app」「controllers」

フォーム

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<?php

class HelloController extends AppController{
   
    public $name='Hello';
    public $uses = null;
    public $layout = "hello";
   
   
    function index(){}
   
    function sendForm(){
       
       
        $str = $this->params['url']['text1'];
        $result = "";
        if($str != ""){
           
            $result = "you type:".$str;
        }else{
           
            $result = "empty.";
        }
       
        $this->set("result",$result);
    }
   
}
?>

$str = $this->params['url']['text1'];では各種情報を管理するparamsを使っています。

  • controller:コントローラー名
  • action:アクション名
  • named:パラメータ
  • form:POST時のフォームの内容
  • url:GET時のフォームの内容
  • date:ヘルパーに生成された要素

今回は「url」を使ってGETで送信されたフォームの内容を取得しています。



$this->set(“result”,$result);では先ほど取得した変数をビューに渡しています。

セキュリティ

1
2
3
4
5
        App::import('Sanitize');

              ..........................

        $this->set("result",Sanitize::stripAll($result));

CAKEphpのライブラリである。Sanitizeクラスを使います。
今回はstripAllを使いましたが、の他stripScriptやstripImageなどがあります。

Formヘルパーを使う

ここまではビューテンプレートに直接フォームを記述していましたが、Cakephpにはタグを自動生成する「Fromヘルパー」という機能があります。

1
2
3
4
<?php echo $form->create(null,array('type'=>'post','action'=>'.')); ?>
<?php echo $form->text("HelloForm.text1"); ?>
<?php echo $form->submit("送信"); ?>
<?php echo $form->end(); ?>

最初にcreate()、最後にend()をつける。実際の記述は$formで行います。


のようです。

$formの()の中は(名前、属性指定)

カテゴリー: プログラミング, 未分類 | コメントをどうぞ

CAKEPHP入門

この本を使って勉強しています。其のメモです。

CakePHP 1.3によるWebアプリケーション開発―オープンソース徹底活用
掌田 津耶乃
秀和システム
売り上げランキング: 12574

「app」内にある「webroot」に保存した者が最初に表示されている。

「app」内の「components」にphpファイルを置く

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php

class HelloController extends AppController{
   
    public $name='hello';
    public $uses = null;
    public $autoRender = false;
   
   
    function index(){
       
        echo "hello hoge hoge";
       
    }
function other(){
       
        echo "これはインデックス以外が表示されています。";
    }
}

?>
  • public $name=’hello’;はコントローラーの名前を示しています。
  • public $uses = null; はコントローラ内で使用するモデルを示しています。今回はモデルを使ってないのでnullが指定されています。
  • public $autoRender = false; はビュー関係のオブジェクトを使って自動的にページをレンダリングする機能の設定を$autoRenderで設定しています。

function index()の所でディフォルトのページの処理を行います。
function other()は ..hello/otherでアクセスできるようになっています。この「other」は一般にアクションと言われています。

ビューを作る

ページの表示はコントローラーではなく、ビューが行うものです。
ビューには「ビューテンプレート」と「レイアウト」の2つが存在します。「レイアウトを用意して、その中にビューテンプレートをはめ込んでいきます」

「app」→「views」に新しくフォルダを作り、テンプレート「index.ctp」を作成する。

1
2
3
4
5
6
7
8
9
10
11
12
13
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>HELLO PAGE</title>
</head>

<body>
<h1>テストページ</h1>
<p>これはテストページです。ビューのテストです。繰り返す。</p>

</body>
</html>

「app」内の「components」にphpファイルを書き換える。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php

class HelloController extends AppController{
   
    public $name='hello';
    public $uses = null;
    public $autoLayout = false; //trueにすると用意されたlayoutを使ってページをレイアウトします。
    public $autoRender = true;
   
   
    function index(){}
   

   
}

?>

結果

「index.ctp」のなかにphpを書いても実行されます。

レイアウトの作成

public $autoLayout = true;にすると用意されたlayoutを使ってページをレイアウトします。
ディフォルトのレイアウトが表示されます。

ディフォルトレイアウトのファイルはどこにあるかというと「…./cake/libs/view/layouts/default.ctp」にあります。
これまではすべて「app」の中にあったのですが、レイアウトは「cake」の中にあります。

では作成してみましょう。

新規で作ったレイアウトは「app」=> 「view」=>「layout」に保管します。(ディフォルトとは場所が違うので注意)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>



<?php echo $html->charset(); ?>


<title>

<?php echo $title_for_layout; ?>

</title>
<?php
  echo $html->css('cake.hello');
  echo $scripts_for_layout;
 
  ?>
 

</head>

<body>

<div id="container">
<div id="header"> ** Header**</div>
<div id="content">

<?php echo $content_for_layout; ?>
</div>


<div id="footer"> **this is test** </div>

</body>
</html>

charset(); ?>はを表示しています。
はコントロールクラス内の$this->pageTitleが表示されます。
echo $html->css(‘cake.hello’);は外部からCSSを指定してます。「webroot」「css」のなかにある。








レイアウトで使用するCSSは「app」「webroot」「css」というフォルダの中に保管します。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
@charset "UTF-8";
/* CSS Document */

body{
   
    background:#00ffff;
    color:#660000;
    margin:0;
}

#header{
   
    font-size:14px;
    font-weight:bold;
}

#content{
   
    background:#9F9;
    color:#990000;
    padding:10px 10px 40px 20px;
}

#footer{
   
    text-align:right;
   
}

あとコントローラーも変更

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php

class HelloController extends AppController{
   
    public $name='Hello';
    public $uses = null;
    public $layout = "hello";
   
   
    function index(){}
   
}

?>

public $layout = “hello”; 「layout」内のhello.ctpをレイアウトで使うとしていしています。

カテゴリー: プログラミング | コメントをどうぞ

【PHP】RSSを取得する&データベースを使う【メモ】

PHPをお盆休みに触ってました。
まずはRSSを取得する際に2つの方法が見つけました。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php  
  $rssurl = <em>RSSのURL</em>;
  $rssdata = simplexml_load_file($rssurl);
  $num_of_data = 5;
  $outdata = "";
  for ($i=0; $i<$num_of_data; $i++){
      $outdata .= "<li>";
      $outdata .= "<a href=\"";
      $outdata .= $rssdata->item[$i]->link;
      $outdata .= "\">";
      $outdata .= $rssdata->item[$i]->title;
      $outdata .= "</a></li>";
  }

      echo $outdata;

?>

1
2
3
4
5
6
7
8
9
10
11
      $rss = simplexml_load_file("rssのurl");
      foreach ($rss->item as $item) {
     

           $dc = $item->children('http://purl.org/dc/elements/1.1/');
           $link = $item->link;
           $title = $item->title;
           echo "<li><a href=\"$link\" title=\"$title\">$title</a></li>\n";
      }

?>

データベースに連動する際の方法

1
2
3
4
5
6
7
8
9
10
11
12
$db_handle = new PDO(host,user,Pass);
$sample_sql = 'SELECT * FROM members';

$st_handle = $db_handle->prepare($sample_sql);
$st_handle->execute();



while ($row = $st_handle->fetch(PDO::FETCH_ASSOC)){
   
    echo $row['id'].','.$row['name'].'<br/>';
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
$dBServer = ' ';
$dbUser = ' ';
$dbPass = ' ';
$dbName = ' '';


$flag = TRUE;

if(!$link = mysql_connect($dBServer,$dbUser,$dbPass)){
   
    $flag = FALSE;
   
}

else if(!mysql_select_db($dbName,$link)){
   
    $flag = FALSE;
}

else if(!mysql_set_charset('
utf8',$link)){
   
    $flag = FALSE;
   
}




if($flag=TRUE){
   
    $sql = sprintf("SELECT * FROM members " );
   
   
   
    $query = mysql_query($sql,$link);
   
     while($row1 = mysql_fetch_object($query)){
         
         echo h($row1->id).'
:'.h($row1->name).'<br/>';
         
     }
     
     
}else{
   
    echo '
データベースエラー';
}
カテゴリー: プログラミング | コメントをどうぞ

メール PHP  正規表現

最近PHPを再度やってるんですが、メールフォームの正規表現についてのメモ

_

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
if(isset($_POST['mail'])){
    $mail = $_POST['mail'];
    $pattan = '/^([a-zA-Z0-9])+([a-zA-Z0-9\._-])*@([a-zA-Z0-9_-])+([a-zA-Z0-9\._-]+)+$/';
   
    if(preg_match($pattan,$mail)){
       
        echo '<p>正しいメールアドレスです</p>';
        echo h($mail);
       
    }else{
       
         
       
        echo '<p>['.h($mail).'」は正しい形式ではありません</p>';
    }
}
カテゴリー: プログラミング | コメントをどうぞ