Czy mogę łączyć API MySQL w PHP?

106

Przeszukałem sieć i do tej pory zauważyłem, że możesz używać mysql_i mysqli_razem oznaczać:

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

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

lub

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

Są prawidłowe, ale kiedy używam tego kodu, otrzymuję:

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

Po pierwsze i to samo, z wyjątkiem z mysqli_close(). Po drugie.

Jaki jest problem? Nie mogę używać mysql_i mysqlirazem? Czy to normalne? Czy sposób, w jaki mogę sprawdzić, czy połączenia są w ogóle prawidłowe? (the if(mysq...))

N3mo
źródło
5
mysql jest przestarzałe, ma tylko sens, że nie będą ze sobą współpracować. Dlaczego próbujesz to zrobić ..?
Sterling Archer,
7
Należy mysql_*całkowicie unikać korzystania z funkcji. Są podatne na błędy i niebezpieczne, a wkrótce zostaną usunięte z PHP ( w tej chwili są oznaczone jako przestarzałe ). [Ta świetna odpowiedź] [0] zawiera dużo więcej szczegółów wyjaśniających, dlaczego są złe. [0]: stackoverflow.com/a/12860046/1055295
Andrei Bârsan,
2
1) nalegasz na użycie starego, tandetnego interfejsu (mysql), który jest oznaczony jako przestarzały w dokumencie od eonów 2) z jakiegoś dziwnego powodu chcesz go połączyć z jego następcą, zamiast robić to, co trzeba i konwertować na nowy 3 ) jesteś tak zaskoczony, że nie działa, że ​​pytasz o to na SO, chociaż powinno być całkiem oczywiste, że to, co robisz, jest nonsensem.
fvu
1
To nie jest przesąd. Oczywiście możesz napisać zły kod za pomocą mysqli_*funkcji, a dobry kod za pomocą funkcji mysql_*. Ale ta ostatnia kategoria jest oznaczona jako przestarzała, ponieważ jest to gorszy zestaw funkcji, nie mogący obsługiwać wywołań w stylu obiektów obiektowych ani nawet przygotowanych instrukcji (by wymienić tylko dwa przykłady). Mając do wyboru dwa narzędzia do wykonania tej samej pracy, z których jedno jest wyraźnie lepsze na dłuższą metę i bardziej elastyczne, czy poprawna odpowiedź nie jest oczywista?
Andrei Bârsan
1
Oczywiście nie. Biorąc jednak pod uwagę możliwość wyboru między przestarzałą funkcjonalnością a aktywnie obsługiwaną funkcją, powiedzmy, toczenia własnej abstrakcji, po co używać starych funkcji?
Andrei Bârsan

Odpowiedzi:

66

Nie, nie możesz używać mysqli mysqlirazem. Są to oddzielne interfejsy API, a tworzone przez nie zasoby są ze sobą niezgodne.

Jest mysqli_closejednak.

Pigułki wybuchowe
źródło
Chociaż i tak nigdy nie powinieneś zamykać połączenia; obiekty same się oczyszczają, gdy nie ma już do nich odnośników. (Nie jestem pewien, czy robią to zwykłe stare zasoby, ale obiekty mogą faktycznie skorzystać z RAII w nie-nieznacznym stopniu.)
cHao
@cHao nie tylko to, ale PHP zamknie wszystkie otwarte połączenia MySQL po zakończeniu działania skryptu
Explosion Pills,
1
Ale nie zawsze, z mojego doświadczenia, więc zawsze umieszczamy zamknięcie na dole pliku.
RationalRabbit
14

Aby dać tutaj ogólną odpowiedź na temat wszystkich trzech interfejsów API MYSQL z odniesieniem:

Nie można mieszać dowolną z trzech ( mysql_*, mysqli_*, PDO) MySQL API z PHP razem, to po prostu nie działa. Jest to nawet w podręczniku FAQ :

Nie ma możliwości mieszania rozszerzeń . Na przykład przekazanie połączenia mysqli do PDO_MySQL lub ext / mysql nie zadziała .


Musisz używać tego samego interfejsu API MySQL i związanych z nim funkcji, od połączenia po zapytania.

Rizier123
źródło
Jakiś facet próbował mi dzisiaj powiedzieć, że nie ma problemu / błędów podczas mieszania mysql_real_escape_string()z tym, co reszta ich kodu jest PDO. Czy jest coś, czego nie dostałem w swoim czasie podczas pracy z tymi różnymi interfejsami API? Czy jestem tutaj ignorantem? To jest dla pytania „teraz usuniętego” stackoverflow.com/q/34209127, które może oglądać tylko ponad 10 000 członków, jeśli ktoś się zastanawia. To w odniesieniu do $stmt3->execute(array('classID' => $_POST['class'],'studentID' => mysql_real_escape_string($substr)))- Czy coś mi tu brakuje?
Funk Forty Niner
1
@ Fred-ii- Masz rację :) Przeczytanie instrukcji pokazuje, że masz rację . Prawdopodobnie zdarzyło się, że mysql_real_escape_string()po cichu spróbuje nawiązać połączenie z domyślnymi parametrami, które wtedy działały dla OP. Więc po prostu nawiązał połączenie, aby uzyskać zestaw znaków. Więc OP ma 2 połączenia
Rizier123,
Gdyby OP przynajmniej powiedział mi / nam, że prawdopodobnie mają 2 oddzielne połączenia, prawdopodobnie zgodziłbym się; zdecydowali inaczej. Jednak nadal nie widzę, jak to by nadal działało. Jeśli tak, jestem zdumiony.
Funk Forty Niner
@ Fred-II- Patrz: identyfikator_połączenia będzie używać domyślnych ustawień połączenia, które dostaje się ini_get(). Więc prawdopodobnie działa tylko dla OP z ustawieniami domyślnymi. Zostawiłbym to i wziąłbym nową kawę (☕☕☕).
Rizier123
Możesz chcieć coś dodać na temat sqlsrv_query(). Właśnie zamknąłem tutaj pytanie stackoverflow.com/q/41263771
Funk Forty Niner
2

Z technicznego punktu widzenia możesz używać tylu oddzielnych połączeń, ile chcesz, podczas gdy twój problem jest spowodowany zwykłą literówką - nie możesz tylko używać zasobów z jednego rozszerzenia z funkcjami z innego, co jest dość oczywiste.

Należy jednak unikać wielu połączeń z tego samego skryptu , niezależnie od tego, czy jest to jeden interfejs API, czy różne. Ponieważ spowoduje to obciążenie serwera bazy danych i wyczerpanie jego zasobów. Tak więc, chociaż technicznie jest to możliwe, nie powinieneś mieszać różnych rozszerzeń w swoim kodzie, z wyjątkiem krótkiego okresu refaktoryzacji.

Twój zdrowy rozsądek
źródło
Jest to prawdopodobnie dobry pomysł, ale z tego powodu opracowano pule połączeń. Kiedy masz wiele żądań internetowych trafiających do serwera WWW, nie możesz łatwo użyć tego samego połączenia, więc otwierasz nowe połączenie. Pule połączeń oszczędzają obciążenie na serwerze aplikacji i bazie danych.
Doug,
-3

MySQLijest o wiele bezpieczniejszy niż ten, MySQLktóry i tak jest obecnie przestarzały. Dlatego powinieneś się ich trzymać, MySQLia także nie możesz ich mieszać, ponieważ są różne.

duskwuff-nieaktywny-
źródło