2010-03-24 11 views
7

모든 PHP 프로젝트에서 mysqli로 전환하는 것을 고려하고 있습니다. 내 코드가 쓰여지는 방법 (나는 아주 간단한 웹 사이트를 실행하고 그들 모두에 걸쳐 사용하는 내 자신의 기본 프레임 워크를 구축했다) 함수와 클래스를 수정하는 데 너무 많은 문제가 있어서는 안된다.mysqli로 전환하는 것이 좋습니다.

그러나 준비된 구문에 대해 긍정적 인 말을 들었습니다. PHP 함수에 대한 몇 가지 불만을 표시했습니다. 특히 mysql_fetch_array를 잠시 사용하는 간단한 대체 방법이 부족합니다.

사실 너무 좋게 들리므로 속도와 리소스 사용과 같은 준비된 문을 사용하여 문제를 강조 할 수 있는지 궁금합니다.

답변

2

준비된 문에 대한 프로그래밍은 쿼리 문자열에 변수를 추가하는 데 익숙하다면 약간 익숙해집니다. MySQL은 위치 매개 변수를 사용합니다 (쿼리에 대체 바가 속하는 곳에 물음표가 포함됩니다). 가장 좋은 방법은 이것을 기존 데이터베이스 추상화에 넣는 것입니다. 그 추상화가 제대로 작성 되었다면 어쨌든 래퍼 외부에서 mysql_fetch_array를 호출하면 안됩니다.

이 문제에 대한 해결책은 모든 행을 미리 수집하는 것입니다.하지만 당연히 1000 행을 검색하지 않고 첫 번째 행만 묻는 것으로 가정합니다. 이것은 mysqli에 관계없이 변경해야하는 변경 사항입니다.

마지막으로 일부 문은 가변 개수의 인수와 함께 in('x', 'y', 'z') 구문을 사용하는 쿼리와 같은 매개 변수로 쉽게 대체되지 않습니다. 이 작업을 수행 할 수는 있지만 쿼리를 생성하고 실행할 수 있도록 데이터베이스 추상화를 강화해야합니다.

그러나 성능과 안전면에서 그만한 가치가 있습니다. PHP 측의 추가 처리는 일반적으로 MySQL 측의 쿼리에 대한 캐시 된 실행 계획보다 중요하며, 가장 일반적인 SQL 주입 취약점의 영향을받지 않습니다. 도움이

희망, 조

+0

감사합니다. mysqli를 살펴보고 클래스를 만들었습니다. (코드를 직접 작성하지 않고 실험에 사용했지만 확실하게 조정할 수 있습니다.) SQL 인젝션은 제가 사용하기를 원하는 유일한 이유입니다. 그러나 나는 잠재적 인 성과에 대해 걱정하고 있습니다. 준비된 명령문을 사용할 때 캐싱에 대한 내용을 원래 방법과 비교할 때 읽지 않은 것들을 읽었습니다. – Rob

2

준비된 문은 당신이 그들에게 익숙해지면 다시 탈출 함수를 사용하는 고통스러운있어 너무 좋다. 기간.

그러나 내가 사용 해본 모든 DB 라이브러리 (oci8 및 sqlsrv ... 포함)는 하나의 버크 또는 다른 버젼을 소개합니다. 그래서 기본적으로 난 길의 기능을 제공하는 사용자 정의 클래스의 간단한 세트를 사용하는 어떤 라이브러리 캡슐화 내가 좋아하는 :

  • 이름을 기반으로 매개 변수 : 연관 배열에 값에 의해 전달 WHERE foo = :foo
  • 매개 변수를 (오히려) 개별 PHP 변수 결합보다 : $params = array('foo' => 33)
  • 한줄 실행 : $res = $Db->query($sql, $params);
  • 결과 집합은 반복자 인터페이스를 구현하는 오브젝트이므로 I 함께 루프 수 foreach($res as $row)

이러한 정책을 채택하면 정확한 구문 또는 기능 설정이 덜 중요 해집니다.

거의 모든 라이브러리에서 수행 할 수 있지만 네이티브 param 바인딩을 제공하면 도움이됩니다. 예를 들어 데이터 유형을 추측 할 필요가 없습니다.또한 트랜잭션과 같은 일부 고급 기능은 단순한 mysql 함수로 간단히 수행 할 수 없습니다.

PDO는 좋은 대안이었을 수 있지만 드라이버의 대부분은 기본적으로 버려 졌으므로 함정을 즐기는 동안 DB를 불가 지론적인 추상화 계층의 이점을 실제로 잃어 버렸습니다.

IMHO, 당신이 묻는 단순한 사실은 당신이 mysqli에게 기회를 주어야한다고 제안합니다.

관련 문제