Posso misturar APIs MySQL em PHP?


106

Eu procurei na net e até agora o que eu tenho visto é que você pode usar mysql_e mysqli_juntos o que significa:

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

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

ou

<?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ão válidos, mas quando uso este código o que recebo é:

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

Para o primeiro e o mesmo, exceto com mysqli_close(). Para o segundo.

Qual é o problema? Não posso usar mysql_e mysqlijunto? Ou isso é normal? Posso verificar se as conexões são válidas? (o if(mysq...))


5
mysql está obsoleto, só faz sentido que eles não funcionem juntos. Por que você está tentando fazer isso ..?
Sterling Archer

7
Você deve evitar usar mysql_*funções completamente. Eles estão sujeitos a erros e inseguros, e serão removidos do PHP em breve (eles estão marcados como obsoletos no momento). [Esta ótima resposta] [0] entra em detalhes explicando por que eles são ruins. [0]: stackoverflow.com/a/12860046/1055295
Andrei Bârsan

2
1) você insiste em usar uma interface velha de má qualidade (mysql) que está sendo marcada como obsoleta no documento desde eras 2) por algum motivo estranho, você deseja misturá-la com sua sucessora em vez de fazer a coisa certa e converter para a nova 3 ) você fica tão surpreso que não funciona que pergunta no SO sobre isso, embora deva ser bastante óbvio que o que você está fazendo é um absurdo.
fvu

1
Não é uma superstição. Claro que você pode escrever código ruim com mysqli_*funções e código bom com mysql_*algumas. Mas a última categoria está marcada como obsoleta por ser o conjunto inferior de funções, não sendo capaz de suportar invocações estilo OO ou mesmo instruções preparadas (para citar apenas dois exemplos). Dada a escolha de duas ferramentas para fazer o mesmo trabalho, uma das quais é claramente melhor no longo prazo e mais flexível, a resposta correta não é óbvia?
Andrei Bârsan

1
Claro que não. No entanto, dada a opção de escolher entre a funcionalidade preterida e aquela com suporte ativo para, digamos, lançar sua própria abstração, por que usar as funções antigas?
Andrei Bârsan

Respostas:


66

Não, você não pode usar mysqle mysqlijunto. Eles são APIs separados e os recursos que eles criam são incompatíveis uns com os outros.

Existe um mysqli_close, no entanto.


Embora você nunca deva precisar fechar a conexão de qualquer maneira; os objetos se limpam quando não são mais referenciados em nenhum lugar. (Não tenho certeza se os recursos simples fazem isso, mas os objetos podem realmente tirar proveito do RAII em um grau não insignificante.)
cHao

@cHao não só isso, mas o PHP fechará todas as conexões MySQL abertas quando o script sair
Explosion Pills

1
Mas nem sempre, pela minha experiência, sempre colocamos um fecho no final do arquivo.
RationalRabbit

14

Apenas para dar uma resposta geral aqui sobre todas as três APIs MYSQL com uma referência:

Você não pode misturar qualquer um dos três ( mysql_*, mysqli_*, PDO) MYSQL API do do PHP juntos, ele simplesmente não funciona. Está até no manual de FAQ :

Não é possível misturar as extensões . Portanto, por exemplo, passar uma conexão mysqli para PDO_MySQL ou ext / mysql não funcionará .


Você precisa usar a mesma API MySQL e suas funções relacionadas, desde a conexão até a consulta.


Um cara tentou me dizer hoje que eles não têm problemas / erros ao misturar mysql_real_escape_string()com o que o resto de seu código é PDO. Há algo que eu não entendi aqui trabalhando com essas diferentes APIs? Eu sou o ignorante aqui? Isso sendo para a questão "agora excluído" stackoverflow.com/q/34209127 visível apenas por 10K + membros, caso alguém se pergunte. Isso em relação a $stmt3->execute(array('classID' => $_POST['class'],'studentID' => mysql_real_escape_string($substr)))- Estou faltando alguma coisa aqui?
Funk Forty Niner

1
@ Fred-ii- Você está certo :) A leitura do manual mostra que você está correto . O que provavelmente aconteceu é que mysql_real_escape_string()vai silenciosamente tentar fazer uma conexão com os parâmetros padrão que então trabalhavam para OP. Então, ele apenas fez a conexão para obter o conjunto de caracteres. O OP tem 2 conexões
Rizier123

Se o OP tivesse pelo menos nos informado que provavelmente tinham 2 conexões separadas, eu provavelmente concordaria; eles decidiram de outra forma. No entanto, ainda não consigo ver como isso funcionaria. Se isso acontecer, estou perplexo.
Funk Forty Niner

@ Fred-ii- Veja: link_identifier Ele usará as configurações de conexão padrão, com as quais ele obtém ini_get(). Portanto, provavelmente funciona apenas para OP com as configurações padrão. Eu deixaria e pegaria um café novo (☕☕☕).
Rizier123

Você pode querer acrescentar algo sobre sqlsrv_query(). Acabei de fechar uma pergunta aqui stackoverflow.com/q/41263771
Funk Forty Niner

2

Tecnicamente, você pode usar quantas conexões separadas desejar, enquanto o problema é causado por um mero erro de digitação - você só não pode usar recursos de uma extensão com funções de outra, o que é bastante óbvio.

No entanto, você deve evitar várias conexões do mesmo script , não importa de API única ou diferentes. Isso vai sobrecarregar seu servidor de banco de dados e esgotar seus recursos. Portanto, embora tecnicamente você possa, você não deve misturar extensões diferentes em seu código, exceto pelo curto período de refatoração.


Embora seja provavelmente uma boa ideia, o pool de conexões foi desenvolvido por esse motivo. Quando você tem várias solicitações da web atingindo um servidor da web, você não pode usar facilmente a mesma conexão, então você abre uma nova conexão. O pool de conexão economiza a sobrecarga no servidor de aplicativos e no banco de dados.
Doug

-3

MySQLié muito mais seguro do que o MySQLque agora está obsoleto. É por isso que você deve ficar com MySQLie também não pode misturá-los, pois são diferentes.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.