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 mysqli
razem? Czy to normalne? Czy sposób, w jaki mogę sprawdzić, czy połączenia są w ogóle prawidłowe? (the if(mysq...)
)
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/1055295mysqli_*
funkcji, a dobry kod za pomocą funkcjimysql_*
. 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?Odpowiedzi:
Nie, nie możesz używać
mysql
imysqli
razem. Są to oddzielne interfejsy API, a tworzone przez nie zasoby są ze sobą niezgodne.Jest
mysqli_close
jednak.źródło
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 :Musisz używać tego samego interfejsu API MySQL i związanych z nim funkcji, od połączenia po zapytania.
źródło
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?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łączeniaini_get()
. Więc prawdopodobnie działa tylko dla OP z ustawieniami domyślnymi. Zostawiłbym to i wziąłbym nową kawę (☕☕☕).sqlsrv_query()
. Właśnie zamknąłem tutaj pytanie stackoverflow.com/q/41263771Z 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.
źródło
MySQLi
jest o wiele bezpieczniejszy niż ten,MySQL
który i tak jest obecnie przestarzały. Dlatego powinieneś się ich trzymać,MySQLi
a także nie możesz ich mieszać, ponieważ są różne.źródło