Skip to content

Instantly share code, notes, and snippets.

@CodeIQ
Created October 11, 2012 10:04
Show Gist options
  • Save CodeIQ/3871386 to your computer and use it in GitHub Desktop.
Save CodeIQ/3871386 to your computer and use it in GitHub Desktop.
20121022_1
<?php
/**
* セプテーニ営業実績登録スクリプト
*/
// 今月の営業マン別売上情報
$SALES_DATA = array(
array('salesperson_id'=>1, 'salesperson_name'=>"佐藤", 'sales_volume'=>20000000),
array('salesperson_id'=>2, 'salesperson_name'=>"武藤", 'sales_volume'=>8900000),
array('salesperson_id'=>3, 'salesperson_name'=>"瀬戸口", 'sales_volume'=>50000000),
);
$db = new SepteniDB();
//登録営業マン数
$insertSalespersonNumber = 0;
//売上合計金額
$totalSalesVolume = 0;
foreach($SALES_DATA as $sales){
//トランザクション開始
$result = $db->begin();
if(!$result){
echo 'SQL failed: ' . __LINE__, PHP_EOL;
continue;
}
// 営業マンマスタ登録
$sql = "INSERT INTO SALESPERSON SET SALESPERSON_ID=?, SALESPERSON_NAME=?;";
$result = $db->execute($sql, array($sales['salesperson_id'], $sales['salesperson_name']));
if(!$result){
echo 'SQL failed: ' . __LINE__, PHP_EOL;
continue;
}
// 売上情報登録
$sql = "INSERT INTO SALES SET SALES_DATE=CURDATE(), SALES_VOLUME=?, SALESPERSON_ID=?;";
$result = $db->execute($sql, array($sales['sales_volume'], $sales['salesperson_id']));
if(!$result){
echo 'SQL failed: ' . __LINE__, PHP_EOL;
continue;
}
//コミット
$result = $db->commit();
if(!$result){
echo 'SQL failed: ' . __LINE__, PHP_EOL;
continue;
}
// 登録営業マン数をインクリメント
$insertSalespersonNumber ++;
// 売上合計金額に加算
$totalSalesVolume += $sales['sales_volume'];
}
//レポート情報の登録
$sql = "INSERT INTO SALES_REPORT SET SALES_DATE=CURDATE(), INSERT_SALESPERSON_NUMBER=?, TOTAL_SALES_VOLUME=?;";
$db->execute($sql, array($insertSalespersonNumber, $totalSalesVolume));
exit;
/**
* Septeniデータベースクラス
*
*/
class SepteniDB {
public $_dbh = null;
function __construct(){
$dsn = 'mysql:dbname=testdb;host=127.0.0.1';
$user = 'dbuser';
$password = 'dbpass';
try {
$this->_dbh = new PDO($dsn, $user, $password);
} catch (PDOException $e) {
echo 'Connection failed: ' . $e->getMessage();
}
return $this->_dbh;
}
/**
* クエリ実行
*/
function execute($sql, $bindParams=array()){
$sth = $this->_dbh->prepare($sql);
try {
$sth->execute($bindParams);
} catch (PDOException $e) {
echo 'SQL error: ' . $e->getMessage();
return false;
}
return true;
}
/**
* トランザクション開始
*/
function begin(){
try {
$this->_dbh->beginTransaction();
$this->execute("set autocommit=0");
} catch (PDOException $e) {
echo 'Transaction begin failed: ' . $e->getMessage();
return false;
}
return true;
}
/**
* コミット処理
*/
function commit(){
try {
$this->_dbh->commit();
} catch (PDOException $e) {
echo 'commit failed: ' . $e->getMessage();
return false;
}
return true;
}
/**
* ロールバック処理
*/
function rollback(){
try {
$this->_dbh->rollBack();
} catch (PDOException $e) {
echo 'rollback failed: ' . $e->getMessage();
return false;
}
return true;
}
}
@DQNEO
Copy link

DQNEO commented Oct 30, 2012

これではプログラマの能力をはかれないと思います。

①固有ライブラリ、DB製品に依存している。
PDOとMySQLの組み合わせに馴れている人が有利です。
たとえば普段PostgreSQLで開発してる人は、バグを再現するのにMySQLのインストールからやらないといけなくて、30分では終わりません。

たとえばcodeparにはりつけてもバグは再現しない。
http://codepad.org/vdUH4TMW

②仕様、バグの内容、個数が書いていない。

バグの個数くらいは書いた方がよいのではないでしょうか。

③バグじゃないけど変なコードがある。
例えばコンストラクタ内で return $this->_dbh;と無駄なコードがあります。
この問題のゴールは「バグ修正」なので、直すべきかどうか判断に迷います。
もしコードのきれいさで評価されるなら直すのが正解、対応時間で評価されるなら直さない方が正解、ということになります。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment