Puis-je mélanger des API MySQL avec PHP?

106

J'ai cherché sur le net et jusqu'à présent, ce que j'ai vu, c'est que vous pouvez utiliser mysql_et mysqli_signifier ensemble:

<?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";
?>

Sont valides mais lorsque j'utilise ce code, ce que j'obtiens est:

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

Pour le premier et le même sauf avec mysqli_close(). Pour le second.

Quel est le problème? Puis-je utiliser mysql_et mysqliensemble? Ou est-ce normal? Est-ce que je peux vérifier si les connexions sont valides du tout? (le if(mysq...))

N3mo
la source
5
mysql est obsolète, il est logique qu'ils ne fonctionneraient pas ensemble. Pourquoi essayez-vous de le faire ..?
Sterling Archer
7
Vous devez éviter mysql_*complètement d' utiliser des fonctions. Ils sont sujets aux erreurs et dangereux, et ils seront bientôt supprimés de PHP (ils sont marqués comme obsolètes pour le moment). [Cette excellente réponse] [0] va plus en détail en expliquant pourquoi ils sont mauvais. [0]: stackoverflow.com/a/12860046/1055295
Andrei Bârsan
2
1) vous insistez pour utiliser une vieille interface de mauvaise qualité (mysql) qui est marquée comme obsolète dans la doc depuis des éons 2) pour une raison étrange, vous voulez la mélanger avec son successeur au lieu de faire la bonne chose et de la convertir au nouveau 3 ) vous êtes tellement surpris que cela ne fonctionne pas que vous demandez à SO à ce sujet, bien qu'il devrait être assez évident que ce que vous faites est absurde.
fvu
1
Ce n'est pas une superstition. Bien sûr, vous pouvez écrire du mauvais code avec des mysqli_*fonctions et du bon code avec mysql_*celles-ci. Mais cette dernière catégorie est marquée comme obsolète car c'est l'ensemble de fonctions inférieur, ne pouvant pas prendre en charge les invocations de style OO ou même les instructions préparées (pour ne citer que deux exemples). Si l'on a le choix entre deux outils pour faire le même travail, dont l'un est nettement meilleur à long terme et plus flexible, la bonne réponse n'est-elle pas évidente?
Andrei Bârsan
1
Bien sûr que non. Cependant, étant donné la possibilité de choisir entre la fonctionnalité obsolète et celle activement prise en charge pour, par exemple, diffuser votre propre abstraction, pourquoi utiliser les anciennes fonctions?
Andrei Bârsan

Réponses:

66

Non, vous ne pouvez pas utiliser mysqlet mysqliensemble. Ce sont des API distinctes et les ressources qu'elles créent sont incompatibles les unes avec les autres.

Il y a un mysqli_close, cependant.

Pilules d'explosion
la source
Bien que vous ne devriez jamais avoir besoin de fermer la connexion de toute façon; les objets se nettoient lorsqu'ils ne sont plus référencés nulle part. (Je ne sais pas si les anciennes ressources le font, mais les objets peuvent réellement tirer parti de RAII à un degré non négligeable.)
cHao
@cHao non seulement cela, mais PHP fermera toutes les connexions MySQL ouvertes lorsque le script se terminera
Explosion Pills
1
Mais pas toujours, d'après mon expérience, nous plaçons donc toujours une clôture au bas du fichier.
RationalRabbit
14

Juste pour donner une réponse générale ici sur les trois API MYSQL avec une référence:

Vous ne pouvez pas mélanger l' un des trois ( mysql_*, mysqli_*, PDO) API PHP MYSQL de partir ensemble, il ne fonctionne tout simplement pas. C'est même dans la FAQ du manuel :

Il n'est pas possible de mélanger les extensions . Ainsi, par exemple, passer une connexion mysqli à PDO_MySQL ou ext / mysql ne fonctionnera pas .


Vous devez utiliser la même API MySQL et ses fonctions associées, de la connexion à l'interrogation.

Rizier123
la source
Un gars a essayé de me dire aujourd'hui qu'ils n'avaient aucun problème / erreur lors du mixage mysql_real_escape_string()avec ce que le reste de leur code était PDO. Y a-t-il quelque chose que je n'ai pas eu ici pendant mon temps avec ces différentes API? Suis-je l'ignorant ici? Ceci étant pour la question "maintenant supprimée" stackoverflow.com/q/34209127 visible uniquement par plus de 10 000 membres si quelqu'un se demande. Ceci par rapport à $stmt3->execute(array('classID' => $_POST['class'],'studentID' => mysql_real_escape_string($substr)))- Est-ce que je manque quelque chose ici?
Funk Forty Niner
1
@ Fred-ii- Vous avez raison :) La lecture du manuel montre que vous avez raison . Ce qui s'est probablement passé, c'est que mysql_real_escape_string()cela essaiera silencieusement d' établir une connexion avec les paramètres par défaut qui fonctionnaient alors pour OP. Donc, il a juste fait la connexion pour obtenir le jeu de caractères. Donc OP a 2 connexions
Rizier123
Si l'OP m'avait au moins dit / nous avait dit qu'ils avaient probablement 2 connexions séparées, j'aurais probablement été d'accord; ils en ont décidé autrement. Cependant, je ne vois toujours pas comment cela fonctionnerait encore. Si c'est le cas, je suis déconcerté.
Funk Forty Niner
@ Fred-ii- Voir: link_identifier Il utilisera les paramètres de connexion par défaut, avec lesquels il obtient ini_get(). Donc, cela ne fonctionne probablement que pour OP avec les paramètres par défaut. Je voudrais juste le laisser et prendre un nouveau café (☕☕☕).
Rizier123
Vous aimeriez peut-être ajouter quelque chose à propos de sqlsrv_query(). Je viens de fermer une question ici stackoverflow.com/q/41263771
Funk Forty Niner
2

Techniquement, vous pouvez utiliser autant de connexions séparées que vous le souhaitez, alors que votre problème est causé par une simple faute de frappe - vous ne pouvez pas utiliser les ressources d'une extension avec des fonctions d'une autre, ce qui est bien évident.

Cependant, vous devez éviter plusieurs connexions à partir du même script , que ce soit une API unique ou différentes. Comme cela va alourdir votre serveur de base de données et épuiser ses ressources. Donc, bien que techniquement vous le puissiez, vous ne devriez pas mélanger différentes extensions dans votre code, sauf pour la courte période de refactoring.

Votre bon sens
la source
Bien que ce soit probablement une bonne idée, mais le regroupement de connexions a été développé pour cette raison. Lorsque plusieurs requêtes Web arrivent sur un serveur Web, vous ne pouvez pas facilement utiliser la même connexion, vous ouvrez donc une nouvelle connexion. Le regroupement de connexions économise la surcharge sur le serveur d'applications et la base de données.
Doug le
-3

MySQLiest beaucoup plus sûr que MySQLce qui est de toute façon obsolète. C'est pourquoi vous devez vous en tenir à MySQLiet vous ne pouvez pas non plus les mélanger car ils sont tous les deux différents.

duskwuff -inactif-
la source