PHP에서 MySQL API를 혼합 할 수 있습니까?


106

나는 인터넷을 검색하고 지금까지 내가 본 당신이 사용할 수 있다는 한 mysql_mysqli_의미를 함께 :

<?php
$con=mysqli_connect("localhost", "root" ,"" ,"mysql");

if( mysqli_connect_errno( $con ) ) {
    echo "failed to connect";
}else{
    echo "connected";
}
mysql_close($con);
echo "Done";
?>

또는

<?php
$con=mysql_connect("localhost", "root" ,"" ,"mysql");
if( mysqli_connect_errno( $con ) ) {
    echo "failed to connect";
}else{
    echo "connected";
}
mysqli_close($con);
echo "Done";
?>

유효하지만이 코드를 사용할 때 얻는 것은 다음과 같습니다.

Connected
Warning: mysql_close() expects parameter 1 to be resource, object given in D:\************.php on line 9
Done

를 제외하고 첫 번째와 동일 mysqli_close()합니다. 두 번째.

무엇이 문제입니까? 내가 사용할 수 없습니다 mysql_mysqli함께? 아니면 정상입니까? 연결이 유효한지 확인할 수있는 방법이 있습니까? ( if(mysq...))


5
mysql은 더 이상 사용되지 않으며 함께 작동하지 않는 것이 합리적입니다. 왜 그렇게하려고 ..?
Sterling Archer 2013

7
mysql_*함수를 모두 사용하지 않아야 합니다. 오류가 발생하기 쉽고 안전하지 않으며 곧 PHP에서 제거 될 예정입니다 (현재 사용되지 않는 것으로 표시됨 ). [이 훌륭한 답변] [0]이 나쁜지에 대해 자세히 설명 합니다. [0] : stackoverflow.com/a/12860046/1055295
Andrei Bârsan 2013

2
1) 당신은 영겁 이후로 문서에서 쓸모없는 것으로 표시된 오래된 조잡한 인터페이스 (mysql)를 사용한다고 주장합니다 .2) 이상한 이유로 올바른 일을하는 대신 후속 인터페이스와 혼합하고 새로운 인터페이스로 변환 3 ) 당신이하는 일이 넌센스라는 것이 꽤 분명해야하지만, 당신은 그것에 대해 물어볼 정도로 작동하지 않는다는 것에 너무 놀랐습니다.
fvu

1
미신이 아닙니다. 물론 mysqli_*함수로 나쁜 코드를 작성하고 함수로 좋은 코드를 작성할 수 mysql_*있습니다. 그러나 후자의 범주는 열등한 함수 집합이므로 OO 스타일 호출 또는 준비된 명령문을 지원할 수 없기 때문에 더 이상 사용되지 않는 것으로 표시됩니다. 동일한 작업을 수행하기 위해 두 가지 도구 중 하나를 선택하면 장기적으로 더 좋고 더 유연합니다. 정답이 분명하지 않습니까?
Andrei Bârsan 2013

1
당연히 아니지. 그러나 사용되지 않는 기능과 적극적으로 지원되는 기능 중에서 선택할 수있는 옵션 (예 : 자체 추상화 롤링)이 주어지면 왜 이전 기능을 사용합니까?
Andrei Bârsan 2013

답변:


66

아니, 당신은 사용할 수 없습니다 mysqlmysqli함께. 이들은 별도의 API이며 이들이 생성하는 리소스는 서로 호환되지 않습니다.

있다 mysqli_close하지만.


어쨌든 연결을 닫을 필요는 없습니다. 객체는 더 이상 어디에서나 참조되지 않을 때 스스로 정리됩니다. (평범한 오래된 자원이 그렇게하는지 확실하지 않지만 객체는 실제로 RAII를 사소하지 않은 정도로 활용할 수 있습니다.)
cHao

@cHao뿐만 아니라 스크립트가 종료 될 때 PHP는 열려있는 MySQL 연결을 모두 닫습니다
Explosion Pills

1
하지만 항상 그런 것은 아닙니다. 제 경험으로는 항상 파일 하단에 마감을 둡니다.
RationalRabbit

14

참조와 함께 세 가지 MYSQL API에 대한 일반적인 답변을 제공하십시오.

당신은 세 가지 (의 혼합 할 수 없습니다 mysql_*, mysqli_*, PDO그냥 작동하지 않습니다 함께 PHP에서) MYSQL의 API의를. 매뉴얼 FAQ 에도 있습니다 .

이다 확장을 혼합 할 수 없습니다 . 예를 들어 mysqli 연결을 PDO_MySQL 또는 ext / mysql에 전달 하면 작동하지 않습니다 .


연결부터 쿼리까지 동일한 MySQL API 및 관련 기능을 사용해야합니다.


어떤 사람은 mysql_real_escape_string()나머지 코드가 PDO 인 것과 혼합 할 때 문제 / 오류가 없다고 오늘 말하려고했습니다 . 이 다른 API로 작업하면서 제가 여기에서 얻지 못한 것이 있습니까? 내가 여기서 무지한 사람인가? 이것은 "지금 삭제 된"질문에 대한 것입니다. stackoverflow.com/q/34209127 은 누구나 궁금해 할 경우 10,000 명 이상의 회원 만 볼 수 있습니다. 이것과 관련하여 $stmt3->execute(array('classID' => $_POST['class'],'studentID' => mysql_real_escape_string($substr)))-여기에 뭔가 빠졌습니까?
Funk Forty Niner 2015

1
@ Fred-ii- 당신이 옳습니다 :) 매뉴얼을 읽으면 당신이 옳다 는 것을 알 수 있습니다 . 아마도 발생한 것은 OP에 대해 작동 하는 기본 매개 변수와의 연결을 자동으로 시도 하는 mysql_real_escape_string()것 입니다. 그래서 문자 세트를 얻기 위해 연결했습니다. 따라서 OP에는 2 개의 연결이 있습니다
Rizier123

OP가 적어도 나 / 우리에게 그들이 2 개의 분리 된 연결을 가지고있을 것이라고 말했다면 나는 아마도 동의했을 것이다. 그들은 달리 결정했습니다. 그러나 여전히 어떻게 작동하는지 알 수 없습니다. 그렇다면 당황합니다.
Funk Forty Niner 2015

@ Fred-ii- 참조 : link_identifier 기본 연결 설정을 사용하며 ini_get(). 따라서 아마도 기본 설정으로 OP에서만 작동합니다. 그냥두고 새 커피 (☕☕☕)를 마시 곤했습니다.
Rizier123 2015

에 대해 추가하고 싶을 수 있습니다 sqlsrv_query(). 난 그냥 여기에 질문을 폐쇄 stackoverflow.com/q/41263771
펑크 마흔 나이 너

2

기술적으로는 원하는만큼의 개별 연결을 사용할 수 있지만 문제는 단순한 오타로 인해 발생합니다. 한 확장의 리소스 만 다른 확장의 기능과 함께 사용할 수는 없습니다.

그러나 단일 API 또는 다른 API에 관계없이 동일한 스크립트에서 여러 연결을 피해야 합니다. 데이터베이스 서버에 부담을주고 리소스를 고갈시킵니다. 따라서 기술적으로는 가능하지만 코드에서 다른 확장을 혼합해서는 안되며 리팩토링의 짧은 기간 동안 절약 할 수 있습니다.


이것은 아마도 좋은 생각이지만 연결 풀링은 이러한 이유로 개발되었습니다. 웹 서버에 여러 웹 요청이있는 경우 동일한 연결을 쉽게 사용할 수 없으므로 새 연결을 엽니 다. 연결 풀링은 앱 서버 및 데이터베이스의 오버 헤드를 절약합니다.
Doug

-3

MySQLiMySQL어쨌든 현재 사용되지 않는 것보다 훨씬 더 안전 합니다. 그렇기 때문에 고수해야 MySQLi하며 둘 다 다르기 때문에 혼합 할 수 없습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.