PHPでMySQLのTABLEデータを表示させる2

はてブログ登録して1年たって初めてコメントもらいました。

nyan4.hatenablog.com

以前書いたMySQLのデータをテーブル表示させるやつはレコードが複数でも大丈夫だと思ってました。

コメントもらった後確認してみたらできてなかったです。
ちゃんと確認できてませんでした。
すみませんでした。

で、コメントの返答ですが下ので複数レコードも大丈夫になってるはず。
DBの接続処理は省いてます。

$sql = 'SHOW TABLES';
$stmt = $dbh->query($sql);

while ($result = $stmt->fetch(PDO::FETCH_NUM)){
    $table_names[] = $result[0];
}

$table_datas = array();
foreach ($table_names as $key => $table_name) {
    $sql2 = "SELECT * FROM $table_name;";
    $stmt2 = $dbh->query($sql2);
    $table_datas[$table_name] = array();
    while ($result2 = $stmt2->fetch(PDO::FETCH_ASSOC)){
        $table_datas[$table_name][] = $result2;  // ここの配列への追加がまちがってた
    }
}

foreach ($table_datas as $table_name => $table_data) {
    echo "<h1>$table_name</h1>";
    if (empty($table_data)) {
        continue;
    }
    echo "<table border=1 style=border-collapse:collapse;>";
    echo "<tr>";
    // カラム名を表示
    foreach ($table_data[0] as $column_name => $val) {
        echo "<th>";
        echo $column_name;
        echo "</th>";
    }
    echo "</tr>";
    echo "<tr>";
    // レコードデータの表示
    // テーブル内のレコード数分ループ
    foreach ($table_data as $record_num => $record_data) {
         // レコード内のカラム数分ループ
        foreach ($record_data as $column_name => $val) {
            echo "<td>";
            echo $val;
            echo "</td>";
        }
        echo "</tr>";
    }
    echo "</table>";
}
?>

変数名を変えてみたけどわかりやすくなってるかな、
こんな説明でいいのだろうか…
参考になったらうれしいです。

cakephpでページを新しく追加する

自分で作ったページを表示させる

hello worldてきなもの

次を追加、編集する。

  • config/routes.php
  • src/Controller/testController.php
  • src/Template/test/index.ctp

my_app_name/config/routes.phpの編集

    /**
     * Here, we are connecting '/' (base path) to a controller called 'Pages',
     * its action called 'display', and we pass a param to select the view file
     * to use (in this case, src/Template/Pages/home.ctp)...
     */
    $routes->connect('/', ['controller' => 'Pages', 'action' => 'display', 'home']);

    /**
     * ...and connect the rest of 'Pages' controller's URLs.
     */
    $routes->connect('/pages/*', ['controller' => 'Pages', 'action' => 'display']);

    /**
     * /testでアクセスした場合testController.phpのindexメソッドを呼ぶ設定
     *  'controller' => 'hoge' が/my_app_name/src/Controller/hogeController.phpになるよう
     *  'action' => 'index' がhogeController.php内のメソッド名のよう
     */
+    $routes->connect('/test', ['controller' => 'test', 'action' => 'index');

my_app_name/src/Controller/testController.phpを作成

とりあえず必要最低限のコード(たぶん)。
actionで指定したメソッド内でrenderを呼ぶだけで表示することができる。

<?php
namespace App\Controller;

use Cake\Core\Configure;
class testController extends AppController
{
    public function index()
    {
        $this->render();
    }
}

my_app_name/src/Template/test/index.ctpの作成

ここで記述したものが表示される。
テストコードなので

<?php
Hello Cakephp
?>

とかにしました。
中身は普通のPHPファイルです。

httpd.confの変更

wellcomeページが出来たから大丈夫だと思ってましたが、
私の方ではこのままでは表示できませんでした。

ガイドを見直して、httpd.confの設定を変更しました。

<Directory />
   Options FollowSymLinks
-     AllowOverride None
+    AllowOverride All
</Directory>

AllwOverrideをAllに変更

変更したあとはいつものサーバーを再起動させます。

service httpd restart

ブラウザから確認

192.168.33.10/test/ でアクセスして

Hello Cakephp が表示ができたら成功かな

cakephpのインストール

cakephpのインストール

ホスト(windows)PC環境

ホスト(windows)PC操作

仮想環境作り

任意の場所にフォルダを作成しそのフォルダ内で
dataフォルダとvagrantフォルダを作成

example/
    data/       # <= 共有フォルダ  
    vagrant/    # <= vagrantのファイル

vagrantの初期化

コマンドラインからvagrantfileを作成(今回はcentos6で
cdでvagrantフォルダに移動して

vagrant init centos/6

vagrantfileの編集

vagrantfileを開いて以下を変更します

- #  config.vm.network "private_network", ip: "192.168.33.10"
+  config.vm.network "private_network", ip: "192.168.33.10"


- #  config.vm.synced_folder "../data", "/vagrant_data"
+  config.vm.synced_folder "../data", "/vagrant_data"


-  # config.vm.provider "virtualbox" do |vb|
+  config.vm.provider "virtualbox" do |vb|

+ vb.name = "cackephp" # virtualbox上での名前指定 # お好みで

- #   vb.memory = "1024"
+   vb.memory = "1024"

-  # end
+  end

vagrantの起動

cdでvagrantフォルダに移動して

vagrant up

ゲスト(centos)PC操作

ターミナルから仮想環境に接続する

rootに変更

su -

yum更新

yum update -y

必要なものを入れる

php5.6のインストール

そのまま入れようとするとphpが5.3なのでepelリポジトリ、remiリポジトリを入れる
php5.6を入れた理由は特になし(php5.6以上でも多分大丈夫だと思う

yum install -y epel-release
rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-6.noarch.rpm
rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm

php5.6のインストール

  • php-intl,php-xmlがないとcomposerを動かしたときにerrorが出た
  • php-pdo,php-mysqlndがないとcakephpのwelcomeページがでないでerrorがでた
yum install -y --enablerepo=remi,remi-php56 php php-intl php-mbstring php-xml php-pdo php-mysqlnd

ついでにmysqlのインストール
メモ:入れなくてもcakephpのWelcomeページは出る

yum install -y mysql mysql-server mysql-devel 

composerのインストール

composerのインストール

curl -sS https://getcomposer.org/installer | php

composerをパスが通っている場所に移動

mv composer.phar /usr/local/bin/composer

CakePHP プロジェクト作成

CakePHP プロジェクトを作成
コードはガイドから

cd /vagrant_data/
composer self-update && composer create-project --prefer-dist cakephp/app my_app_name

DocumentRootの設定

/etc/httpd/conf/httpd.confを編集して
/my_app_name/webrootをDocumentRootに設定する

- DocumentRoot "/var/www/html"
+ #DocumentRoot "/var/www/html"
+ DocumentRoot "/vagrant_data/my_app_name/webroot"

httpd起動

SElinuxを切っておく
切らないで動かしたらhttpdのdefaultページが表示された

setenforce 0

httpdの起動

service httpd start

ホストからアクセス

ブラウザから192.168.33.10にアクセスするとwelcomeページが表示される

お疲れ様でした。

dockerfileからcentosを動かすまで

前回dockerからcentosを動かすまでをやりました。
日おいたあとまた動かそうとすると手順を思い出しながらやるか手順をメモっておくとか
若干手間がかかります。

dockerfileを作っておけばそういう手順がなくなりますよ。という説明です。
(dockerfileが手順書みたいなもの)

Dockerfileを作る

#
FROM centos

#
# MAINTAINER 

#
RUN yum -y update
RUN yum -y install httpd

RUN systemctl enable httpd

Dockerfileをbuildしてimageを作る

docker build -t <name>:<tag> <path>

tagはなくてもいい
centosを入れるimageなので

docker build -t centos .

とかにする

CONTAINERの起動

docker run --privileged --name centos -d -v /vagrant_data/php/data:/var/www/html -p 80:80 centos /sbin/init
  • --name で centosの名前でCONTAINER起動
  • -v でVOLUMEの指定
  • -p でportの指定

確認

virtualboxを入れたPCから192.168.33.10でdocker内のテストwebページが見れたら成功

dockerでcentosを動かすまで

vagrant upでcentosを動かしたところから

dockerをインストール

yum -y install docker-io

dockerの起動

systemctl start docker

centosイメージをダウンロードする

docker pull centos:7

centosイメージからコンテナを作成する

  • コンテナ名をcentos
  • ポート8000でアクセスしたときを80に繋げる
  • –privilegedを入れてコンテナ内でもsystemctlを使えるようにする(webサーバー動かすとき必要)
docker run --privileged --name centos -d -p 8000:80 docker.io/centos:7 /sbin/init

コンテナにアクセスする

docker exec -it centos /bin/bash

コンテナ内のcentosにwebサーバー(httpd)をインストールする

yum -y install httpd

webサーバー(httpd)を動かす

systemctl start httpd

ゲスト内でwebサーバーが動いてるか確認

curl 127.0.0.1

webサーバーが動いていればテストページのコードが表示されるはず

ホスト(VirtalBoxをインストールしてるPC)からゲストのコンテナのwebサーバー(httpd)にアクセスする

コンテナから抜ける

exit

or

Ctrl-p Ctrl Q

ブラウザで次の192.168.33.10:8000にアクセスする。
vagrantの初期設定であれば次のURLでつながる。
コンテナのwebサーバーにアクセスできれば成功

192.168.33.10:8000/

TwitterAPI でツイートが省略されてしまう

TwitterAPI でツイートが省略されてしまう

いまごろですがTwitterAPIでツイートを取得する~をためしていたのですが。

長いツイートの場合最後が省略されて全文取得できないことで悩んでました。

どうやら公式での更新で115文字目まで表示でそれ以降は省略されてしまうようです。

togetter.com

Upcoming changes to Tweets — Twitter Developers

調べてみたら半年以上前のことでしたね。

で、省略されずに表示する方法。

TwitterOAuthを使っているのですが

$tweets = $connection->get("search/tweets", [
  "q" => '"#twitter"',
  "lang" => "ja",
  "count" => 1,
  "result_type" => "recent",
  "tweet_mode" => "extended" #ここ必要
]);

getでoptionに"tweet_mode" => "extended" を追加します。

すると取得データにfull_textが追加されるので、
これを使うことで全テキストを表示することが出来ます。

使う側としては全テキストがほしいのにデフォルトで使えないのは躓きそうですね。

php7.0のmbstringをインストールする

お久しぶりです。

自分が上げる記事なんてネットの海にはいくつもあるから書く必要なんてないよなー
とか考えてたら2ヶ月もたってました。

ひとでの人だったりくまのひとだったりそんなこと考えるなーってブログあがってて
読んだりもしました、 でもまぁ考えちゃんですよね。

2ヶ月さぼってた間もちょこちょこPV増えててちょっと嬉しかったりもします。

とりあえず続けることが大事かなかなーということで
小さい記事ですが2ヶ月ぶりのPHPメモです。

yumでinstall可能なmbstringの表示コマンド

installが可能なmbstringを確認する

#yum list | grep mbstring

remiのバージョン忘れたときのコマンド

#yum info --enablerepo=remi php

どのremiでinstallすればいいかわからなくなったときに確認するコマンド。
日を置くといくつだったか忘れちゃうので確認する方法も。
大体はPHPのバージョンと同じだとおもう

対応するremiを指定してmbstringをinstallする

#sudo yum -y install --enablerepo=remi-php70 php-mbstring

installしたらhttpdの再起動を行う

#sudo systemctl restart httpd