質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.54%

気付けばプロ並PHP終了

解決済

回答 7

投稿 編集

  • 評価
  • クリップ 12
  • VIEW 5,121

yuus2733

score 109

ご意見ありがとうございました。
次に進もうと思います。

以下、質問です。
タイトルの通り、「気付けばプロ並PHP」という書籍をおわらせました。次はセキュリティに関して覚えた方がいいと言われたこともあり、「体系的に学ぶ、安全なWebアプリケーションの作り方」(以下徳丸本)も買ってきて少し読みました。
ですが、「気付けばプロ並」のほうはパスワードハッシュなどが現在推奨されないものである事などを指摘されたので、「現行の、セキュリティ面などにおいても適切な」コーディングを知りたいと思いました。
その上で、徳丸本を終わらせたらいわゆる「即戦力
」として仕事ができるのでしょうか?
(仕事になるレベルでの知識が得られるサイトも教えていただけたら嬉しいです)
先ほどはスマホからの投稿なので後から追記しました。
pro_list.php

<?php

session_start();
session_regenerate_id(true);
if(isset($_SESSION['login'])==false)
{
print 'ログインされていません<br />';
print '<a href="../staff_login/staff_login.html">ログイン画面へ</a>';
exit();
}
else
{
print $_SESSION['staff_name'];
print 'さんログイン中<br />';
print '<br />';
}?>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>ろくまる農園</title>
</head>
<body>

<?php

try{
$dsn = 'mysql:dbname=shop;host=localhost;charset=utf8';
$user = 'root';
$password= '';
$dbh = new PDO($dsn,$user,$password);
$dbh -> setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);

$sql = 'SELECT code, name,price FROM mst_product WHERE 1';
$stmt = $dbh->prepare($sql);
$stmt->execute();

$dbh = null;

print '商品一覧<br /><br />';

print '<form method="post" action="pro_branch.php">';
while(true){
  $rec = $stmt -> fetch(PDO::FETCH_ASSOC);
  if($rec==false){
    break;
  }
  print'<input type="radio" name="procode" value="'.$rec['code'].'">';
  print $rec['name'].'---';
  print $rec['price'].'円';
  print'<br />';
}
print '<input type="submit" name="disp" value="参照">';
print '<input type="submit" name="add" value="追加">';
print '<input type="submit" name="edit" value="修正">';
print '<input type="submit" name="delete" value="削除">';

print '</form>';
}


catch(Exception $e){
  print 'ただいま障害発生中です。ご迷惑おかけします。';
  exit();
}

?>

<br />
<a href="../staff_login/staff_top.php">トップメニューへ</a><br />
</body>
</html>


staff_branch.php

<?php

session_start();
session_regenerate_id(true);
if(isset($_SESSION['login'])==false)
{
print 'ログインされていません<br />';
print '<a href="../staff_login/staff_login.html">ログイン画面へ</a>';
exit();
}
else
{
print $_SESSION['staff_name'];
print 'さんログイン中<br />';
print '<br />';
}?>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>ろくまる農園</title>
</head>
<body>

<?php

try{
$dsn = 'mysql:dbname=shop;host=localhost;charset=utf8';
$user = 'root';
$password= '';
$dbh = new PDO($dsn,$user,$password);
$dbh -> setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);

$sql = 'SELECT code, name,price FROM mst_product WHERE 1';
$stmt = $dbh->prepare($sql);
$stmt->execute();

$dbh = null;

print '商品一覧<br /><br />';

print '<form method="post" action="pro_branch.php">';
while(true){
  $rec = $stmt -> fetch(PDO::FETCH_ASSOC);
  if($rec==false){
    break;
  }
  print'<input type="radio" name="procode" value="'.$rec['code'].'">';
  print $rec['name'].'---';
  print $rec['price'].'円';
  print'<br />';
}
print '<input type="submit" name="disp" value="参照">';
print '<input type="submit" name="add" value="追加">';
print '<input type="submit" name="edit" value="修正">';
print '<input type="submit" name="delete" value="削除">';

print '</form>';
}


catch(Exception $e){
  print 'ただいま障害発生中です。ご迷惑おかけします。';
  exit();
}

?>

<br />
<a href="../staff_login/staff_top.php">トップメニューへ</a><br />
</body>
</html>


pro_add_check.php

<?php

session_start();
session_regenerate_id(true);
if(isset($_SESSION['login'])==false)
{
print 'ログインされていません<br />';
print '<a href="../staff_login/staff_login.html">ログイン画面へ</a>';
exit();
}
else
{
print $_SESSION['staff_name'];
print 'さんログイン中<br />';
print '<br />';
}?>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>ろくまる農園</title>
</head>
<body>

<?php

//if (isset($_POST["name"]) &&
//     isset($_POST["pass"]) &&
//     isset($_POST["pass2"])
// ) {
require_once('../common/common.php');

$post=sanitize($_POST);
    $pro_name = $post["name"];
    $pro_price = $post["price"];
    $pro_gazou = $_FILES["gazou"];



// }
if($pro_name == '' ){
print '商品名が入力されていません<br />';
}
else
{
print '商品名:';
print $pro_name;
print '<br />';
}

if(preg_match('/^[0-9]+$/',$pro_price)==0)
{
print '価格をきちんと入力してください<br />';
}
else
{
  print '価格:';
  print $pro_price;
  print '円<br />';
}

if($pro_gazou['size'] > 0)
{
  if($pro_gazou['size'] > 1000000)
  {
  print '画像が大きすぎます';
}

else
{
    move_uploaded_file($pro_gazou['tmp_name'],'./gazou/'.$pro_gazou['name']);
    print '<img src="./gazou/'.$pro_gazou['name'].'">';
    print '<br />';
}
}




if($pro_name=='' || preg_match('/^[0-9]+$/',$pro_price)==0 ||$pro_gazou['size']>1000000)
{
print '<form>';
print '<input type="button" onclick="history.back()" value="戻る">';
print '</form>';
}

else
{
      print '上記の商品を追加します';
      print '<form method="post" action="pro_add_done.php">';
      print '<input type="hidden" name="name" value="'.$pro_name.'">';
      print '<input type="hidden" name="price" value="'.$pro_price.'">';
      print '<input type="hidden" name="gazou_name" value="'.$pro_gazou['name'].'">';
      print '<br />';
      print '<input type="button" onclick="history.back()" value="戻る">';
      print  '<input type="submit" value="OK">';
      print '</form>';

}



?>

</body>
</html>


見直してすぐに疑問だったところ二つのファイルを挙げさせてもらいます。
➀SQLやパスワードのやり取りをする上でこれで安全なのか知りたいです。
➁他のファイルなのですが、使用者側のログイン・会員登録・削除と管理側のページが行き来できる事に危険性はないのか
➂preg_match で、半角英・数字を扱う文の書き方を教えていただきたいです。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • kei344

    2017/06/11 21:58

    質問が元のものから変わっています。一旦解決済みにした上で別途個別に質問されてはいかがでしょうか。

    キャンセル

  • yuus2733

    2017/06/11 22:26

    そうですね、明日改めて書籍のコードを写したファイルを見直して投稿してみます。

    キャンセル

回答 7

+15

案件のレベルにもよりますが,概ね仕事で使う上で必要となってくるのは

  • MVCフレームワークの動作原理および使い方
  • Webセキュリティ
  • HTTPプロトコルの基礎
  • Linuxのコマンドライン操作
  • Gitコマンドの操作
  • Composerコマンドの操作
  • MySQLの基礎およびインデックスを用いた高速化

このあたりでしょうか。全部重要ですが,即戦力を語るなら太字にした部分ぐらいはできないと話にならないと思います。あと場合によってはDockerとかも要りますね。

また敢えて書籍の評価については触れませんが,書籍でサンプルとして作成したWebサイトと,あなたが将来的に仕事で作りたいと考えるレベルのWebサイト,どの程度一致していますか?これもまた判断指標になると思います。例えば1990年代半ばの掲示板を作るのと,TwitterやFacebookのようなSNSを作るのは格段にレベルが違います。まず後者のようなサイトはPHPだけでは実現することができず,JavaScriptに関しても深い知識が求められます。

あなたが考える「プロ」はどのレベルですか?


【追記1】

➀SQLやパスワードのやり取りをする上でこれで安全なのか知りたいです。

いろいろ直したいところはかなり多いのですが,セキュリティ的にはひとまず問題ないレベルではあります。

➁他のファイルなのですが、使用者側のログイン・会員登録・削除と管理側のページが行き来できる事に危険性はないのか

あ,そこにお気づきですか,着眼点はいいと思います。要するにこれは実用性は考えてないので,そもそも使用者と管理者が一緒くたにされています。もしこれでECサービスを作るとしたら恐ろしい話ですね。

➂preg_match で、半角英・数字を扱う文の書き方を教えていただきたいです。

「半角英数字が最低1文字含まれている」という正規表現の例としては,
/[A-Za-z0-9]/ /[a-z0-9]/i /[a-z\d]/i などいろいろ書き方はありますが,お好きなものをどうぞ。それとも

こういうものをお求めでしょうか?

あと、手が空いたら挙げていただいた項目で、お勧めの書籍などあったら教えていただきたいです。

書籍ではなくWebサイトですが…

まずこれらを読んでみて,既に書いてみた書籍のサンプルと比較するといいと思います。 "いろいろ直したいところはかなり多い" と最初に存じ上げた意味がわかると思います。

また,書籍を挙げるとすればこれですかね。

何のサポートも無しにこれだけを渡して「初心者向けの本だよ」と薦められるものではありませんが,脱初心者~中級者ぐらいの読者対象に対して難しめの内容を分かりやすくイラストつきで教えている良書だと,書店で立ち読みして感銘を受けた記憶があります。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/06/11 21:31

    「ぼくが考えるプロのレベル」ですか・・・ 理想・目標はもちろん高い方がやりがいも、達したときの感動も、大きいと思ってます。なのでTwitter・facebookくらいの物を作ったり、phpなどを使ったゲーム作成にも関われるならそれが理想です。あと、手が空いたら挙げていただいた項目で、お勧めの書籍などあったら教えていただきたいです。

    キャンセル

+9

私の身の回りで、『本に書いていることくらいは完全にマスター』して
いる人は、正直いないと思います。私も含めて。単に自分のレベルが
低いだけかもしれませんが。

それでも、周りから即戦力だと思われて、何とか案件をこなしています。
本に書いてあることは、実務のうちのごく一部だということではないかと。

一歩踏み出してみればいいんじゃないでしょうか。やってみて自分に
足りないところがもしあれば、そこで追加で勉強すればいいんだし。
別に実務をやっているから勉強できないということはないはずです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

checkベストアンサー

+7

「終わらせる」というのが、
「書籍に記述されているすべてのコードとその仕組みを理解して、自分で設計/コーディングが出来るようになっている」という事であれば、適切な監督者の居る職場/現場や、要件の緩い案件であれば即戦力になると思います。

逆に、「ざっと読んで演習問題を一回終わらせた」くらいであれば、未経験新卒で入社して数か月くらいのレベルかと思います。
場合によってはこの状態でプロとして仕事を出来る場合もありますし、そうではない場合もあります。

(仕事になるレベルでの知識が得られるサイトも教えていただけたら嬉しいです)

「仕事になる」というのが、どのレベル/形態を想定されているのかを明確にすると、良い回答があるかもしれません。
例えば、

  • フリーランスとして一人で完結する様な小規模案件を取ってみたい
  • フリーランスとして専門家の知識が当然求められる現場にジョインしたい
  • 新卒/第二新卒/未経験中途採用といった枠でエンジニアになりたい
  • 法人を設立して、受託開発を本格的に行いたい
  • 自社サービスを開発して売りたい

など、エンジニアとしてのスキル以外に必要なことが求められるケースとそうでないケースなど様々あります。

ただ、サイトにしても学校にしても書籍にしても、
実務を行わずに実務レベルの能力を習得するのは基本的にとても難しいことなので、
最終的に自分がしたいことを明確にしたうえで、可能な範囲/時期に実務に取り組むほかないかと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/06/11 22:25

    それならば、書籍を見て作ったファイルを理解するためのノートを作り、手順を書きこんでいくという
    やり方が必須でしょうか。
    やっぱり、見たものをすぐに覚える・理解する・実践できるような天才に近づきたいです(苦笑)

    話が逸れました。どういう勉強方法・実践をしているのか教えていただけませんか?

    キャンセル

  • 2017/06/11 23:52

    コツコツ積み上げるタイプの友人はメモ用のWebサービス(名前思い出せない)を使ってMarkdownでいろいろメモしてましたね。それで,ある程度まとまった文章が書けるようになってきたら,自分だけではなく他人へ啓示する目的も含めてQiitaに書く,という感じでした。

    キャンセル

  • 2017/06/12 22:11

    > それならば、書籍を見て作ったファイルを理解するためのノートを作り、手順を書きこんでいくという
    やり方が必須でしょうか。

    覚え方/学習の仕方は人によるとしか言えないと思います。
    とにかくコードを書いたり作ったりした方が学習が早い人もいますし、特定の言語ではなく情報処理やプログラム、アルゴリズムの基礎からじっくりやった方が結果的に早い人もいます。

    *私の場合は「気付けばプロ並PHP」と似たようなレベルの書籍で作ったアプリケーションを自分で作ってみる、わからないところがあったらそこが理解していないところなのでもう一度書籍を読んで理解していないところを確認する。という事をしました。
    著者が厳選してくれている、初心者にとって必要だと思われるごく限られた範囲についてまず十分に理解するというのが、次のステップに行くための近道だと思っています。

    キャンセル

+6

○○を読み込んだら「即戦力」とかないですよ
本の課題なんていくらこなしたところで、基本的に答えがあることばかりでしょう
実務でいろいろな経験をして、いろいろ冷汗かいて、やっと即戦力じゃないでしょうか?
仕事を甘く考えすぎです
もちろんコピペコーダーなら即戦力かもしれませんが、そういうことじゃないんですよね

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+6

「気付けばプロ並PHP」の内容を確認してみました。
ショッピングサイトを一から作るという学習方法みたいですね。
これをやり終えてから質問者様はこれ以外に実際に何かサイトを作りましたか?
PHPの仕事はショッピングサイトだけではないので、ショッピングサイト以外のサイトを何かひとつでもいいので作ってみることをお勧めします。

「即戦力」として仕事ができるのでしょうか?

どんな本をやったとしても「即戦力」は無理だと思います。
「即戦力」になるには、やはり経験です。
本に書いてあった通りの仕事があれば即戦力になれるでしょうけど、そんなのありませんからね。
どんな内容の仕事にも柔軟に対応できる力がないと、即戦力にはなれません。
即戦力にこだわらず、ある程度の技術を身に着けたら、どこかの会社に入った方が良いと思いますよ。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/06/12 15:15

    今回BAに選ばせていただいたtanatさんの[書籍に記述されているすべてのコードとその仕組みを理解して、自分で設計/コーディングが出来るようになっている]事を目指すという事でしょうか。
    先週末に書籍を完遂したばかりなので次の情報収集をしている段階です。
    しかし、自分でwebサービスを立ち上げるにしても構想・立案が要りますね…
    少し時間かかりそうです。
    どこかの会社に入る、を念頭に活動をしてみようと思ってます。

    キャンセル

  • 2017/06/12 15:27

    tanatさんの回答とは相反しますが、書籍に書かれていることを全て理解する必要はないと思います。
    もちろん全て理解していれば良いですが、良く使うものは覚えるにしても、使用頻度が少ないようなものまで頭に叩き込む必要はないと思います。
    必要になった時に、「そういえばあの本に書いてあったな」と読み返せばよいのです。

    webサービスとまでいかなくても、個人的に使うツールであったり、どこかのサイトの真似であったり、そんなものを作ってみると良いと思います。
    要は、書籍のように答えがあるものではなく、答えがないものを自力で作ってみた方が良いということです。

    キャンセル

+5

即戦力ってどのような現場を想定しているんでしょうか。
気にするくらいならどこでもいいから現場に入って仕事をしてみるといいでしょう。
知識や技術を身に着けただけでは仕事はできないというを自らの身をもって経験してからが始まりです。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+4

セキュリティ面で本に書いてあることなら、それを破ろうとするような方はもっと上の知識を持ってるでしょう。即戦力といわれるためには+αが必要なんじゃないでしょうか。その現場のレベルが低ければ即戦力と呼ばれるかもしれませんね。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.54%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る