20201112のMySQLに関する記事は3件です。

XAMPPで複数バージョンのPHPを切り替えてApache + MySQL を使う方法 on Windows

目標

XAMPPでPHP7.4.xとPHP5.6.xを切り替えてApacheとMySQL、phpMyAdminを使えるようにする

前提

PHPのバージョンが新しい方、もしくは古い方のどちらかでApacheMySQLを稼働できていること

作業

バージョンの異なるXAMPPファイルの入手

ここから欲しいバージョンのPHPが含まれているXAMPPzipファイルをダウンロードする。
PHP単体でなく、XAMPP全体をダウンロードするのはApachephpMyAdminがそれぞれのPHPバージョンに対応した設定になっているから。
今回の方法ではPHPのバージョンを切り替えた際、ApachephpMyAdminのファイルや設定もそれに対応したものにする。
特定のファイルを変更するわけじゃないため作業自体や変更自体は少ないが、少し容量に余裕が必要なことに注意。

名前の変更

新しいバージョン、または古いバージョンが含まれたXAMPPzipファイルをダウンロードできたら、解凍し、以下の3つのフォルダをデスクトップなどにコピー。

  • apache
  • phpMyAdmin
  • php

そして名前を(ファイル名) (phpのメジャーバージョン).(phpのマイナーバージョン)に変更する。
もし、PHP5.6.xをダウンロードした場合、コピーしたフォルダは次の名前になる。

  • apache5.6
  • phpMyAdmin5.6
  • php5.6

名前を変更したら、それらをコピーし、現在のxamppフォルダに貼り付ける。

その後、xampp内のapache,phpMyAdmin,phpを貼り付けたのファイル達と同じ方法で名前を変更する。
既存のPHPバージョンが7.4.xだったら次のようになる。

  • apache7.4
  • phpMyAdmin7.4
  • php7.4

config.inc.phpの移動

今まで使っていたバージョンのphpMyAdminフォルダからconfig.inc.phpを新しく用意したバージョンのphpMyAdminにコピーして貼り付ける。
そうすることで、PHPのバージョンが違っても今までと同じようにphpMyAdminが使えるようになる。
新しく用意したバージョンのphpMyAdminconfig.inc.phpconfig.origin.inc.phpなどに名前を変えて残しておくと良いかもしれない。

シンボリックリンクの作成

シンボリックリンクとはショートカットのようなもの。
php7.4からphpというシンボリックリンクを作成したら、システムや他のファイルはphpというシンボリックリンクを参照して、それに指定されたphp7.4がその中身となる。
正直、使うたびにphp7.4phpに変更するような作業をすればいいが、手間なのでシンボリックリンクを作成する。

今回はPHPのバージョンが5.6のシンボリックリンクを作成する。
シンボリックリンクはコマンドプロントを開いて、それぞれ次のコマンドで実行できる。

$ mklink /D c:\xampp\apache C:\xampp\apache5.6
$ mklink /D c:\xampp\phpMyAdmin C:\xampp\phpMyAdmin5.6
$ mklink /D c:\xampp\php C:\xampp\php5.6

バッチファイル(スクリプト)の作成

「コマンドを毎回入力するよりも名前を毎回変えた方が楽じゃん」
それは否定しないが、コマンドの紹介をしたのは上記のコマンドを含めたバッチファイル(スクリプト)を作成すれば、もっと楽にできる。

ということで、下記のようなバッチファイル(スクリプト)を作成し、xampp下などの使いやすいところに置く。
使い方はエクスプローラーから直接実行するか、コマンドプロントからchange_php.batを置いたところまで移動し、change_php.batを実行する。

change_php.bat
@echo off

echo.
echo 使いたいPHPのバージョンを選択してください。
echo.
echo 現在のPHPバージョン:
echo.
php -v
echo.
echo 1: PHP 5.6
echo 2: PHP 7.4
echo C: Cancel
echo.

choice /c 12C /M "使いたいPHPのバージョン."
if %errorlevel% equ 1 goto PHP5_6
if %errorlevel% equ 2 goto PHP7_4
goto OnExit

:PHP5_6
rmdir C:\xampp\apache
mklink /D C:\xampp\apache C:\xampp\apache-5.6
rmdir C:\xampp\phpMyAdmin
mklink /D C:\xampp\phpMyAdmin C:\xampp\phpMyAdmin-5.6
rmdir C:\xampp\php
mklink /D C:\xampp\php C:\xampp\php-5.6
goto OnExit

:PHP7_4
rmdir C:\xampp\apache
mklink /D C:\xampp\apache C:\xampp\apache-7.4
rmdir C:\xampp\phpMyAdmin
mklink /D C:\xampp\phpMyAdmin C:\xampp\phpMyAdmin-7.4
rmdir C:\xampp\php
mklink /D C:\xampp\php C:\xampp\php-7.4
goto OnExit

:OnExit

コマンドプロントの文字コードがANSIなので、名前を付けて保存する際にANSIを指定しないと動作できなくなるので注意。
実際に動かすとこのようになる。

image.png

動作確認

xamppフォルダのxampp-control.exeを開き、ApacheMySQLAdminボタンをクリックし、新しく用意したバージョンのPHPInfoで用意したバージョンのPHPになっているのとphpMyAdminに接続できればOK。

参考資料

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

mysql 改行され続けて困った

vscodeでmysqlを操作していてひたすら改行され続けるので対処法

やったこと
mysqlからデータを選択しようとして、 ”一つの後にエンターを押した。

すると、下記のようになった

mysql> コマンド "(ここで改行)
">
"> 何か打つ
"> 同じようになる

上記の繰り返しになって焦った。

対処法
もう一度 " のみ入力
すると、
-> となった

原因
"を入力すると閉じが必要
私は""のように閉じていなかったため、延々と入力待ち状態になっていた。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

PHP+MySQL

PHP+MySQLを使用した基礎知識についてのまとめです。

PDO - MySQLに接続する

try catchを使って記述します。

フォルダの中に以下のファイルを用意。

index.php
<!doctype html>
<html lang="ja">
<head>
<!-- Required meta tags -->
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

<!-- Bootstrap CSS -->
<link rel="stylesheet" href="css/style.css">

<title>PHP</title>
</head>
<body>
<header>
<h1 class="font-weight-normal">PHP</h1>    
</header>

<main>
<h2>Practice</h2>
<pre>
<?php
//以下の記述でPHPからDBに接続できる。MAMPの場合、パスワードはrootになる。
try{
  //new PDO(DBを扱う)でオブジェクトのインスタンスを作っている。
  $db = new PDO ('mysql:dbname=mydb;host=127.0.0.1;port=8889;charset=utf8', 'root', 'root');
  //接続できなければ$eという形で受け取り、それを画面に出力する。
}catch(PDOException $e){
  echo 'DB接続エラー:' . $e->getMessage();
}
?>
</pre>
</main>
</body>    
</html>

exec - SQLを実行する

PHPからDBにSQLを発行する。
以下の記述でDBにデータを追加できる。

index.php
<!doctype html>
<html lang="ja">
<head>
<!-- Required meta tags -->
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

<!-- Bootstrap CSS -->
<link rel="stylesheet" href="css/style.css">

<title>PHP</title>
</head>
<body>
<header>
<h1 class="font-weight-normal">PHP</h1>    
</header>

<main>
<h2>Practice</h2>
<pre>
<?php
try{
  $db = new PDO ('mysql:dbname=mydb;host=127.0.0.1;port=8889;charset=utf8', 'root', 'root');
}catch(PDOException $e){
  echo 'DB接続エラー:' . $e->getMessage();
}

//以下の記述でmy_itemテーブルにデータを追加。
$count = $db->exec('INSERT INTO my_item SET maker_id=1,item_name="桃",price=210,keyword="缶詰,ピンク,甘い"');
//$countでデータの数を返す。
echo $count . '件のデータを挿入しました';
?>
</pre>
</main>
</body>    
</html>

query - SELECT SQLを実行する

<!doctype html>
<html lang="ja">
<head>
<!-- Required meta tags -->
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

<!-- Bootstrap CSS -->
<link rel="stylesheet" href="css/style.css">

<title>PHP</title>
</head>
<body>
<header>
<h1 class="font-weight-normal">PHP</h1>    
</header>

<main>
<h2>Practice</h2>
<pre>
<?php
//以下の記述でPHPからDBに接続できる。MAMPの場合、パスワードはrootになる。
try{
  //new PDO(DBを扱う)でオブジェクトのインスタンスを作っている。
  $db = new PDO ('mysql:dbname=mydb;host=127.0.0.1;port=8889;charset=utf8', 'root', 'root');
  //接続できなければ$eという形で受け取り、それを画面に出力する。
}catch(PDOException $e){
  echo 'DB接続エラー:' . $e->getMessage();
}
//以下の記述でrecordsという変数の中にdbの内容が入っている。
$records=$db->query('SELECT * FROM my_item');
//while構文を使って取り出していく。1行ずつ取り出してそれを$recordに入れている。
while($record=$records->fetch()){
  print($record['item_name']."\n");
}
?>
</pre>
</main>
</body>    
</html>

これにより、DBの情報が表示される。
スクリーンショット 2020-11-11 18.21.01.png

フォームからの情報を取得する

以下のように記載。

<!doctype html>
<html lang="ja">
<head>
<!-- Required meta tags -->
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

<!-- Bootstrap CSS -->
<link rel="stylesheet" href="css/style.css">

<title>PHP</title>
</head>
<body>
<header>
<h1 class="font-weight-normal">PHP</h1>    
</header>

<main>
<h2>Practice</h2>
<pre>
   <?php
   try{
     //PDOのはデータベースの種類や接続文字列などを入力する。
   $db=new  PDO('mysql:dbname=mydb;host=127.0.0.1;port=8889;charset=utf8', 'root', 'root');
   $db->exec('INSERT INTO memos SET memo="'.$_POST['memo'].'",created_at=NOW()');
   }catch(PDOException $e){
     echo 'DB接続エラー:'.$e->getMessage();
   }
   ?>
</pre>
</main>

</body>    
</html>

①input.htmlにアクセスしてメモに文字を入力。
スクリーンショット 2020-11-11 21.04.45.png
②input_do.phpにアクセスして何も表示されなければデータは登録されている。
③文字接続エラーが出ればPDOの中身の記載が間違っている。

しかし、上記のプログラムはまだ危険な状態なので安全に設定する必要がある。

//postの値がそのまま指定されているため、SQLが意図的に壊されてDBの中身を盗まれてします恐れがある。
$db->exec('INSERT INTO memos SET memo="'.$_POST['memo'].'",created_at=NOW()')

それを解決するためにprepareメソッドを使う。

<!doctype html>
<html lang="ja">
<head>
<!-- Required meta tags -->
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

<!-- Bootstrap CSS -->
<link rel="stylesheet" href="css/style.css">

<title>PHP</title>
</head>
<body>
<header>
<h1 class="font-weight-normal">PHP</h1>    
</header>

<main>
<h2>Practice</h2>
<pre>
   <?php
   try{
     //PDOのはデータベースの種類や接続文字列などを入力する。
   $db=new  PDO('mysql:dbname=mydb;host=127.0.0.1;port=8889;charset=utf8', 'root', 'root');
   //?をいれる。prepareでセキュリティ対策
   $statement=$db->prepare('INSERT INTO memos SET memo=?,created_at=NOW()');
   $statement->execute(array($_POST['memo']));
   echo 'メッセージが登録されました';
   }catch(PDOException $e){
     echo 'DB接続エラー:'.$e->getMessage();
   }
   ?>
</pre>
</main>

</body>    
</html>

input.html
スクリーンショット 2020-11-11 21.20.23.png

input_do.php
スクリーンショット 2020-11-11 21.20.57.png

データの一覧・詳細画面を作る

phpmyadiminを使わずに画面で見れるようにする。
ファイル名をmemo.phpとする。

memo.php
<!doctype html>
<html lang="ja">
<head>
<!-- Required meta tags -->
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

<!-- Bootstrap CSS -->
<link rel="stylesheet" href="../css/style.css">

<title>PHP</title>
</head>
<body>
<header>
<h1 class="font-weight-normal">PHP</h1>    
</header>

<main>
<h2>Practice</h2>
<?php
//以下の記述でPHPからDBに接続できる。MAMPの場合、パスワードはrootになる。
try{
  //new PDO(DBを扱う)でオブジェクトのインスタンスを作っている。
  $db = new PDO ('mysql:dbname=mydb;host=127.0.0.1;port=8889;charset=utf8', 'root', 'root');
  //接続できなければ$eという形で受け取り、それを画面に出力する。
}catch(PDOException $e){
  echo 'DB接続エラー:' . $e->getMessage();
}
//以下の記述でmemosという変数の中idが1のdbの内容が入っている。
$memos = $db->query('SELECT * FROM memos WHERE id=1');
$memo = $memos->fetch();
?>
<article>
  <pre><?php print($memo['memo']);?></pre>
  <a href="index.php">戻る</a>
</article>
</main>
</body>    
</html>

memo.php/1にアクセスすると1番目の詳細がみれる。
スクリーンショット 2020-11-11 22.01.24.png

一覧画面と詳細画面の連携

IDの部分を自由にしたい場合

<!doctype html>
<html lang="ja">
<head>
<!-- Required meta tags -->
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

<!-- Bootstrap CSS -->
<link rel="stylesheet" href="css/style.css">

<title>PHP</title>
</head>
<body>
<header>
<h1 class="font-weight-normal">PHP</h1>    
</header>

<main>
<h2>Practice</h2>
<?php
//以下の記述でPHPからDBに接続できる。MAMPの場合、パスワードはrootになる。
try{
  //new PDO(DBを扱う)でオブジェクトのインスタンスを作っている。
  $db = new PDO ('mysql:dbname=mydb;host=127.0.0.1;port=8889;charset=utf8', 'root', 'root');
  //接続できなければ$eという形で受け取り、それを画面に出力する。
}catch(PDOException $e){
  echo 'DB接続エラー:' . $e->getMessage();
}
//以下の記述でrecordsという変数の中にdbの内容が入っている。
$memos = $db->query('SELECT * FROM memos ORDER BY id DESC');
?>
<article>
   <?php while ($memo = $memos->fetch()): ?>
    <!-- 以下の記載で表示する文字数を0~50字に設定。aタグに詳細ページのリンクを設定 -->
      <p><a href="memo.php?id=<?php print($memo['id']);?>"><?php print(mb_substr($memo['memo'],0,50)); ?></a></p>
      <time><?php print($memo['created_at']); ?></time>
      <hr>
   <?php endwhile; ?>
</article>
</main>
</body>    
</html>

しかし、今のままだとURLにID=何番 と表示されてしまうのでユーザーに自由に書き換えられてしまう。

以下の記述でマイナスなどの数字、数字以外の文字の場合はエラーが表示されるようにできる。

memo.php
<!doctype html>
<html lang="ja">
<head>
<!-- Required meta tags -->
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

<!-- Bootstrap CSS -->
<link rel="stylesheet" href="css/style.css">

<title>PHP</title>
</head>
<body>
<header>
<h1 class="font-weight-normal">PHP</h1>    
</header>

<main>
<h2>Practice</h2>
<?php
//以下の記述でPHPからDBに接続できる。MAMPの場合、パスワードはrootになる。
try{
  //new PDO(DBを扱う)でオブジェクトのインスタンスを作っている。
  $db = new PDO ('mysql:dbname=mydb;host=127.0.0.1;port=8889;charset=utf8', 'root', 'root');
  //接続できなければ$eという形で受け取り、それを画面に出力する。
}catch(PDOException $e){
  echo 'DB接続エラー:' . $e->getMessage();
}

//$idが数字以外が指定された時、if構文の内容が反映される。
$id=$_REQUEST['id'];
if(!is_numeric($id) || $id<=0){
print('1以上の数字で指定してください');
exit();
}

//prepareでセキュリティ対策
$memos = $db->prepare('SELECT * FROM memos WHERE id=?');
$memos->execute(array($_REQUEST['id']));
$memo = $memos->fetch();
?>
<article>
  <pre><?php print($memo['memo']);?></pre>
  <a href="index.php">戻る</a>
</article>
</main>
</body>    
</html>

接続プログラムを共通プログラムに

今のままなどデータが変わった後全部のファイルを書き換える必要性が出てくるのでそれをなくす。

requireを使って他のファイルを取り込む。

index.php
<!doctype html>
<html lang="ja">
<head>
<!-- Required meta tags -->
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

<!-- Bootstrap CSS -->
<link rel="stylesheet" href="css/style.css">

<title>PHP</title>
</head>
<body>
<header>
<h1 class="font-weight-normal">PHP</h1>    
</header>

<main>
<h2>Practice</h2>
<?php
//以下の記述でdbconnect.phpファイルを読み込む。
require('dbconnect.php');


//以下の記述でrecordsという変数の中にdbの内容が入っている。
$memos = $db->query('SELECT * FROM memos ORDER BY id DESC');
?>
<article>
   <?php while ($memo = $memos->fetch()): ?>
    <!-- 以下の記載で表示する文字数を0~50字に設定。aタグに詳細ページのリンクを設定 -->
      <p><a href="memo.php?id=<?php print($memo['id']);?>"><?php print(mb_substr($memo['memo'],0,50)); ?></a></p>
      <time><?php print($memo['created_at']); ?></time>
      <hr>
   <?php endwhile; ?>
</article>
</main>
</body>    
</html>
input_do.php
<!doctype html>
<html lang="ja">
<head>
<!-- Required meta tags -->
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

<!-- Bootstrap CSS -->
<link rel="stylesheet" href="css/style.css">

<title>PHP</title>
</head>
<body>
<header>
<h1 class="font-weight-normal">PHP</h1>    
</header>

<main>
<h2>Practice</h2>
<pre>
   <?php
   require('dbconnect.php');
   //?をいれる。prepareでセキュリティ対策
   $statement=$db->prepare('INSERT INTO memos SET memo=?,created_at=NOW()');
   $statement->execute(array($_POST['memo']));
   echo 'メッセージが登録されました';
   ?>
</pre>
</main>

</body>    
</html>
memo.php
<!doctype html>
<html lang="ja">
<head>
<!-- Required meta tags -->
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

<!-- Bootstrap CSS -->
<link rel="stylesheet" href="css/style.css">

<title>PHP</title>
</head>
<body>
<header>
<h1 class="font-weight-normal">PHP</h1>    
</header>

<main>
<h2>Practice</h2>
<?php
require('dbconnect.php');
//$idが数字以外が指定された時、if構文の内容が反映される。
$id=$_REQUEST['id'];
if(!is_numeric($id) || $id<=0){
print('1以上の数字で指定してください');
exit();
}

//prepareでセキュリティ対策
$memos = $db->prepare('SELECT * FROM memos WHERE id=?');
$memos->execute(array($_REQUEST['id']));
$memo = $memos->fetch();
?>
<article>
  <pre><?php print($memo['memo']);?></pre>
  <a href="index.php">戻る</a>
</article>
</main>
</body>    
</html>

ページネーション

以下の記述でページが指定されなかった場合も1ページ目が自動で表示される。

memo.php
<!doctype html>
<html lang="ja">
<head>
<!-- Required meta tags -->
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

<!-- Bootstrap CSS -->
<link rel="stylesheet" href="css/style.css">

<title>PHP</title>
</head>
<body>
<header>
<h1 class="font-weight-normal">PHP</h1>    
</header>

<main>
<h2>Practice</h2>
<?php
//以下の記述でdbconnect.phpファイルを読み込む。
require('dbconnect.php');

if(isset($_REQUEST['page']) && is_numeric($_REQUEST['page'])){
  $page=$_REQUEST['page'];
}else{
  $page=1;
}

$start=5*($page-1);

//LIMIT区を使って件数を表示できる。
$memos = $db->prepare('SELECT * FROM memos ORDER BY id DESC LIMIT ?,5');
//数字でパラメータを渡すことができるようになる。
$memos->bindParam(1,$start,PDO::PARAM_INT);
$memos->execute();
?>
<article>
   <?php while ($memo = $memos->fetch()): ?>
    <!-- 以下の記載で表示する文字数を0~50字に設定。aタグに詳細ページのリンクを設定 -->
      <p><a href="memo.php?id=<?php print($memo['id']);?>"><?php print(mb_substr($memo['memo'],0,50)); ?></a></p>
      <time><?php print($memo['created_at']); ?></time>
      <hr>
   <?php endwhile; ?>
</article>
</main>
</body>    
</html>

リンクで前のページや次のページに行けるようにする

<!doctype html>
<html lang="ja">
<head>
<!-- Required meta tags -->
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

<!-- Bootstrap CSS -->
<link rel="stylesheet" href="css/style.css">

<title>PHP</title>
</head>
<body>
<header>
<h1 class="font-weight-normal">PHP</h1>    
</header>

<main>
<h2>Practice</h2>
<?php
//以下の記述でdbconnect.phpファイルを読み込む。
require('dbconnect.php');

if(isset($_REQUEST['page']) && is_numeric($_REQUEST['page'])){
  $page=$_REQUEST['page'];
}else{
  $page=1;
}

$start=5*($page-1);

//LIMIT区を使って件数を表示できる。
$memos = $db->prepare('SELECT * FROM memos ORDER BY id DESC LIMIT ?,5');
//数字でパラメータを渡すことができるようになる。
$memos->bindParam(1,$start,PDO::PARAM_INT);
$memos->execute();
?>
<article>
   <?php while ($memo = $memos->fetch()): ?>
    <!-- 以下の記載で表示する文字数を0~50字に設定。aタグに詳細ページのリンクを設定 -->
      <p><a href="memo.php?id=<?php print($memo['id']);?>"><?php print(mb_substr($memo['memo'],0,50)); ?></a></p>
      <time><?php print($memo['created_at']); ?></time>
      <hr>
   <?php endwhile; ?>

   <!-- 2ページ以上の時表示 -->
   <?php if($page>=2):?>
   <a href="index.php?page=<?php print($page-1);?>"><?php print($page-1);?>ページ目へ</a>
   <?php endif; ?>
   |
   <a href="index.php?page=<?php print($page+1);?>"><?php print($page+1);?>ページ目へ</a>
</article>
</main>
</body>    
</html>

件数の多いレコードをページを分ける

余分なページを表示しなくて済む

index.php
<!doctype html>
<html lang="ja">
<head>
<!-- Required meta tags -->
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

<!-- Bootstrap CSS -->
<link rel="stylesheet" href="css/style.css">

<title>PHP</title>
</head>
<body>
<header>
<h1 class="font-weight-normal">PHP</h1>    
</header>

<main>
<h2>Practice</h2>
<?php
//以下の記述でdbconnect.phpファイルを読み込む。
require('dbconnect.php');

if(isset($_REQUEST['page']) && is_numeric($_REQUEST['page'])){
  $page=$_REQUEST['page'];
}else{
  $page=1;
}

$start=5*($page-1);

//LIMIT区を使って件数を表示できる。
$memos = $db->prepare('SELECT * FROM memos ORDER BY id DESC LIMIT ?,5');
//数字でパラメータを渡すことができるようになる。
$memos->bindParam(1,$start,PDO::PARAM_INT);
$memos->execute();
?>
<article>
   <?php while ($memo = $memos->fetch()): ?>
    <!-- 以下の記載で表示する文字数を0~50字に設定。aタグに詳細ページのリンクを設定 -->
      <p><a href="memo.php?id=<?php print($memo['id']);?>"><?php print(mb_substr($memo['memo'],0,50)); ?></a></p>
      <time><?php print($memo['created_at']); ?></time>
      <hr>
   <?php endwhile; ?>

   <!-- 2ページ以上の時表示 -->
   <?php if($page>=2):?>
   <a href="index.php?page=<?php print($page-1);?>"><?php print($page-1);?>ページ目へ</a>
   <?php endif; ?>
   <?php 
   $counts=$db->query('SELECT count(*) as cnt FROM memos');
   $count=$counts->fetch();
   $max_page=ceil($count['cnt']/5);
   if($page < $max_page):
   ?>
   |
   <a href="index.php?page=<?php print($page+1);?>">
   <?php print($page+1);?>ページ目へ</a>
   <?php endif; ?>
</article>
</main>
</body>    
</html>

メモを編集、変更する

update.php
<?php require('dbconnect.php');?>
<!doctype html>
<html lang="ja">
<head>
<!-- Required meta tags -->
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

<!-- Bootstrap CSS -->
<link rel="stylesheet" href="css/style.css">

<title>PHP</title>
</head>
<body>
<header>
<h1 class="font-weight-normal">PHP</h1>    
</header>

<main>
<h2>Practice</h2>
<?php 
if(isset($_REQUEST['id'])&& is_numeric($_REQUEST['id'])){
  $id=$_REQUEST['id'];

  $memos=$db->prepare('SELECT * FROM memos WHERE id=?');
  $memos->execute(array($id));
  $memo=$memos->fetch();
}

?>
<form action="update_do.php" method="post">
  <!-- 以下の記述でデータを編集画面に渡す。 -->
  <input type="hidden" name="id" value="<?php print($id);?>">
  <textarea name="memo" cols="50" rows="10"><?php print($memo['memo']);?></textarea><br>
  <button type="submit">登録する</button>
</form>
</main>

</body>    
</html>
update_do.php
<!doctype html>
<html lang="ja">
<head>
<!-- Required meta tags -->
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

<!-- Bootstrap CSS -->
<link rel="stylesheet" href="css/style.css">

<title>PHP</title>
</head>
<body>
<header>
<h1 class="font-weight-normal">PHP</h1>    
</header>

<main>
<h2>Practice</h2>
<pre>
   <?php
   require('dbconnect.php');

   $statement=$db->prepare('UPDATE memos SET memo=? WHERE id=?');
   $statement->execute(array($_POST['memo'],$_POST['id']));
   ?>
</pre>
<p>メモの内容を変更しました</p>
<p><a href="index.php">戻る</a></p>
</main>

</body>    
</html>
memo.php
<!doctype html>
<html lang="ja">
<head>
<!-- Required meta tags -->
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

<!-- Bootstrap CSS -->
<link rel="stylesheet" href="css/style.css">

<title>PHP</title>
</head>
<body>
<header>
<h1 class="font-weight-normal">PHP</h1>    
</header>

<main>
<h2>Practice</h2>
<?php
require('dbconnect.php');
//$idが数字以外が指定された時、if構文の内容が反映される。
$id=$_REQUEST['id'];
if(!is_numeric($id) || $id<=0){
print('1以上の数字で指定してください');
exit();
}

//prepareでセキュリティ対策
$memos = $db->prepare('SELECT * FROM memos WHERE id=?');
$memos->execute(array($_REQUEST['id']));
$memo = $memos->fetch();
?>
<article>
  <pre><?php print($memo['memo']);?></pre>
  <a href="update.php?id=<?php print($memo['id']);?>">編集する</a>
  |
  <a href="index.php">戻る</a>
</article>
</main>
</body>    
</html>

削除機能

delete.phpを作成

delete.php
<!doctype html>
<html lang="ja">
<head>
<!-- Required meta tags -->
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

<!-- Bootstrap CSS -->
<link rel="stylesheet" href="css/style.css">

<title>PHP</title>
</head>
<body>
<header>
<h1 class="font-weight-normal">PHP</h1>    
</header>

<main>
<h2>Practice</h2>
<pre>
   <?php
   require('dbconnect.php');
   if(isset($_REQUEST['id']) && is_numeric($_REQUEST['id'])){
     $id=$_REQUEST['id'];
     $statement=$db->prepare('DELETE FROM memos WHERE id=?');
     $statement->execute(array($id));
   }

   ?>
</pre>
<p>メモを削除しました。</p>
<p><a href="index.php">戻る</a></p>
</main>

</body>    
</html>
memo.php
<!doctype html>
<html lang="ja">
<head>
<!-- Required meta tags -->
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

<!-- Bootstrap CSS -->
<link rel="stylesheet" href="css/style.css">

<title>PHP</title>
</head>
<body>
<header>
<h1 class="font-weight-normal">PHP</h1>    
</header>

<main>
<h2>Practice</h2>
<?php
require('dbconnect.php');
//$idが数字以外が指定された時、if構文の内容が反映される。
$id=$_REQUEST['id'];
if(!is_numeric($id) || $id<=0){
print('1以上の数字で指定してください');
exit();
}

//prepareでセキュリティ対策
$memos = $db->prepare('SELECT * FROM memos WHERE id=?');
$memos->execute(array($_REQUEST['id']));
$memo = $memos->fetch();
?>
<article>
  <pre><?php print($memo['memo']);?></pre>
  <a href="update.php?id=<?php print($memo['id']);?>">編集する</a>
  |
  <a href="delete.php?id=<?php print($memo['id']);?>">削除する</a>
  |
  <a href="index.php">戻る</a>
</article>
</main>
</body>    
</html>
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む