2013-02-26 3 views
2

이것은 내가 생각하기에 무작위적인 질문이며 스타일과 조직과 관련이 있습니다. 필자는 PDO를 사용하여 MySQL 데이터베이스에 연결하는 웹 응용 프로그램을 가지고 있으며 일부 스크립트에서는 동일한 테이블을 염려하지 않는 쿼리가 많이 발생합니다. 즉, 하나의 SELECT 문을 실행 한 다음 일부 값에 따라 다른 UPDATE 및 다른 DELETE로 이동합니다.PHP 스크립트에서 여러 개의 mysql 쿼리를 구성하는 코드에 대한 생각

나는 최근에 PHP와 MySQL을 배웠고 확실하지 않았기 때문에 조심스럽게 모든 문제를 쉽게 찾을 수 있었기 때문에 (그리고 약간의 ocd와 항문 때문에 어리석은 일에 관해서도 동일성을 보였습니다. 모든 쿼리에서 양식)를 코딩 내가 어떤 문제가 발생할 것 (캐치/TRY)과 주사와 유효하지 않은 문자 (준비)에 대한 안전을 위해 어디 찾을 수

try { 
    $statement = " 
     UPDATE/SELECT ... 
     FROM/SET ... 
     WHERE ..."; 
    $query = $dbcnx->prepare($statement); 
    $flag = $query->execute(); 
} 
catch (PDOException $e) { 
    $errorMsg = "..."; 
    error_log($errorMsg,3,'../../xxx.log'); 
    $response = ...; 
    $dbcnx->null; 
    return $response; 
} 
$result = $query->fetch/fetchAll/fetcColumn... 

그래서 다음과 같은 형식을 사용 (I 몇 가지 개인 수표를 가지고 있었다 그러나 나는 확실히 기능을 위해 더 좋을 것이라고 확신한다).

내가 하나 개 또는 두 개의 쿼리가 괜찮다고하지만 코드가 성장 후에는 약간의 액션/물질에 대한 조금 너무 많은 코드가되었다가있을 때

(하나 개의 쿼리에 16 개 라인 ...처럼) 그래서 내가 좋아하는 것 어떤 조언. 내 코드를 더 쉽게 관리 할 수있게하려면 어떻게해야합니까? 구조에 대한 내 논리에 근본적인 오류가 있습니까 (내가 작성한 방식)? try/catch를 사용하기위한 규칙이 있습니까? 개발과 디버깅을 위해 더 많은 것이 있습니까? 이후에 일부 블록을 제거 할 수 있습니까?

나는이 코드 블록의 기능을 매개 변수로 사용하여 호출하는 것을 고려하고 있었다. 그래서 그냥 본체에 쿼리를 입력 한 다음 준비되고 실행 된 다음 결과를 반환하는 함수를 호출합니다. 물론 나는 항상 fetchAll을 사용하여 연관 배열을 반환 할 것이지만 데이터 집합이 작을수록 메모리 사용량은 좋을 것이라고 생각합니다. (요즘 시스템에서는 어떤 차이라도 느껴야합니다.) ..

모든 의견을 환영합니다.

실제로 코드와 설정, S/W 및 프로그램과 관련하여 여기에 다른 질문이 있지만 실제로는 정신을 따르기를 바랍니다.

+3

귀하의 질문은 codereview.stackexchange.com에 더 적합 할 수 있습니다. – j08691

+2

이 질문은 codereview에 대한 것이 아닙니다. 검토 할 것이 없습니다. 이 코드는 OP가 현재 사용하고있는 실습을 보여주는 스케치입니다. 그것은 Stackoverflow에 대한 완벽한 질문입니다. "나에게 오타가 있음"질문의 99 % 이상. ** 왜 모두가 Stackoverflow에서 좋은 프로그래밍 질문을 멀리하기를 열심입니까? ** 유일한 이유가 무엇인지 모르시는 경우 닫지 마십시오. –

답변

3

우선, 훌륭한 질문에 감사드립니다.
놀랍게도 더 나은 코드 관행을 요구하는 질문은 거의 없습니다.
아무도 코드 품질을 신경 쓰지 않지만 모든 사람이 코드 복사/붙여 넣기를 요구하며 사용자가 가지고있는 것을 신경 쓰지 않습니다.

  1. 시켜 try..catch이 뛰어난 (말장난하지 않음) 연산자 :

    다음, 당신이 알아야 할이 큰 일이 있습니다. 처리 할 코드에 따라 복구 할 수있는 오류에 대해 매우 자주 사용되어야합니다. 오류를 기록하기 위해 그것을 사용하는 것은 치명적인 죄이며 귀하고 강력한 메커니즘의 낭비입니다.

  2. 정말로 필요한 것은 데이터베이스 추상화 계층으로 모든 더러운 작업을 처리하고 복잡한 경우를 처리하는 것입니다.

예외를 읽어야합니다.
구문 강조로 프로그래밍 언어에서 가장 큰 개선점입니다.
그들은 즉시 잡힌 의도가 아닙니다. 요점은 하나의 예외 처리기가있는 중앙 집중식으로 예외를 잡아내는 것과는 상당히 상반됩니다.

핸들러가 없어도 Exeptions 충분합니다. 잘못된 쿼리는 스크립트를 중단시키고 503 오류를 표시하며 PHP 설정에 따라 오류 메시지를 기록하거나 화면에 표시합니다. 더 이상 필요하지 않습니다!

그래서, 그냥 모든 것을 처리 코드 제거하기 그냥 오류
ini_set('log_errors',1); 
ini_set('error_log','/path/to/log'); 

를 로그인 할 때 사용하는 파일 PHP에게 당신이 극적으로 적은 코드와 같은 결과를 얻을 것이다. 추상화 라이브러리로

, 당신의 코드를 보면 의미있는 경우에만 하나있는

$statement = "UPDATE/SELECT FROM/SET ...   WHERE ..."; 
$query = $dbcnx->prepare($statement); 
$flag = $query->execute(); 
$result = $query->fetch/fetchAll/fetcColumn... 

라인.

$result = $db->getRes($statement); //okay, leaving query separate for readability 

그냥 당신이 할 수있는 방법에 대한 아이디어를 제공하기 위해 - - 그것에게 이미 라인을 만들 수없는 이유는

내 자신의 database abstraction class
그것은 mysqli의 상단을 기반으로하지만,에 쉽게 쓸 수있다 PDO를 포함한 다른 드라이버

+0

감사합니다. 내 시도/캐치 사용이 낭비 였음을 알았습니다 ... 느낌이 떨어지는 일이 분명했습니다. 코드를 확인하고 잘하면 이해할 것입니다. –

+0

좋아요 ... 생각합니다. 반에 조금 더 읽어야하지만 나는 그것을 얻었다고 생각합니다. 나는 조금 더 혼란 스러웠다. 왜냐하면 나는 고전적인 프로그램에서 수업의 예를 생각하고 있었기 때문이다. 여기 스크립트가 새로이 호출 될 때마다 인스턴스를 다시 만들고 인스턴스로 수행 할 작업을 수행하고 작업이 끝나면 인스턴스가 삭제됩니다. 나는 내 앞에서 많은 일을한다. 나는 거의 나의 작은 웹 사이트에서 끝내었다. .. 오 잘, 살고, 배우라. –

관련 문제