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

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

新規登録して質問してみよう
ただいま回答率
85.49%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

4回答

1632閲覧

MyPDOの課題「以下のPHPの改善案をまとめよ」(多くの意見お願いします)

Kyosinhei0801

総合スコア10

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2015/11/11 10:21

編集2015/11/11 11:55

私はプログラマ志望の専門学生なのですが学校のLinuxの課題で「以下のPHPの改善点を挙げ修正、簡潔にまとめなさい」というのが出され、頭の悪い私にはどこをどう改善すればいいのか全くわからず頭を悩ませております。どうかご意見をこと細かく教えてくれますようよろしくお願いします。

<?php class MyPDOClass { private $dbtype; private $dbhost; private $dbuser; private $dbpass; private $dbname; private $dbchar; private $dsn; private $pdo; private $stmh; private $error; private $holderAry; function __construct($type,$host,$user,$pass,$db,$charset = "utf8") { $this->dbtype = $type; $this->dbhost = $host; $this->dbuser = $user; $this->dbpass = $pass; $this->dbname = $db; $this->dbchar = $charset; $this->dbdsn = $type . ":host=" . $host . ";dbname=" . $db . ";charset=" . $charset; $this->pdo = null; if(DEBUG) { echo $this->dsn ."\n"; } } function __destruct() { $this->close(); } public function connect() { try { $this->pdo = new PDO($this->dsn, $this->dbuser, $this->dbpass); $this->pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); $this->pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); return true; } catch(PDOException $ex) { $this->error = $ex->getMessage(); return false; } return true; } public function close() { if($this->pdo != null) { $this->pdo = null; } } public function getError() { return $this->error; } public function insert($table,$colStr,$valStr) { $colAry = explode(",", $colStr); $valAry = explode(",", $valStr); if(count($colAry) != count($valAry)) { $this->error = "カラム名の数と値が一致しません"; return false; } if (!$this->prepare($this->getPreSQLInsert($table,$colAry,$colStr))) return false; if (!$this->bindValues($valAry)) return false; if (!$this->execute()) return false; return true; } public function getPreSQLInsert($table,$colAry) { //$this->holderAry = array(); $sql = "INSERT INTO " . "(" . $colStr . " ) VALUES( "; for($i = 0; $i < count($colAry); $i++) { $sql .= ":val" . $i; if($i < count($colAry) - 1) { $sql .= ", "; } array_push($this->holderAry, ":val" . $i); } $sql .= " )"; if(DEBUG) { echo $sql . "\n"; } return $sql; } public function prepare($sql) { try { $this->stmh = $this->pdo->prepare($sql); } catch(PDOException $ex) { $this->error = $ex->getMessaga(); return false; } return true; } public function bindValues($valAry) { try { for($i = 0; $i < count($this->holderAry); $i++) { $this->stmh->bindValue($this->$holderAry[$i],trim($valAry[$i])); } } catch(PDOException $ex) { $this->error = $ex->getMessage(); return false; } return true; } public function execute() { try { $this->stmh->execute(); } catch(PDOException $ex) { $this->error = $ex->getMessaga(); return false; } return true; } public function delete($table, $whereStr = " 1 = 1 " ,$valStr = "") { //$cnt = 0; $valAry = array_filter(explode(",", $valStr),"strlen"); $sql = $this->getPreSQLDelete($table, $whereStr); if (count($this->holderAry)!= count($valAry)) { $this->error = "プレースホルダの数と値の数が一致しません"; return -1; } if(!$this->prepare($sql)) return -1; if(!$this->bindValues($valAry)) return -1; if(!$this->execute()) return -1; return $this->stmh->rowCount(); } public function getPreSQLDelete($table,$whereStr) { $sql = "DELETE FROM " . $table . " WHERE " . $whereStr; $this->getHolders(whereStr); if(DEBUG) { echo $sql . "\n"; } return $sql; } public function getHolders($whereStr) { $this->holderAry = array(); $wordAry = preg_split("/[\s=><\/\*\-\+%]/", $whereStr); $wordAry = preg_grep("/^:.*/", $wordAry); $this->holderAry = array_merge($wordAry); } public function update($table,$colStr,$upValStr,$whereStr = "1=1",$whereValStr = "") { $colAry = explode(",", $colStr); $upValAry = explode(",", $upValStr); $whereValAry = array_filter(explode(",", $whereValStr),"strlen"); $sql = $this->getPreSQLUpdate($table,$colAry,$whereStr); $valAry = array_merge($whereValAry,$upValAry); if(count($this->holderAry) != count($valAry)) { $this->error = "プレースホルダのかずと値の数が一致しません"; return -1; } if(DEBUG) { print_r($valAry); } if(!$this->prepare($sql)) return -1; if(!$this->bindValues($valAry)) return -1; if(!$this->execute()) return -1; return $this->stmh->rowCount(); } public function getPreSQLUpdate($table,$colAry,$whereStr) { $sql = "UPDATE " . $table . " SET "; $this->getHolders($whereStr); for($i = 0; $i < count($colAry); $i++) { $sql .= $colAry[$i] . " = :val" . $i; array_push($this->holderAry,":val" . $i); if ($i < count($colAry)- 1) { $sql .= ", "; } } $sql .= " WHERE " . $whereStr; if(DEBUG) { echo $sql > "\n"; print_r($this->holderAry); } return $sql; } } ?>

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ikuwow

2015/11/12 01:10

コードは見やすいようにmarkdown記法でシンタックスハイライトしていただけるとありがたいです。
退会済みユーザー

退会済みユーザー

2015/12/03 06:58

こちらの質問が他のユーザから「質問の範囲が広すぎる」という評価を受けています わからない点を明確にし、調査したこと・試したことと共に記入していただくと、回答が得られやすくなります。
guest

回答4

0

ご自分の回答を書いて、それに付いて意見を求めるようにすると良いと思います。
問題をそのまま書いて、それの回答を求めるというのは安易すぎます。

投稿2015/11/11 12:30

katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

どれどれと読み始めたら面白かったので、
面白かった箇所を共有します。

学校のLinuxの課題で「以下のPHPの改善点を挙げ修正、簡潔にまとめなさい」

Linuxの課題でPHPとは見上げたPHPerですね

class MyPDOClass

  • AnimalClassのように「Class」が名前に含まれている時点でおかしい
  • せめてPDOを継承して欲しい

コンストラクタの引数とプライベート変数の山

PDOは簡潔にした結果あのDSNなのに、引数だらけにして何がしたいんだろう?
せめてコンフィグファイルからそのまま持ってこれるように配列で受け取れるべき。

try ~ catchの使い方

これぞThe PHPerという感じ。
例外投げて死んでくれないといざエラーが出たときになにもわからん。

簡潔にまとめなさい

最初の数行でこんなに見つかるのに、簡潔にまとめろ…だと…?
「もう突っ込み疲れたよ…こんなオレオレじゃなくて素直にPDO使わせて」←簡潔にまとめた

投稿2015/11/11 15:11

編集2015/11/11 15:13
miyabi-sun

総合スコア21158

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

miyabi-sun

2015/11/11 15:38

因みに上記上げたのはほとんど設問とは関係ないと思われる突っ込みどころです。 英語の先生に「うはwww先生の発音マジカタカナwww」とイチャモンつけるようなものです。 この調子で読み進めていくともっとまずい箇所が見つかるはずなので頑張って! 本気で悩んだ回答と、模範解答、楽しみに待ってます。
miyabi-sun

2015/11/12 02:01

今見返すとtry ~ catchは全て戻り値をBooleanで受け取って、 falseだったら$this->errorの文字列を取りに行く設計思想なんですね。 それはそれで一貫性が取れてるから「エラーが出たらどうすんねん?」は解消されそうです。 しかし、これを使う側は全ての処理を「逐一」ifで評価して、もしfalseだったら…ってやるわけですね。 ソースコードがif文だらけになって読めなくなるから自分の中ではNGです。
guest

0

提示のソースコードではシンタックスエラーがあるので、「以下のPHPの改善点」どころか、論外ですね。せめてシンタックスエラーがない状態から「改善」なら回答しますが…

シンタックスエラーぐらいIDEが指摘してくれます。

イメージ説明


読んでおきましょう
回答のつきやすい質問を投稿するための心がけ

また学校や会社等の課題の丸写しや丸投げ等は質問者の成長とはなりませんし、質問者が自分が問題を解決する気がないと受け取られてしまい回答がつかないことがあります。自分でどこまで考えたか、どの部分がわからないのかを問題を分解して個別に質問をすると回答がつきやすくなります。

投稿2015/11/11 10:29

編集2015/11/11 11:05
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Kyosinhei0801

2015/11/11 10:36

よろしければそのエラーの修正、それからの「改善」、それらのコードをお教えいただけないでしょうか?
退会済みユーザー

退会済みユーザー

2015/11/11 10:40

シンタックスエラーくらいは自分で直してください。IDEでも使っていれば、自動で指摘してくれることなので、他人の労力を使ってまですることではありません。
Kyosinhei0801

2015/11/11 11:19

エラーについては追々修正します ですが本題の改善点についての意見を教えて頂きたいのですが
退会済みユーザー

退会済みユーザー

2015/11/11 11:30 編集

じゃあ、一個だけ。 インスタンスが複数生成できてしまうので、トランザクション・コミット・ロールバック機能が使いにくいのは問題ですね。 もちろん、このファイルがどう使われるのかという前提次第なので一概に間違いと言えるものではありません。
guest

0

学校の課題なら、模範回答が提示されるとおもいます。
ぜひ、それを投稿してください。
それについて、teratail 上でレビューをすると、授業よりも数倍の知見が得られる可能性があります。
(先生や生徒数より、遥かに多い人の目を通ることになるので)

投稿2015/11/11 13:49

katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

katoy

2015/11/11 14:46 編集

ソフト会社中でのコードレビューに、このコードをかけたら、 レビュー以前の問題と一喝されそうな気が ... (仕様の提示はないし、コード中にコメントがほとんど無いし ... もっと教育的かつ課題としても適切なコード例と問題点列挙例を作れる方がたくさん居ると思う...)
退会済みユーザー

退会済みユーザー

2015/11/11 14:51

全く同感です…
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問