2011-08-26 13 views
5

우리는 1 년 넘게 개발 중이며 현재 생산 중입니다. 총 12035 건 이상이 mysql_* 건입니다.mysqli로 전환하거나 mysql을 사용 하시겠습니까?

그것은 mysqli_*

에 코드에 에게 mysql_*의 모든을 전환 할 가치가 그것은 (그리고 아마도 것)에 대해 올 수있는 모든 버그를 쫓는 가치가?

나는 호가 끝날 때마다 i을 추가하면 Changing this from MySQL to MySQLi?이 표시되기 때문에 많은 오류가 발생할 수 있습니다. 내 시간 가치가 있니?

mysql_* (예상치 못한 소문 일지라도) 장거리 이동이 가능할 것입니다. 따라서 체계적으로 전환하는 데 시간이 정말 걸릴만한 가치가 있습니까? 제 생각에는

See also this discussion

+0

PHP 팀은 향후 PHP 릴리스에서'mysql_ *'함수를 비추천 예정입니다. 읽기 : http://news.php.net/php.internals/53799 – Buddy

+2

@Buddy, "대략"라고 말하면 "어쩌면 아마도 몇 년 후에 고려할 생각을하기"를 의미 할 것입니다. 문서화를 통한 교육은 단기/중기에 일어날 것입니다. – salathe

+0

@salathe, "단기/중기"로 1-2 년을 의미하는 경우 새 프로젝트에서 'musql_ *'을 사용하면 안됩니다. 이 확장 기능은 PHP에서 사용되지 않을 것입니다. – Buddy

답변

4

:

mysqli 확장은 장점이 있습니다, MySQL의 확장 존재를 통해 향상된 주요 기능 : 문 준비을위한

  • 객체 지향 인터페이스
  • 지원
  • 다중 문의 지원
  • 트랜잭션 지원
  • 향상된 디버깅 기능
  • 임베디드 서버 지원

참고 : MySQL의 버전 4.1.3를 사용하거나하는 경우 나중에는 강하게 당신이 확장을 사용하는 것이 좋습니다.

이러한 기능 중 하나만 필요하고 리팩토링 할 여력이 있다면 그렇습니다. 그런 기능을 필요가 없다면 해보지 마십시오. 이점이없는 경우 리팩터링 할 이유가 없습니다.

On a sidenote, the rumors are true. ext/mysql will likely be deprecated (이 글을 쓰는 시점에는 아무도 말할 수 없지만 5.4로는 더 이상 사용되지 않을 것이며 영원히 pecl 확장자로 사용 가능할 것입니다.) 어쨌든 새로운 프로젝트를 시작해서는 안됩니다. ext/mysql을 더 이상 확장 할 필요가 없다.

또한 EXT/MySQL을 http://blog.ulf-wendel.de/2012/php-mysql-why-to-upgrade-extmysql/

+1

나는 (이미 천천히) 트랜잭션을 할 수있다 : http://stackoverflow.com/questions/2708237/php-mysql-transactions-examples 그리고 코드는 잘 작동하는 것 같다. – Neal

+2

OOP 지원은 절름발이 다. 준비된 문장은 느리고, 여러 문장이 삽입되기 쉽고 임베디드 서버는 어리 석다. 솔직히 실질적인 이익은 없습니다. –

+1

@Gordon, ** **은 (는) **로 대체되어야합니다. 우리가 할 수있는 것보다 더 많이 ** PHP에서 일어날 ** 것을 ** 말할 수 없습니다. – salathe

4

은, MySQLi의 장점은 객체 지향 방식으로 사용하는 경우, 그리고 준비된 문에. 트랜잭션 핸들링과 같은 훌륭한 래퍼 함수와 같은 프로 시저 스타일을 사용하여 다재다능 함을 얻을 수 있지만 사용하기 위해 코드를 다시 작성하지 않으면 충분하지 않습니다.

OO 코드 또는 준비된 문장으로 변환하려는 노력을한다면 MySQLi 대신 유연한 PDO로 변환 할 수 있습니다. 업데이트 2013년 1월

그냥이 오래된 대답을 발견하고 2011년 8월 코멘트 스레드에서 나는 mysqli_query()이 준비된 문에 첨부 움직임을 결석하는 것이 mysql_query() 통화를 변환 할 가치가 없어했다 아래. 이 방향으로 이동을 시작하려면 IS이 필요합니다. mysql_*() 확장자는 PHP 5.5에서 사용되지 않으므로 결국 제거됩니다.

+0

네,하지만 500 개 이상의 mysql_ * 호출이있는 앱을 전환 할 시간이 필요합니까? – Neal

+0

@Neal 트랜잭션 커밋/롤백 등과 같은 MySQLi의 향상된 래퍼를 사용해야하는 경우가 아니라면 말하지 않을 것입니다. –

+0

PDO가 좋은 선택이지만 공유 서버에서는 suhosin.sql.user_prefix http를 사용할 수 없습니다 : //www.hardened-php.net/suhosin/configuration.html#suhosin.sql.user_prefix – corretge

0

내 의견으로는, 당신의 논리에서 직접 mysql_ * 함수를 사용해서는 안됩니다. 래퍼를 작성해야합니다. 따라서 mysql_*mysqli_*으로 전환하려면 래퍼 코드 만 변경하면됩니다.

+0

? 어떻게 그렇게, 그리고 내 코드를 통해 버그를 방지 할 수 있습니까? – Neal

+0

버그 방지는 테스트에 따라 다릅니다. – xdazz

+0

? 그게 무슨 뜻 이죠? – Neal

1

MySQLi는 MySQL에 비해 몇 가지 성능상의 이점이 있습니다. 실제로 MySQL 대신 MySQLi를 사용하는 것이 좋습니다. 프로 시저 스타일도 사용할 수 있습니다.

앱의 새 분기를 만들고 코드를 mysqli_* 함수로 변경할 수 있습니다. 이것은 꽤 솔직해야하며 그렇게하는 동안 데이터베이스 액세스 코드를 검토하면 리팩토링을 계속하기 위해 mysqli로 전환 한 후에 계속 진행할 수 있습니다. 너무 많은 번거 로움이 있다면 이미 데이터베이스 액세스 코드에서 향상된 클라이언트 라이브러리 버전의 이점을 얻을 수 있습니다.manual for ext/mysqli 인용

+0

"MySQLi는 MySQL보다 성능면에서 이점이 있습니까?" 그게 뉴스 야, 그 정보는 어디서 났니? 그것은 항상 다른 방향 일 것 같습니다. – Pacerier

1

중단이없는 소문 참조.

그러나 실제 문제는 아닙니다.

주요 문제는 지능형 라이브러리를 사용하여 SQL 쿼리를 처리하는 대신 코드 전체에서 API 호출을 사용하고 있다는 것입니다.

그래서 라이브러리를 개발하거나 준비된 라이브러리를 만든 다음 코드를 다시 작성하여 호출을 사용하는 것이 좋습니다.

당신은이 모든 반복 물건

$res=mysql_query("SELECT STUFF"); 
while($row = mysql_fetch){ 
    $var=$row['col']; 
} 

은 매우 지루한되는 것을 볼 수 없습니까?
는 왜 안 짧고 쿼리 로깅, 계산, 디버깅, 오류 처리 등과 같은 기능을 많이 가지고 있습니다

$data = $db->getRow("SELECT stuff"); 

같은 일부 한 - 라이너를 사용 하는가?

그리고 이러한 라이브러리를 사용하는 부작용으로 인해 API 호출을 변경해야하는 유일한 곳은이 라이브러리 코드입니다.

0

전화가 많은 경우 데이터베이스 호출에 대한 추상화 계층을 구현 (선택 또는 구축) 한 다음 변환하는 것이 좋습니다.

내 비슷한 연습에서 가장 큰 이점은 mysqli가 mysql_real_escape_string 등을 그대로두고 매개 변수화 된 명령문을 제공한다는 사실이었습니다.그러나 하나에서 다른지도로의지도는 거의 일대일로 이루어지지 않습니다.

+0

당신은'추상화 계층 '을 사용하는 두 번째 사람입니다. 어떻게해야합니까? – Neal

+0

PDO는 추상화 계층입니다. 이는 절차 언어에서 일어나는 일에 더 가깝고 일반적으로 더 풍부하고 개념적으로 일관된 메서드와 속성을 제공합니다. 또는 예를 들어 내가 작성한 클래스는 $ db-> SqlExecute ($ sql), SqlRows ($ sql), SqlOneRow ($ sql), SqlExists ($ sql) 및 SqlOneValue ($ SQL). 편하지 않은 패턴을 캡슐화합니다. 내 개인적인 취향은 SQL과 PHP 사이에 매우 얇은 필터를 사용하는 것입니다. – dkretz

+0

@Neal PDO는 절름발이 추상 레이어입니다. 좀 더 믿을만한 것을 찾는 것이 더 낫습니다 –

0

조언 : 스위치를 사용하려면 mysqli로 전환하지 말고 대신 PDO를 사용하십시오. mysqli로 전환해야한다면 PHP5와 같은 방식으로 사용해야한다. mysqli OO와 old mysql을 동시에 사용하지 않거나 예전의 mysql과 PDO를 동시에 사용하지 않는다.

관련 문제