2019年4月13日
Swiperを設置したホームページが完成したので、PHPのホームページの中に掲示板も設置してみようかなと思います。
PHPって、本当に面白いです。
2019年4月20日
最初にMySQLのデータベースのテーブルを設定しました。
kimassi_userデータベースで、user_id ,user_name ,user_nickname ,user_email ,user_password ,user_juusyo
kimassi_toukouデータベースで、toukou_id ,toukou_comment ,toukou_date ,toukou_bukken ,toukou_user_id
です。
2019年4月28日
大苦戦しています。
ネットでPHPの掲示板の検索をしてますがPHP7対応の物がほとんどなく、そのままちょっとした改造で使えるものは見つかりません。
その中でも、https://manablog.org/php7-review-bulletin-board/ のサイトが最も求めるものに近いかなと思い、それを基本にして掲示板を作る事にしました。
ただ、この掲示板のプログラムはデータベースの接続方法が最新のPDOを採用してないので、苦戦は覚悟していました。
最初は、データベースの構造も自分向けに改造し、しかも一挙にPDO対応で作ろうと思ったのですが、どうもうまく動作しなく、とりあえずはデータベースの構造だけ変更して、データベースMySQLへの接続方式は、$mysqliでMySQLに接続する仕様のままで動作確認をして、それからPDO対応に改造する方針に切り替えました。
なんで、これだけ苦戦しているのかというと、PHPファイルが単独で動作していないので、複数のファイルが完璧になって初めて正常に動作するのです。しかもデータベースを使うので、共通の仕様にする必要のある部分もあって、ファイルを1つ1つ仕上げていくという訳にはいかないのです。
2019年4月29日
なんとか、すべての機能を動作させることに成功しました。
かなり手を加えました。
これからPDO仕様に改造します。
2019年5月2日
$mysqliでMySQLに接続するプログラムをPDOでMySQLに接続する仕様に作り変えるのはかなり大変です。
今まで気づいたことをなんでもメモしておきます。
function login_user($user_email,$user_name,$user_nickname,$user_tel,$user_juusyo,$user_password,$pdo)
では使用するすべてのカラムの変数と、 $stmt = $pdo->prepare($sql); の変数$pdoを必ず記載する必要があります。
$stmt = $pdo->prepare( について、変数名$stmt、変数名$pdoは関係するプログラムすべてで統一する必要があります。自分で使う変数を統一しておく癖をつけておいたほうが良いようです。
if文で条件が同値の場合は == 条件が2つの分岐は elseif
他のページでも変数の値を受け取れる$_SESSION変数を使う場合は、$_SESSION変数が登録されていない場合の処置(if文)も必要。$_SESSION[‘log’]の場合は
if (!isset($_SESSION[‘log’]))
$_SESSION変数を使う場合は、session_start();が必要で、同じページ内で重複して使うとエラーになるので、functionのページには挿入しないほうが良い。
functionのページには2つの内容のfunctionは入れないほうが良い。
http://localhost/hudousan/public/detail.php?no=1 の1を取得して他のページでも使う場合は
$_SESSION[‘id’]= $_GET[‘no’];
2019年5月5日
なかなか正常に動作しなくて、悩み続けていたのですが、結局、MYSQLの設定が変わっていて、AUTO_INCREMENTが正常に動作していなかったのが主な原因でした。
$sqlの登録
$stmt = $pdo->prepare($sql);
$stmt->execute();
は正常に行われていたのですが、それを実行
$stmt->execute();
しても動作しなかったのです。
$sqlの内容を、直接 MySQLのSQLで直接記入し(copy&pasteできないので)実行させたのですが、何の反応もなく動作しませんでした。
それでプログラムの不備でなくてMYSQLの構造に不備がある事が判明しました。
テーブルtoukou にはtoukou_id というカラムがあるのですが、AUTO_INCREMENTが、うまく動作していなかったようです。
それにいたるまで、Yhooの知恵袋でも、いろいろ教わったし、勉強にもなりました。
次は、投稿内容を運営者と出品者にMAILを送るようにする事です。
を参考に
XAMPP環境でメールを送る場合はSMTPの設定をC:\xampp\php\php.ini([mail function]のところの変更)、C:\xampp\sendmail/sendmail.ini のSMTPの設定を書き換えました。
Apacheの再起動をしてから設定が有効になりました。
無事、正常に動作しました。
次に、ユーザー登録で、住所と電話番号は任意にしました。
入力があれば、入力を登録し、入力が無ければnullを登録します。
住所と電話番号のカラムはnullでも対応できるようにMySQLを設定しておきます。
if(isset($_POST[‘user_tel’])){$user_tel = $_POST[‘user_tel’];}
else{$user_tel =null;}
if(isset($_POST[‘user_juusyo’])){$user_juusyo = $_POST[‘user_juusyo’];} else{$user_juusyo = null;}
掲示板単独では動作するようになったので、ページの内部に掲示版を挿入しようと思います。
2019年5月6日
XAMPP上ですが、ページの内部に掲示版を挿入することに成功しました。
やったね!!
よく見ると、スタイルシートが外部のサイトと接続して参照されているので、そのサイトが閉鎖されたり移転されると正常に表示されなくなる心配があるので、変更が必要だと気づきました。
2019年5月7日
XAMPP上ですが、ページの内部に掲示版を挿入することに成功しました。
http://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js
https://maxcdn.bootstrapcdn.com/bootstrap/3.3.0/js/bootstrap.min.js
リンク先のスタイルシートは自分のサイトにインストールすることも可能なようです。BootstrapからDownload Bootstrapをクリックしてダウンロードして、解凍したファイルについて
Bootstrapの公式サイトからダウンロードしたCSSファイル「bootstrap.css他」をCSSフォルダ(元々CSSフォルダに入っている)に入れる。
Bootstrapの公式サイトからダウンロードしたJavascriptファイル「bootstrap.js他」をJSフォルダ(元々JSフォルダに入っている)に入れる。
jQueryの公式サイトからダウンロードしたjavascriptファイル「jquery.min.js」をJSフォルダに入れる。
無事、動作しました。
2019年5月9日
いろいろと試行錯誤して、PDO::FETCH_ASSOC や #result =$stml_>fetch(); などFETCH関数は意味も分からずむやみに使わない方が良いようです。
MySQLからデータを取り込む場合は
$sql=”SELECT user_id,user_email,user_name,user_nickname,user_tel,user_juusyo,user_password
FROM user WHERE user_email = ‘$user_email'”;
$stml = $pdo->prepare($sql);
$stml->execute();
foreach($stml as $result){
$db_hashed_pwd = $result[‘user_password’];
$user_id = $result[‘user_id’];
}
みたいな感じで取得すれば良いようです。
最近、苦労してるのは、他のページやページをリダイヤルする
header(“location: ページURL”);
ですが、かなり制約があって難しいのです。
XAMPP上では正常に動作するのにインターネット上だと動作しない事もあったりします。
header()の前に文字を表示したりするとダメみたいなのですが、実際にどういう場合にはダメなのか、よくわかりません。
それとセッション変数を使っている場合に、途中で登録したデータが消えるという事です。
この2つが解決すると、PHPのプログラムでの不具合が随分減ると思います。
2019年5月10日
セッション変数に登録したデータが消える件は、解決法が見つかりました。
サーバーにあるphp.ini の編集をします。
xrea(coreserver)サーバのトップページからログインします。
php設定から自分のサイトで使っているのPHPバージョンを調べます。自分はphp7.2でした。
FTPでサーバにつなぎpublic_html配下の.fast-cgi-binフォルダ配下のphp53.ini,php54.ini,php55.ini,php56.ini,php70.ini の当該バージョンのphpXX.iniを編集します。
自分の場合はphp7.2.iniです。
session.auto_start = 0 なっているのを session.auto_start = 1 に変更してアップロードします。
これで一挙に解決しました。
ファイル上で、session_start(); が有効に動作しない場合もあるようで、session.auto_start = 1 にすると、常にセッション変数が有効になるようです。
2019年5月11日
セッション変数が記憶されない件と、メールが送れない件と同時に試行錯誤したので、何が原因でメールを送れないのかはっきりしないのですが、無事送れるようになりました。
メールは運営者である自分と、その物の売主に送るように設定しています
下記をCOPY&PASTEすると”や ‘が全角になるので注意して使ってください。
最初のプログラムでは
$to = “kimassi@spacelan.ne.jp,$adress”;
$title = ‘金沢近郊の激安の中古の戸建て物件’.$no;
$content = $add_toukou;
$from = ‘From: kimassi@spacelan.ne.jp’ . “\r\n”;
$result = mb_send_mail($to, $title, $content,$from);
if($result){
echo “メールを送信しました”;
} else {
echo “メールの送信に失敗しました”;
}
で、念のためSMTPでも送れるようなプログラムも作ってみました。
PHPMailerを使います。
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
require ‘../src/Exception.php’;//ディレクトリを確認し修正が必要
require ‘../src/PHPMailer.php’;//ディレクトリを確認し修正が必要
require ‘../src/SMTP.php’;//ディレクトリを確認し修正が必要
/* オブジェクト生成 */
$mail = new PHPMailer(true);
try {
/* サーバー設定 */
$mail->isSMTP();
$mail->SMTPAuth = true;
$mail->Host = “mail.spacelan.ne.jp”;
$mail->Username = “メールサーバーのIDを記入”;
$mail->Password = “メールサーバーのパスワードを記入”;
$mail->Port = “587”;
/* 送受信者設定 */
$mail->setFrom(“kimassi@spacelan.ne.jp”, “激安戸建て”);
$mail->addAddress(“kimassi@spacelan.ne.jp,$adress”);
$mail->addReplyTo(“kimassi@spacelan.ne.jp”, “激安戸建て”);
/* コンテンツ設定 */
$mail->CharSet = “UTF-8”;
$mail->Encoding = “base64”;
$mail->Subject = “‘金沢近郊の激安の中古の戸建て物件’.$no”;
$mail->isHTML(【HTMLメール:`true`or`flase`】);
$mail->Body = “h($add_toukou)”;
/* メール送信試行 */
$mail->send();
} catch (Exception $e) {
/* 例外処理 */
die(“Message could not be sent. Mailer Error: “.$mail->ErrorInfo);
}
SMTPでも送れるようにするには、
Exception.php 、PHPMailer.php 、SMTP.php
をアップロードしておかなければいけません。
https://github.com/PHPMailer/PHPMailer/
でダウンロードできます(srcfフォルダ内にあります)。
「C:\xampp\php\php.ini」を編集して「include_path」の項目でinclude_path=”.;C:\xampp\php\PEAR” をinclude_path=“.;C:\xampp\php\PEAR;C:\xampp\php\PHPMailer” に変更が必要です。
extension=php_openssl.dll の部分を行頭にセミコロンがあれば削除して有効化します。
これでSMTPでメールを送れるようになるはずです。
参考にしていた掲示板のサンプルプログラムでcssの制御にBootstrapが使われていたので、そのまま使っていたのですが、修正もしたいし、便利そうなのでBootstrapの勉強もしようと思います。
Bootstrapは、最も有名なWEBフレームワークだそうです。WEBページでよく使われるフォーム、ボタン、メニューなどの部品がテンプレートとして用意されていてモバイル対応にも優れているそうです。BootstrapではSwiperを使わなくても画像の入れ替えもできるようです。
2019年5月12日
Bootstrapの使い方を知らないままに、参考にしたサイトのままで使っていたのですが、選択画面の位置関係がどうしても気に入らなくて、いろいろ調べてみましたが、なかなか解決しなく苦戦していました。
結局、下記の方法で、希望の幅で表示する事が可能になりました。
(当然<head>より下で</head>より上の方に挿入します)
<STYLE>
<!–
@media (min-width: 800px) {
.container {
max-width: 800px;
}
}
–>
</STYLE>
あと、選択画面のメニューが狭い画面(スマートフォンなど)だと横線3本の表示になりますが、それをクリックしてもメニューが表示されません。ハンバーガーメニューというものらしいです。
XAMPP上では正常に動作しています。
これも解決しければいけません。
header(“location: ページURL”); が動作しない件は、他の件について試行錯誤していたら、知らない間に動作するようになりました。
プログラム上のトラブルでは無かったのかもいれません。
他のプログラムの変更以外は設定など変更したところは無いので不思議です。
ハンバーガーメニューの件も動作するようになりました。
</body> のすぐ後に
<script src=”https://kimassi.net/hudousan/js/jquery-3.4.1.min.js”></script>
<script src=”https://kimassi.net/hudousan/js/bootstrap.min.js”></script>
を入れる事と、jquery-3.4.1.min.jsをダウンロードしてアップロードすることが重要です。
それと、
https://kimassi.net/hudousan/css/bootstrap.min.css
https://kimassi.ne/hudousan/css/bootstrap-theme.min.css
については参考にしたプログラムとバージョンを合わせる事が必要ですし、念のため、ダウンロードしたBootstrapのファイルは全てアップロードしておいたほうが無難です。
http://proengineer.internous.co.jp/content/columnfeature/12468
が参考になりました。
一応、すべて完成しました。1ヶ月もかかりましたがPHPの勉強になりました。
https://kimassi.net/hudousan/hudousan.php
2019年5月19日
投稿があった時に、運営者と出品者にメールを送るようにしてあるのですが、Gmailのアドレスへ送るとメールが届かないようです。
自動送信メールはSMTP経由で送るようにした方が無難なようです。
SMTPで送るプログラム(PHPMailer使用)も作ってあったのですが、再び使うとインターネット上でもXAMPP上でも動作しなくなっていました。
おかしいなあ、以前は動作していたんだけど・・・・・・
ちなみに、spacelan ,gmail,yahoo,coreserverのいずれのサーバーで設定しても、SMTPホストへの接続ができません。
PHPMailerのバージョンとプログラムの書式の相性の問題かもしれません。
PHPMailerの使い方を説明したサイト自体が少なく、バージョンなど環境が一致しないので、なかなか自分の環境に合うものが見つからないのです。
古いバージョンのPHPMailerを使ったほうが良いようです。
2019年5月20日
PHPMailerのバージョンを6.0.7から5.2.27に入れ替えたら、gmailやcoreserverからは送れました。でもspacelanからは送れません。
それと、header(“location: ページURL”); が動作しなくなりました。メールを送る処理に時間がかかるせいかもしれません。
usleep(2000000); を入れて動作を一時停止をしても状況は変わりません。
2019年5月21日
PHPMailer使用してSMTPでメールを送ってもGmailでは受け取りを拒否するようです。
coreserverやspacelanやyahooメールでは受けとれます。
coreserverのSMTPから送る設定にしていましたが、XAMPP環境ではメールを送れていましたが、インターネット環境からはメールを送れません。
問題山積です。
spacelanからメールを送れない件はプロバイダ(金沢ケーブルテレビ)に問い合わせしておきました。
2019年5月23日
インターネット上でのPHPMailerの不具合とheader(‘Location:の不具合に苦戦しているのですが、それで、問題点を整理してみました。基本はXAMPPの環境で下記のPHPプログラムで動作確認しました。
<?php
mb_language(“japanese”);
mb_internal_encoding(“UTF-8”);
//ソースを全部読み込ませる
//パスは自分がPHPMailerをインストールした場所で
require dirname(__FILE__).’./../../php/phpmailer/PHPMailerAutoload.php’;
require dirname(__FILE__).’./../../php/phpmailer/language/phpmailer.lang-ja.php’;
//autoloderはcomposerでのインストールじゃないとないので
//あえて記述しません。
//SMTPの設定
$mail = new PHPMailer;//インスタンス生成
$mail->IsSMTP();//SMTPを作成
$mail->Host = ‘s197.coreserver.jp’;//メールの環境に合わせて
$mail->SMTPAuth = true ; // SMTP認証を有効に
$mail->CharSet = ‘utf-8’;//文字セットこれでOK
$mail->Username = ‘mail@kimassi.net’; // ユーザー名
$mail->Password = ‘***********’; // パスワードを記入
$mail ->SMTPSecure = ‘STARTTLS’ ; // TLS暗号化を有効に
$mail->Port = 587;//tlsは587でOK
$mail->SMTPDebug = 2;//2は詳細デバッグ1は簡易デバッグ本番はコメントアウトして
$mail->isHTML(true); // HTML形式のメールに設定
//メール本体
$mail->setFrom(‘mail@kimassi.net’,’激安戸建て’); //差出人の設定
$mail->Subject = ‘金沢近郊の激安の中古の戸建て物件’;//件名の設定
$mail->Body = ‘メッセージ本体coreserver’; //メッセージ本体
$mail->AddAddress(‘kanadylan@gmail.com’); // To宛先
$mail->addReplyTo(‘kimassi@spacelan.ne.jp’); //返却アドレス
$mail->addCC(‘syun@kimassi.net’); // Ccアドレス
$mail->isHTML(true);
if(!$mail->send()){
echo ‘Message could not be sent. Mailer Error: ‘, $mail->ErrorInfo;
} else {
echo ‘Message has been sent’;
}
?>
<?php
header(‘Location:https://www.yahoo.co.jp/’);
?>
XAMPP環境では上記のプログラムではSpacelanからはメールを送れませんが、gmailとcoreserverからはメールを送れました。
header(‘Location:https://www.yahoo.co.jp/’); はこれだけの内容だと機能しています。
インターネット上では
require dirname(__FILE__).’./../../php/phpmailer/PHPMailerAutoload.php’;require dirname(__FILE__).’./../../php/phpmailer/language/phpmailer.lang-ja.php’;
の部分を
require_once ‘https://kimassi.net/hudousan/phpmailer/PHPMailerAutoload.php’;
require_once ‘https://kimassi.net/hudousan/phpmailer/language/phpmailer.lang-ja.php’;
に変更しましたが動作しませんでした。
require_once ‘https://kimassi.net/hudousan/phpmailer/PHPMailerAutoload.php’;
require_once ‘https://kimassi.net/hudousan/phpmailer/language/phpmailer.lang-ja.php’;
でも動作しませんでした。
require dirname(__FILE__).’/phpmailer/PHPMailerAutoload.php’;
require dirname(__FILE__).’/phpmailer/language/phpmailer.lang-ja.php’;
にすると動作するようになりました。
絶対パスってhttps://から入れれば良いという事では無いようです。
ちなみに、階層を登ってパスする場合は
require dirname(__FILE__).’/../phpmailer/PHPMailerAutoload.php’;
require dirname(__FILE__).’/../phpmailer/language/phpmailer.lang-ja.php’;
のようにします。
もしrequireが書かれたファイルが元のPHPプログラムではなく、FUNCTIONのPHPプログラムであれば、dirname(__FILE__)はFUNCTIONのPHPプログラムの位置になります。
但し、coreserverからはメールを送れましたが、gmailからは重大なセキュリティ通知が届きました。gmailも身に覚えがあると通知したら、メールを送れるようになりました。
また、いつの間にかgmailでもPHPMailer使用してのSMTPからのメールを受け取れるようになりました。
インターネット上でのPHPMailerの不具合の原因は、絶対パスの記述方法の間違いでした。
こういうのは、ちゃんとエラー表示する設定にしておけば、すぐにわかる事なのかもしれません。
XAMPP上ではエラー表示するけど、ネット上ではエラー表示しないので、ネット上のphp.iniを触ったのだと思います。
とりあえず、プログラム製作中は、プログラム中に
ini_set( ‘display_errors’, 1 );
を入れることにしました。
メールの問題が解決したら、header(‘Location:も解決しました。
header(‘Location: は他に不具合があると正常に動作しないようです。
やっと全てが問題なく動作するようになりました。
2019年5月28日
Spacelanからのメールは、
$mail ->SMTPSecure = false; を削除して
$mail->SMTPAutoTLS = false; にすると動作しました。
同時に送ったメールの内、1つはウィルスメール扱いにされました。coreserver.jpからの転送メールです。
2020年6月13日
公開の掲示板の他に、非公開の交渉ができる交渉の部屋も設置しようかと思います。ユーザー登録した人のマイページのデータベースで、交渉内容のデータを管理します。その部屋に入るには、出品者の許可があった場合だけ可能で、その部屋入室があったことを他の人にもわかるようにしようと思います。