行政書士さんがWordPressでサイトを作成です。

one-by-one

綿谷行政書士事務所の綿谷俊彦さんがWordPressを使用してオリジナルホームページを立ち上げました。

“行政書士さんがWordPressでサイトを作成です。” の続きを読む

データベース接続エラー

突然複数のWordPressサイトが表示できなくなり、うわーどうしたんだとパニック状態になりました!!

よーくよく思い出してみると、データベースパスワードを不用意に変更した結果(必要桁数が増えた為)、このデータベース使用のブログ全てがエラーに!

さらにどういう訳か「PhpMyAdmin」もエラーで起動できない状態に-_-)”

動転した心理状態でwp-config.phpのパスワードを変更。

これが失敗の元凶でした。

6つのブログのうち4つ迄は正常に変更完了。そして、

翌日なぜか「PhpMyAdmin」も自然復旧。何故???

ところが2つのブログが相変わらず表示されない状態が続いていました。

やっと休日になり、落ち着いた気持ちでwp-config.phpを見直すと、何と半角文字列の中に全角の「’」が、、、、、、

なんと言うミス、、、、、でした。

無事修理完了です(^_^)

 

僕の勉強法

さて皆さんプログラムの勉強しませんか?
では現在僕が行っている勉強法を紹介してみます。
1つ目はドットインストール。
dotinstall.com
動画サイトなので理解しやすいです。
その後code prep.jpで再び勉強します。
内容が対応しているので非常に理解しやすくなります。

PC遠隔操作事件の横浜市ホームページに弱点

今朝の毎日新聞の記事に、PC遠隔操作事件の横浜市ホームページに弱点があることが報じられていました。
というのはCSRF(クロスサイトリクエストフォージェリー)と言われるものです。
これは掲示板などに投稿する際に、他のサイトから投稿できないようにするための脆弱性対策なのですが、この初歩的な対策がホームページの掲示板に施されていなかった模様です。
基本的にはセッション関数とランダム関数を使って対策を施します。
初歩的な対策を施していなかった公的なホームページにもびっくりしますね。
また2chの掲示板を見て誘導されたURLをクリックすると自動的に投稿欄に書き込みが行われてしまうというのは、Javaスクリプトなどのonclickイベント等を使えば簡単にできそうです。
警察の捜査員がのwebプログラミングの初歩的な点に気がつかなかったとすれば問題ですよね。
今の世の中webプログラミングの知識も少しは知っておかないとやっていけないということでしょうか?
実は8月29日に僕は他のブログでCSRFじゃないかと言う記事を載せていました。(^-^)/
http://forrestgump.blog49.fc2.com/blog-entry-2.html

xamppのMYSQLに接続できない(ー_ー)!!

xamppバージョン1.77から1.8へバージョンアップしようと試みるも、この6日間悪戦苦闘しどうしでした。

ネットでいろいろ探るも、mysqlに接続できない状態が続き、インストール・アンインストールの繰り返しで、

アンインストールも、コントロールパネルからでは駄目で、xamppのアンインストーラーで行い、結局1.77へ戻して、

動かす羽目になりました 泣泣!

XPでは上手くいっているのに、VISTAでは駄目なのはなぜ???

CakePHPの基礎 (ドットインストール)

CakePHP

*概要
– PHPで作られたWebアプリケーションフレームワーク

*公式サイト
– cakephp.org
Documentation
API ここの命令の詳しいリファレンス
Book 概念説明 チュートリアル

*必要となる知識
PHP/MySQL/HTML/CSS/JS/Linux

*レッスンで使う環境
http://127.0.0.1/

* MVC
– Model – データ
– View - 見た目
– Controller - かけはし

* CoC – Convention over Configration (設定より規約)

公式サイトよりCakePHPをダウンロード後、解凍しファルダをリネイム(cake)しhtdocsに配置。

===================================================

* appフォルダ

tempフォルダに書き込み権限を与える。

vim who.php

<?php echo `whoami`; ?>

sudo chown -R apache cake/app/temp/

=====================================================

データベース設定

 * MySQL

create database bob_cakephp_blog;
grant all on bob_cakephp_blog.* to dbuser@localhost identified by ‘*******’;

Configフォルダ

database.php.defaultを複製しdatebase.phpにリネイム

設定内容を変更
host
user
password

記事
– 一覧を表示
– 個別記事を表示
– 追加
– 編集
– 削除

========

Model(Model/Post.php)
— mysql table

Controller(Controller/PostsController.php)
* scaffold
– index – /cake/posts/
– view
– add
– edit
– delete

View(View/Posts/)
– index.ctp
– view.ctp
– add.ctp
– edit.ctp

create table posts (
id int not null auto_increment primary key,
title varchar(50),
body text,
created datetime default null,
modified datetime default null
);

insert into posts (title, body, created, modified) values
(‘title1’, ‘body1’, now(), now()),
(‘title2’, ‘body2’, now(), now()),
(‘title3’, ‘body3’, now(), now());

//07 Scaffoldを使ってみよう

ModelフォルダにPost.phpを作成

<?php
class Post extends AppModel {
}

ControllerにPostsController.phpを作成
<?php
class PostsController extends AppController {
   public $scaffold;

}

 

//08記事の一覧を表示してみよう
PostsController.php

<?php

class PostsController extends AppController {
public $helpers = array(‘Html’, ‘Form’);

public function index() {
$this->set(‘posts’, $this->Post->find(‘all’));
}

}

view/posts/index.ctpを作成

<h2>記事一覧</h2>

<ul>
<?php foreach ($posts as $post) : ?>
<li>
<?php
debug($post);
?>
</li>
<?php endforeach; ?>
<ul>

?

 

<h2>記事一覧</h2>

<ul>
<?php foreach ($posts as $post) : ?>
<li>
<?php
//debug($post);
echo h($post[‘Post’][‘title’]);
?>
</li>
<?php endforeach; ?>
<ul>

 

/Config/core.php

Configure::write(‘debug’, 2); (debug情報)0=何も表示しない 1=エラー表示のみ 2=表示

//10 http://127.0.0.1/cake/ 記事一覧をで表示する

C:\xampp\htdocs\cake\app\Config\routs.php

Router::connect(‘/’, array(‘controller’ => ‘pages’, ‘action’ => ‘display’,’home’));  //を

Router::connect(‘/’, array(‘controller’ => ‘posts’, ‘action’ => ‘index’));  //へ書き換え

*ヘッダーフッターの編集(タイトルの編集)

C:\xampp\htdocs\cake\app\View\Layouts\default.ctp

<?php echo $cakeDescription ?>: //削除

PostsController.phpの編集

$this->set(‘title_for_layout’,’記事一覧’);  //追加
// 11 find()を使いこなそう(PostsController.php)

public function index() {
$params = array(
‘order’ => ‘modified desc’,
‘limit’ => 2
);
$this->set(‘posts’, $this->Post->find(‘all’, $params));
$this->set(‘title_for_layout’,’記事一覧’);
}

// 12個別記事の詳細を表示してみよう

(PostsController.php)
public function view($id = null) {
$this->Post->id = $id;
$this->set(‘post’,4this->Post->read());
}

C:\xampp\htdocs\cake\app\View\Posts\view.ctp ファイルを作成

<h2><?php echo h($post[‘Post’][‘title’]); ?></h2>

<p><?php echo h($post[‘Post’][‘body’]); ?></p>

// リンクを張ってみよう

index.php 記事一覧

echo $this->Html->link($post[‘Post’][‘title’],’/posts/view/’.$post[‘Post’][‘id’]);

戻るリンク

default.ctp

<h1><?php echo $this->Html->link(‘Home’, ‘/’); ?></h1>

// 14 記事を追加してみよう(add)

(PostsController.php)

public function add() {
if ($this->request->is(‘post’)) {
if ($this->Post->save($this->request->data)) {
$this->Session->setFlash(‘Success!’);
$this->redirect(array(‘action’=>’index’));
} else {
$this->Session->setFlash(‘failed!’);
}
}
}

(add.ctp)の作成

<h2>Add post</h2>

<?php
echo $this->Form->create(‘Post’);
echo $this->Form->input(‘title’);
echo $this->Form->input(‘body’, array(‘rows’=>3));
echo $this->Form->end(‘Save Post’);

 

// エラーチェックをしてみよう
(Model/post.php)

<?php

class Post extends AppModel {
public $validate = array(
‘title’ => array(
‘rule’ => ‘notEmpty’,
‘message’ => ‘空じゃ駄目だし’
),
‘body’ => array(
‘rule’ => ‘notEmpty’
)
);
}

// jQueryを導入してみよう

(default.ctp)

<script src=”http://code.jquery.com/jquery-1.8.0.min.js”></script>
</head>
<script>
$(function() {
setTimeout(function() {
$(‘#flashMessage’).fadeOut(“slow”);
},800);
});
</script>
</body>

 

// 記事の編集をしてみよう

PostsController.php

public function edit($id = null) {
$this->Post->id = $id;
if ($this->request->is(‘get’)) {
$this->request->data = $this->Post->read();
} else {
if ($this->Post->save($this->request->data)) {
$this->Session->setFlash(‘success!’);
$this->redirect(array(‘action’=>’index’));
} else {
$this->Session->setFlash(‘failed!’);
}
}
}
edit.ctp

<h2>Edit Post</h2>

<?php
echo $this->Form->create(‘Post’, array(‘action’=>’edit’));
echo $this->Form->input(‘title’);
echo $this->Form->input(‘body’, array(‘rows’=>3));
echo $this->Form->end(‘save!’);

index.ctp

<?php echo $this->Html->link(‘編集’,array(‘action’=>’edit’,$post[‘Post’][‘id’])); ?>

//20 記事を削除してみよう

public function delete($id) {
if ($this->request->is(‘get’)) {
throw new MethodNotAllowedException();
}
if ($this->Post->delete($id)){
$this->Session->setFlash(‘deleted!’);
$this->redirect(array(‘action’=>’index’));
}
}

deleteではviewが無い

記事一覧 indwex.cpt 隠しform
<?php
echo $this->Form->postLink(‘削除’, array(‘action’=>’delete’, $post[‘Post’][‘id’]),
array(‘confirm’=>’sure?’));
?>

 

//削除処理をajax化してみよう //PostsCnotroller.php

public function delete($id) {
if ($this->request->is(‘get’)) {
throw new MethodNotAllowedException();
}
if ($this->reqest->is(‘ajax’)) {
if ($this->Post->delete($id)){
$this->autoRender = false;
$this->autoLayout = false;
$response = array(‘id’ => $id);
$this->header(‘Content-Type: application/json’);
echo json_encode($response);
exit();
}
}
$this->redirect(array(‘action’=>’index’));
}

記事一覧 //index.ctp

<?php
echo $this->Html->Link(‘削除’, ‘#’, array(‘class’=>’delete’, ‘data-ost-id’=>$post[‘Post’][‘id’]));
?>

<script>
$(function() {
$(‘a.delete’).click(function(e) {
if (confirm(‘sure?’)) {
$.post(‘/cake/posts/delete/’+$(this).data(‘post-id’), {}, function(res) {
$(‘#post_’+res.id).fadeOut();
}, “json”);
}
return false;
});
});

</script>

<li id=”post_<? echo h($post[‘Post’][‘id’]); ?>”>

==================================================

コメント
- 一覧を表示
- 追加
- 削除

Model
– mysql table
– association

Controller
index
add
delete

View

//MySql table の作成

//commentsテーブルを用意しよう
create table comments (
id int not null auto_increment primary key,
commenter varchar(255),
body text,
post_id int not null,
created datetime default null,
modified datetime default null
);

insert into comments (commenter, body, post_id, created, modified) values
(‘c1’, ‘c1’, ‘3’, now(), now()),
(‘c2’, ‘c2’, ‘3’, now(), now()),
(‘c3’, ‘c3’, ‘3’, now(), now());

//アソシエーションを設定しよう

Model

Comment.php

<?php
class Comment extends AppModel {
public $belongsTo = ‘Post’;
}

post.php へ追加
public $hasMany = “Comment”;

View

view.cpt

<h2>Comments</h2>

<ul>
<?php foreach ($post[‘Comment’] as $comment): ?>
<li><?php echo h($comment[‘body’]) ?> by <?php echo h($comment[‘commenter’]) ?></li>
<?php endforeach; ?>
</ul>

//コメントの追加

CommentsController.php

<?php

class CommentsController extends AppController {
public $helpers = array(‘Html’, ‘Form’);

public function add() {
if ($this->request->is(‘post’)) {
if ($this->Comment->save($this->request->data)) {
$this->Session->setFlash(‘Success!投稿されました!’);
$this->redirect(array(‘controller’=>’posts’,’action’=>’view’,$this->data[‘Comment’][‘post_id’]));
} else {
$this->Session->setFlash(‘failed!失敗です!’);
}
}
}

view.ctp

<h2><?php echo h($post[‘Post’][‘title’]); ?></h2>

<p><?php echo h($post[‘Post’][‘body’]); ?></p>

<h2>Comments</h2>

<ul>
<?php foreach ($post[‘Comment’] as $comment): ?>
<li><?php echo h($comment[‘body’]) ?> by <?php echo h($comment[‘commenter’]) ?></li>
<?php endforeach; ?>
</ul>

<h2>Add Comments</h2>

<?php
echo $this->Form->create(‘Comment’,array(‘action’=>’add’));
echo $this->Form->input(‘commenter’);
echo $this->Form->input(‘body’,array(‘rows’=>3));
echo $this->Form->input(‘Comment.post_id’,array(‘type’=>’hidden’, ‘value’=>$post[‘Post’][‘id’]));
echo $this->Form->end(‘post Comment’);

 

//コメントの削除
controller.php
public function delete($id) {
if ($this->request->is(‘get’)) {
throw new MethodNotAllowedException();
}
if ($this->request->is(‘ajax’)) {
if ($this->Comment->delete($id)){
$this->autoRender = false;
$this->autoLayout = false;
$response = array(‘id’ => $id);
$this->header(‘Content-Type: application/json’);
echo json_encode($response);
exit();
}
}
$this->redirect(array(‘controller’=>’posts’,’action’=>’index’));
}

view.ctp

<li id=”comment_<?php echo h($comment[‘id’]); ?>”>
<?php echo h($comment[‘body’]) ?> by <?php echo h($comment[‘commenter’]) ?>
<?php
echo $this->Html->Link(‘削除’, ‘#’, array(‘class’=>’delete’, ‘data-comment-id’=>$comment[‘id’]));
?>
</li>
<script>

$(function() {
$(‘a.delete’).click(function(e) {
if (confirm(‘sure?’)) {
$.post(‘/cake/comments/delete/’+$(this).data(‘comment-id’), {}, function(res) {
$(‘#comment_’+res.id).fadeOut();
}, “json”);
}
return false;
});
});
</script>

お問合せ管理システムを作ろう(ドットインストール)

HTML / CSS

PHP

MySQL

jQuery Javascript

—————————–

ローカル開発環境 PHP 5.2

ブラウザ(Chrome)

テキストエディタ

ーーーーーーーーーーーーーー

ユーザー管理(簡略化しています)

セキュリティ(簡略化しています)

//データベースを設計 作成する

create database contacts;
grant all privileges on contacts.* to dbuser@localhost identified by ‘*******’ ;

use contacts;

create table entries (
id int not null auto_increment primary key,
name varchar(255),
email varchar(255),
memo text
) default charset=utf8;

//お問合せフォームを作る index.php

<?php

error_reporting(E_ALL & ~E_NOTICE);

if($_SERVER[‘REQUEST_METHOD’]==”POST”){

$name = $_POST[‘name’];
$email = $_POST[‘email’];
$memo = $_POST[‘memo’];

$error = array();

//エラー処理

if (!filter_var($email,FILTER_VALIDATE_EMAIL)) {
$error[‘email’] = ‘メールアドレスが正しくありません’;
}

if ($email == ”) {
$error[‘email’] = ‘メールアドレスが入力されていません’;
}
if ($memo == ”) {
$error[‘memo’] = ‘内容が入っていません’;
}

//エラーがなかった場合

if (empty($error)) {
//DBにデータを入れる
mysql_connect(“localhost”, “dbuser@localhost”, “********”) or die(“can’t connect to DB: “.mysql_error());
mysql_select_db(“contacts”) or die(“can’t select to DB: “.mysql_error());

$q = sprintf(“insert into entries (name, email, memo, created, modified) values (‘%s’, ‘%s’, ‘%s’, now(), now())”,
mysql_real_escape_string($name), mysql_real_escape_string($email),mysql_real_escape_string($memo));
mysql_query($q) or die(“can’t run query: “.mysql_error());

//ありがとうページに飛ぶ
header(“Location: http://127.0.0.1/contacts/thanks.html”);
}

}
?>
<!DOCTYPE html>
<html lang=”ja”>
<head>
<meta charset=”UTF-8″>
<title>お問合せフォーム</title>
</head>
<body>
<h1>お問合せフォーム</h1>
<p>こちらからどうぞ!</p>
<form method=”post” action=””>
<p>お名前</p>
<input type=”text” name=”name” value=”<?php echo htmlspecialchars($name); ?>”>
<p>メールアドレス</p>
<input type=”text” name=”email” value=”<?php echo htmlspecialchars($email); ?>”>
<?php if ($error[‘email’]) echo $error[‘email’]; ?>
<p>内容</p>
<textarea name=”memo” cols=”40″ rows=”5″><?php echo htmlspecialchars($memo); ?></textarea>
<?php if ($error[‘memo’]) echo $error[‘memo’]; ?>

<p><input type=”submit” value=”送信”></p>
</form>
</body>
</html>

//サンクスページの作成 thanks.html

<!DOCTYPE html>
<html lang=”ja”>
<head>
<meta charset=”UTF-8″>
<title>お問合せありがとうございました</title>
</head>
<body>
<h1>お問合ありがとうございました</h1>
<p>感謝感激!</p>
</body>
</html>

//管理画面の作成 /admin/index.php

<?php

error_reporting(E_ALL & ~E_NOTICE);

//DB接続
mysql_connect(“localhost”, “dbuser@localhost”, “********”) or die(“can’t connect to DB: “.mysql_error());
mysql_select_db(“contacts”) or die(“can’t select to DB: “.mysql_error());

//データを取得

$rs = mysql_query(“select * from entries”);

$entries = array();

while ($row = mysql_fetch_assoc($rs)){
$entries[] = $row;
}
?>
<!DOCTYPE html>
<html lang=”ja”>
<head>
<meta charset=”UTF-8″>
<title>データ一覧</title>
<script src=”http://code.jquery.com/jquery-1.6.4.min.js”></script>
</head>
<style>
.deleteEntry {
cursor: pointer;
color: blue;
}
</style>
<body>
<h1>データ一覧</h1>
<ul>
<?php foreach ($entries as $entry) : ?>
<li id=”entry_<?php echo $entry[‘id’]; ?>”><a href=”edit.php?id=<?php echo $entry[‘id’]; ?>”><?php echo htmlspecialchars($entry[‘name’]); ?></a>
<span class=”deleteEntry” data-id=”<?php echo $entry[‘id’]; ?>”>X</span></li>
<?php endforeach; ?>
</ul>
</body>
<script>
$(function() {
$(‘.deleteEntry’).click(function() {
var data = $(this).data();
//data.id
if (confirm(“本当に削除しますか?”)){
//ajax
$.post(“delete.php”, {
//オプション
id: data.id
}, function() {
//successした後の処理
$(‘#entry_’+data.id).fadeOut(800);
});
}
});
});

</script>
</html>

//データ編集画面 admin/edit.php

<?php

error_reporting(E_ALL & ~E_NOTICE);

$id = $_GET[‘id’];

mysql_connect(“localhost”, “dbuser@localhost”, “********”) or die(“can’t connect to DB: “.mysql_error());
mysql_select_db(“contacts”) or die(“can’t select to DB: “.mysql_error());
if($_SERVER[‘REQUEST_METHOD’]==”POST”){

$name = $_POST[‘name’];
$email = $_POST[‘email’];
$memo = $_POST[‘memo’];

$error = array();

//エラー処理

if (!filter_var($email,FILTER_VALIDATE_EMAIL)) {
$error[‘email’] = ‘メールアドレスが正しくありません’;
}

if ($email == ”) {
$error[‘email’] = ‘メールアドレスが入力されていません’;
}
if ($memo == ”) {
$error[‘memo’] = ‘内容が入っていません’;
}

//エラーがなかった場合

if (empty($error)) {
//update
$q = sprintf(“update entries set name=’%s’, email=’%s’, memo=’%s’, modified=now() where id=%d”,
mysql_real_escape_string($name), mysql_real_escape_string($email), mysql_real_escape_string($name), mysql_real_escape_string($id));
$rs = mysql_query($q);

//データ一覧ページに飛ぶ
header(“Location: http://127.0.0.1/contacts/admin/”);
}
} else {
//そのまま表示された時

$q = “select * from entries where id = “.mysql_real_escape_string($id);
$rs = mysql_query($q);
$row = mysql_fetch_assoc($rs);

$name = $row[‘name’];
$email = $row[‘email’];
$memo = $row[‘memo’];
}
?>
<!DOCTYPE html>
<html lang=”ja”>
<head>
<meta charset=”UTF-8″>
<title>データの編集</title>
</head>
<body>
<h1>データの編集</h1>
<p>こちらからどうぞ!</p>
<form method=”post” action=””>
<p>お名前</p>
<input type=”text” name=”name” value=”<?php echo htmlspecialchars($name); ?>”>
<p>メールアドレス</p>
<input type=”text” name=”email” value=”<?php echo htmlspecialchars($email); ?>”>
<?php if ($error[‘email’]) echo $error[‘email’]; ?>
<p>内容</p>
<textarea name=”memo” cols=”40″ rows=”5″><?php echo htmlspecialchars($memo); ?></textarea>
<?php if ($error[‘memo’]) echo $error[‘memo’]; ?>

<p><input type=”submit” value=”更新”></p>
</form>
</body>
</html>

//削除画面 admin/delete.php

<?php

$id = $_POST[‘id’];
//DB接続
mysql_connect(“localhost”, “dbuser@localhost”, “****”) or die(“can’t connect to DB: “.mysql_error());
mysql_select_db(“contacts”) or die(“can’t select to DB: “.mysql_error());

//データを削除
$rs = mysql_query(“delete from entries where id = “.mysql_real_escape_string($id));

?dot_install

PHPで作る投票システム

PHPで作る「投票システム」

必要となる知識

-HTML

-PHP/MySQL – ローカル開発環境

-Google Chart API

– URL

http://localhost/poll_php/

// データベース作成(poll_php・・・・・・commands.sql

create database poll_php;
grant all on poll_php.* to dbuser@localhost identified by ‘******’;
use poll_php;
create table answers (
id int(11) not null auto_increment primary key,
question_id int,
answer varchar(255),
remote_addr varchar(15),
user_agent varchar(255),
answer_date varchar(8),
created datetime,
modified datetime,
unique unique_answer(question_id, remote_addr, user_agent, answer_date) //重複する投稿をはじく
);

// 設定ファイル・・・・・・・config.php

<?php

define(‘DB_HOST’, ‘localhost’);
define(‘DB_USER’, ‘dbuser’);
define(‘DB_PASSWORD’, ‘*******’);
define(‘DB_NAME’, ‘poll_php’);

define(‘SITE_URL’, ‘http://localhost/poll_php/’);

error_reporting(E_ALL & ~E_NOTICE);

// よく使う関数を登録する

<?php

function connectDb(){
mysql_connect(DB_HOST, DB_USER, DB_PASSWORD) or die(‘could not connect to DB:’.mysql_error());
mysql_select_db(DB_NAME) or die (‘could not select DB:’.mysql_error());
}

function h($s){
return htmlspecialchars($s);
}

function r($s){
return mysql_real_escape_string($s);
}

function jump($s){
header(‘location: ‘.SITE_URL.$s);
exit;
}

// 投票ページを作ろう(1)・・・・・・index.php

<!DOCTYPE html>
<html lang=”ja”>
<head charset=”UTF-8″>
<title>投票システム</title>
</head>
<body>
<form action=”” method=”POST”>
<img src=”photo1.jpg”>
<input type=”radio” name=”answer” value=”1″>
<img src=”photo2.jpg”>
<input type=”radio” name=”answer” value=”2″>
<img src=”photo3.jpg”>
<input type=”radio” name=”answer” value=”3″>
<img src=”photo4.jpg”>
<input type=”radio” name=”answer” value=”4″>
<p><input type=”submit” value=”投票する”</p>
</form>
<p><a href=”result.php”>結果を見る</a></p>
</body>
</html>

// 投票ページを作ろう(2)・・・・・・index.php  poll.php

<?php
require_once(‘config.php’);
require_once(‘functions.php’);

session_start();

//CSRF対策
if (!isset($_SESSION[‘token])){
$_SESSION[‘token’] = sha1(uniqid(mt_rand(), true));
}
<!DOCTYPE html>
<html lang=”ja”>
<head charset=”UTF-8″>
<title>投票システム</title>
</head>
<body>
<form action=”poll.php” method=”POST”>
<img src=”photo1.jpg”>
<input type=”radio” name=”answer” value=”1″>
<img src=”photo2.jpg”>
<input type=”radio” name=”answer” value=”2″>
<img src=”photo3.jpg”>
<input type=”radio” name=”answer” value=”3″>
<img src=”photo4.jpg”>
<input type=”radio” name=”answer” value=”4″>
<p><input type=”submit” value=”投票する”</p>
<input type=”hidden” name=”token” value=”<?php echo $_SESSION[‘token’]; ?>”>
<input type=”hidden” name=”question_id” value=”1″>
</form>
<p><a href=”result.php”>結果を見る</a></p>
</body>
</html>

// 投票プログラムの流れを確認する 「文字コード unicode UTF-8(BOM無)」 poll.php

<?php

require_once(‘config.php’);
require_once(‘functions.php’);

session_start();

// tokenのチェック

if (empty($_POST[‘token’]) || $_POST[‘token’] != $_SESSION[‘token’]) {
echo “不正な操作です!”;
exit;
}

// 回答し忘れチェック

if (!isset($_POST[‘answer’])) {
$_SESSION[‘error’] = ‘写真を選択してください’;
jump(‘index.php’);
}

// 選択肢が正しいかどうか

if (!in_array($_POST[‘answer’], array(1, 2, 3, 4))) {
echo ‘不正な操作です’;
exit;
}

// question_idが正しいかどうか

if ($_POST[‘question_id’] !=1 ) {
echo ‘不正な操作です’;
exit;
}

//DBに回答を入れる

connectDb();

$q = sprintf(“insert into answers (question_id, answer, remote_addr, user_agent, answer_date, created, modified)
values (%d, ‘%s’, ‘%s’, ‘%s’, ‘%s’, now(), now())”,
intval($_POST[‘question_id’]),
r($_POST[‘answer’]),
r($_SERVER[‘REMOTE_ADDR’]),
r($_SERVER[‘HTTP_USER_AGENT’]),
date(‘Ymd’)
);

$rs = mysql_query($q);

// 重複していたらエラー

if ($rs) {
$_SESSION[‘is_poll_done’] = true;
} else {
$_SESSION[‘error’] = ‘投票は1日1回までです!’;
}

// index.phpに戻す

jump(‘index.php’);
?>

// index.phpへの追加(重複エラー)

<body>
<?php if ($_SESSION[‘is_poll_done’] != ”) : ?>
<p style=”color:green;font-weight:bold”>投票ありがとうございました</p>
<?php endif; ?>
<?php unset($_SESSION[‘is_poll_done’]); ?>

// index.php 完成

<?php
require_once(‘config.php’);
require_once(‘functions.php’);

session_start();

//CSRF対策
if (!isset($_SESSION[‘token’])){
$_SESSION[‘token’] = sha1(uniqid(mt_rand(), true));
}
?>
<!DOCTYPE html>
<html lang=”ja”>
<head>
<meta charset=”UTF-8″>
<title>投票システム</title>
</head>
<body>
<?php if ($_SESSION[‘is_poll_done’] != ”) : ?>
<p style=”color:green;font-weight:bold”>投票ありがとうございました</p>
<?php endif; ?>
<?php unset($_SESSION[‘is_poll_done’]); ?>
<?php if ($_SESSION[‘error’] != ”) : ?>
<p style=”color:red;font-weight:bold”><?php echo h($_SESSION[‘error’]); ?></p>
<?php endif; ?>
<?php unset($_SESSION[‘error’]); ?>

<form action=”poll.php” method=”POST”>
<img src=”photo1.jpg”>
<input type=”radio” name=”answer” value=”1″>
<img src=”photo2.jpg”>
<input type=”radio” name=”answer” value=”2″>
<img src=”photo3.jpg”>
<input type=”radio” name=”answer” value=”3″>
<img src=”photo4.jpg”>
<input type=”radio” name=”answer” value=”4″>
<p><input type=”submit” value=”投票する”></p>
<input type=”hidden” name=”token” value=”<?php echo $_SESSION[‘token’]; ?>”>
<input type=”hidden” name=”question_id” value=”1″>
</form>
<p><a href=”result.php”>結果を見る</a></p>
</body>
</html>

// result.php google chart API

<?php
require_once(‘config.php’);
require_once(‘functions.php’);

//dbからデータを引っ張る

connectDb();

$q = “select answer, count(id) as count from answers group by answer”;

$rs = mysql_query($q);

$rows = array();

while ($row = mysql_fetch_assoc($rs)) {
$rows[] = array($row[‘answer’], (int)$row[‘count’]);
}

$data = json_encode($rows);

?>
<!DOCTYPE html>
<html lang=”ja”>
<head>
<meta charset=”UTF-8″>
<title>結果発表</title>
</head>
<body>

<div id=”chart_div”>グラフを読み込み中です・・・</div>
<p><a href=”index.php”>投票ページに戻る</a></p>

<script src=”https://www.google.com/jsapi”></script>
<script>
google.load(‘visualization’, ‘1.0’ , {‘packages’:[‘corechart’]});
google.setOnLoadCallback(drawChart);

function drawChart() {
var data = new google.visualization.DataTable();
data.addColumn(‘string’, ‘Answer’);
data.addColumn(‘number’, ‘票数’);

data.addRows(<?php echo $data; ?>);

var options = {
‘title’: ‘投票結果’,
‘width’: 400,
‘height’: 300
}

var chart = new google.visualization.PieChart(document.getElementById(‘chart_div’));
chart.draw(data, options);
}
</script>

</body>
</html>

ドットインストール

PHPの基礎(応用編)

<?php
//データベース
//MySQL

//DBサーバーに接続
mysql_connect(“localhost”,”db_user”,”****”) or die(“can not connect to DB”.mysql_error());

//DBを選択する
mysql_select_db(“blog_app”) or die(“can not select DB”.mysql_error());

//データ挿入のためのSQLを発行
$id = 10;
$name = “bob”;
$email = “bob@gmail.com”;
$password = “1234”;

$sql = sprintf(“insert into users (id, name, email, password) values (%d, ‘%s’, ‘%s’, ‘%s’)” ,$id, $name, $email, $password);
$rs = mysql_query($sql);

if(!$rs){
echo “sql could not run!”;
exit;
}
echo “success!”;

//データをエスケープしよう

function r($str) {

return mysql_real_escape_string($str);

}

$sql = sprintf(“insert into users (id,name,email,password) values (%d, “%s”,”%s”,”%s”)” $id, r($name), r($email), r($password));

//データベースのデータを表示しよう

<?php
//データベース
//MySQL

//DBサーバーに接続
mysql_connect(“localhost”,”bob”,”xxxx”) or die(“can not connect to DB:”.mysql_error());

//DBを選択する
mysql_select_db(“blog_app”) or die(“can not select DB:”.mysql_error());

$sql = “select * from users”;
$rs = mysql_query($sql);
if(!$rs){
echo “sql could not run!”;
exit;
}

if (mysql_num_rows($rs)){
while ($row = mysql_fetch_assoc($rs)){
var_dump($row);
}
}else{
echo “nothing returned”;
exit;
}

//データベースのデータを更新しよう

<?php
//データベース
//MySQL

//DBサーバーに接続
mysql_connect(“localhost”,”bob”,”xxxx”) or die(“can not connect to DB:”.mysql_error());

//DBを選択する
mysql_select_db(“blog_app”) or die(“can not select DB:”.mysql_error());

$sql = “update users set password = ‘9876’ where id = 10”;
$rs = mysql_query($sql);
if(!$rs){
echo “sql could not run!”;
exit;
}

printf (“%d件更新されました!”, mysql_affected_rows());

<?php
//Cookie(ブラウザにデータを保存)

setcookie(‘username’, ‘bob’,time()60*60*24*14);

setcookie(‘username’, ”,time()-60); //cookieを削除

echo $_COOKIE[‘username’];   //cookieの表示

<?php
//セッション(サーバー側にデータを保存する)
session_start();

$_SESSION[‘userName’] = “bob”;

unset($_SESSION[‘userName’]); //セッションの削除

echo $_SESSION[‘userName’];

<?php
//オブジェクト指向
/*

クラス:設計図
-メンバー変数
-メソッド(関数)
-コンストラクタ

インスタンス:クラスを実体化したもの

*/

class User{
public $name;
public $email;    //private

public function __construct($name, $email){
$this->name = $name;
$this->email = $email;
}

public function sayHi(){
echo “hi ! my name is “.$this->name;
}
}
$tom = new User(“tom”, “dummy@dummy.com”);
$bob = new User(“bob”, “dummy@dummybob.com”);

echo $tom->name;
echo $tom->sayHi();
echo $bob->sayHi()

<?php
//クラスの継承
class User{
public $name;
protected $email;

public function __construct($name, $email){
$this->name = $name;
$this->email = $email;
}

public function sayHi(){
echo “hi ! my name is “.$this->name;
}
}

class SuperUser extends User{

public function SuperSayHi(){
echo “HIIIIIII ! my name is “.$this->name;
echo “HIIIIIII ! my email is”.$this->email;
}
}

$tom = new User(“tom”, “dummy@dummy.com”);
$bob = new SuperUser(“bob”, “dummy@dummybob.com”);

$bob->superSayHi();

//ファイルの分割

//user.class.php

<?php
class User{
public $name;
protected $email;

public function __construct($name, $email){
$this->name = $name;
$this->email = $email;
}

public function sayHi(){
echo “hi ! my name is “.$this->name;
}
}

class SuperUser extends User{

public function SuperSayHi(){
echo “HIIIIIII ! my name is “.$this->name;
echo “HIIIIIII ! my email is”.$this->email;
}
}

 

<?php
/*
ファイルの分割

require(‘ ‘); //エラーで強制停止
require_once(‘ ‘);

include(); //エラーで警告。その後続行
include_once();

*/

require_once(‘user.class.php’);

$tom = new User(“tom”, “dummy@dummy.com”);
$bob = new SuperUser(“bob”, “dummy@dummybob.com”);

$bob->superSayHi();

mysql 覚書 (ドットインストール mysqlの基礎)

cd c:\xampp\mysql\bin
mysql -u root -p
enter password:

set password for root@localhost=password(‘******’);

*コマンドの最後には「;」

exit

c:\xampp\mysql\bin>mysql -u root -p

create database blog_app;

show databases;

drop database blog_app;

use mysql;
use test;

exit

c:\xampp\mysql\bin>mysql -u root-p

create database blog_app;

grant all on blog_app.* to user@localhost identified by ‘******’;

create table users(

id int not null auto_increment primary key, ?// 入力を必須 自動連番 主キー

name varchar(255),

email varchar(255) unique, // 変動長 ユニークキー

password char(32), // 固定長

score double, // 浮動小数点型

sex enum(‘male’,’female’) default ‘male’, // 列挙タイプ文字列型

memo text, // 長文テキスト型

created datetime, // 日付時刻型

key score (score)  // キー

);

最後の「,」区切りは無し

// tableへのdataの挿入

insert into users (email,password,score,memo,created) values (‘bob@gmail.com’,’xxx’,5.5,’memoememo’,’2012-07-03 11:00:00′);

desc users; // テーブル構造の表示

select * from users; ?// テーブル内容の表示

create table users(

id int not null primary key auto_increment,
name varchar(255),
email varchar(255) unique,
team enum(‘blue’,’red’,’yellow’),
score double,
created datetime,
key score(score)
);

drop table users;

create table users(
id int not null primary key auto_increment,
name varchar(255),
email varchar(255),
team enum(‘blue’,’red’,’yellow’),
score double,
created datetime
);

// テーブルへデータの挿入

insert into users(name,email,team,score,created) values
(‘bob’,’bob@gmail.com’,’blue’,5.5,’2012-07-03 11:00:00′),
(‘ben’,’ben@gmail.com’,’yellow’,8.2,’2012-06-22 12:00:00′),
(‘an’,’an@gmail.com’,’red’,2.3,’2012-06-15 13:00:00′),
(‘jon’,’jon@gmail.jp’,’blue’,4.5,’2012-06-01 10:00:00′),
(‘beth’,”,’yellow’,7.4,’2012-05-05 08:00:00′),
(‘tim’,’tim@gmail.jp’,’blue’,4.2,’2012-06-01 23:00:00′);

// データの抽出

select * from users;

select * from users \G ?// 縦並び

select name,email from users;

// 条件付き抽出

select * from users where score >= 5.0;

select * from users where score <> 5.0;

select * from users where team != ‘red’;

select * from users where email like ‘%@gmail.com;

select * from users where email like ‘%@gmail.__;

select * from users where score between 5.0 and 8.0;

select * from users where team in (‘red’,’yellow’); ?// redかyellowどちらかが含まれる

select * from users where score >=4.0 and team = ‘blue’;   // and条件

select * from users where score >=4.0 or team = ‘blue’;     // or条件

並び替え

select * from users order by score; ?// 昇順

select * from users order by score desc;  // 降順

select * from users order by score limit 3; ? // 件数制限

オフセット値

select * from users limit 2,2;  2(0スタート)から始まる2件

select * from users order by score limit 3;

データの集計

select count(*) from users;

ユニークなデータの抽出

select distinct team from users;

select max(score) from users;

?select min(score) from users;

select sum(score) from users;

select avg(score) from users;

select team,avg(score) from users group by team;

select rand();

select * from users order by rand() limit 1; // ランダムに抽選で一人だけ選ぶ

文字列関数

select email,length(email) from users;

select concat(name,'(‘,team,’)’) as label from users;

select name,substring(team,1,1) from users;

select now();

select name,month(created) from users;

select datediff(now(),created) from users; ?// 日付の差分

レコードの更新削除

update users set email = ‘beth@gmail.com’ where id =5 ;

delete from users where score < 3 ;

テーブル構造の変更

alter table users add fullname varchar(255) after name ;

alter table users change fullname fullname varchar(100) ;

alter table users drop fullname ;

alter table users add index email (email) ;  // 検索高速化キーの追加

alter table users drop index email ;

alter table users rename blog_users ;

複数のテーブル

drop table users;

create table users(
id int not null primary key auto_increment,
name varchar(255),
email varchar(255),
team enum(‘blue’,’yellow’,’red’),
score double,
created datetime
);

insert into users (name,email,team,score,created) values
(‘bob’,’bob@gmail.com’,’blue’,5.33,’2012-07-07 11:00:00′),
(‘ben’,’ben@gmail.com’,’yellow’,4.35,’2012-07-05 12:00:00′),
(‘tim’,’tim@gmail.com’,’red’,3.67,’2012-07-03 14:00:00′);

create table posts(
id int not null primary key auto_increment,
user_id int not null,
title varchar(255),
body text,
created datetime
);

insert into posts (user_id,title,body,created) values
(1,’title-1 by bob’, ‘body-1′,’2012-7-7 14:00:00’),
(1,’title-2 by bob’, ‘body-2′,’2012-7-8 11:00:00’),
(2,’title-3 by ben’, ‘body-3′,’2012-7-3 16:00:00’),
(3,’title-4 by tim’, ‘body-4′,’2012-7-4 10:00:00’),
(3,’title-5 by tim’, ‘body-5′,’2012-7-5 13:00:00’);

select users.name,posts.title from users,posts where users.id = posts.user_id;

select users.name,posts.title,posts.created from users,posts where users.id = posts.user_id order by posts.created desc;

外部ファイルのコマンドを実行する

drop table if exists users;
create table users(
name varchar(255),
email varchar(255)
);
insert into users (name,email) values (‘bob’,’bob@gmail.com’);

mysql -u dbusers -p blog_app < ../../htdocs/command.sql

バックアップ

mysqldump -u dbuser -p blog_app >../../htdocs/blog_app.dump.sql

cd c:\xamp\htdocs

dir // ファイルの確認

復元

mysql -u dbuser -p blog_app < ../../htdocs/blog_app.dump.sql

databaseをdropした場合はcreate database blog_appを先に実行

感謝感謝! ドットインストール