적은 코드로 멋진 일을 하고 싶어하다.바보 같은 짓이다.
디버깅을 위한 코드를 꼭 삽입하라 .
( 오류처리 로직과 같은 중요 요소를 넣지 않는 행위를 이름 )
<?php
1 -- $pdo = new PDO("mysql:dbname=test;host=db.example.com", //<callout id="co.see.anti1"/>
"dbuser", "dbpassword");
$sql = "SELECT bug_id, summary, date_reported FROM Bugs
WHERE assigned_to = ? AND status = ?";
2 -- $stmt = $dbh->prepare($sql); //<callout id="co.see.anti2"/>
3 -- $stmt->execute(array(1, "OPEN")); //<callout id="co.see.anti3"/>
4 -- $bug = $stmt->fetch(); //<callout id="co.see.anti4"/>
1. DB 접속에 대한 오류 처리 없음
2. SQL 문장에 대한 오류 처리 없음
3. 2 번 스텝 오류시, 오류 발생 가능
4. 1 번 스텝 오류시, 오류 발생 가능
SQL 만들어 내는 코드를 보지말고, SQL 자체를 보라
<?php
$sql = "SELECT * FROM Bugs";
if ($bug_id) {
$sql .= "WHERE bug_id = " . intval($bug_id);
}
$stmt = $pdo->prepare($sql);
==>
SELECT * FROM BugsWHERE bug_id = 1234
에러에 대해 정말 아무것도 할 것이 없다면 에러 검사를 생략할 수 있다.
close() 함수.... Memory Leak....
실수의 원인을 인지할 수 있는 기회를 가져야 복구 할 수 있다.
에러가 발생할 수 있는 모든 호출에 대해 상태를 확인하는 코드
<?php
try {
$pdo = new PDO("mysql:dbname=test;host=localhost",
"dbuser", "dbpassword");
} catch (PDOException $e) { //<callout id="co.see.soln1"/>
report_error($e->getMessage()); return;
}
$sql = "SELECT bug_id, summary, date_reported FROM Bugs
WHERE assigned_to = ? AND status = ?";
if (($stmt = $pdo->prepare($sql)) === false) { //<callout id="co.see.soln2"/>
$error = $pdo->errorInfo();
report_error($error[2]);
return;
}
if ($stmt->execute(array(1, "OPEN")) === false) { //<callout id="co.see.soln3"/>
$error = $stmt->errorInfo();
report_error($error[2]);
return;
}
if (($bug = $stmt->fetch()) === false) { //<callout id="co.see.soln4"/>
$error = $stmt->errorInfo();
report_error($error[2]);
return;
}