Puis-je mélanger Api MySQL en PHP?

J'ai cherché sur le net et pour l'instant ce que j'ai vu, c'est que vous pouvez utiliser mysql_ et mysqli_ ensemble sens:

<?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 valables, mais lorsque j'utilise ce code ce que je reçois est:

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

Pour la première et la même sauf avec mysqli_close(). Pour le deuxième.

Quel est le problème? Je ne peux pas utiliser mysql_ et mysqli ensemble? Ou est-ce normal? Est le moyen pour moi de vérifier si les connexions sont valides à tous? (le if(mysq...))

  • mysql est obsolète, il n'a de sens qu'ils ne travaillent pas ensemble. Pourquoi essayez-vous de le faire..?
  • Vous devriez éviter d'utiliser des mysql_* fonctions tout à fait. Elles sont sujettes à l'erreur et dangereux, et ils seront supprimés à partir de PHP bientôt (qu'ils soient marqués comme deprecated pour le moment). [Cette grande réponse][0] va dans la manière plus détaillée expliquant pourquoi ils sont mauvais. [0]:stackoverflow.com/a/12860046/1055295
  • 1) vous insistez sur l'utilisation d'une vieille mauvaise qualité de l'interface (mysql) qui est marqué comme obsolète dans la doc depuis des éons 2) pour une raison étrange, vous voulez mélanger avec son successeur au lieu de faire la bonne chose et de se convertir à la nouvelle 3) vous êtes tellement surpris qu'il ne fonctionne pas que vous vous posez sur DONC, à ce sujet, mais il devrait être assez évident que ce que vous faites est un non-sens.
  • double possible de mysql_fetch_array() s'attend à ce paramètre 1 pour être resource, boolean donné à sélectionner
  • Encore une autre superstition à être ajouté à des milliers d'autres. Tout le monde est sûr qu'il est honnête de la fonction est "erreurs", pas un programmeur, qui n'avait aucune idée de comment utiliser une fonction correctement et à peine aurait cette idée pour un nouveau.
  • Ce n'est pas une superstition. Bien sûr, vous pouvez écrire du mauvais code avec mysqli_* fonctions et le code de bonne avec mysql_* ceux. Mais la dernière catégorie est marquée comme obsolète car il est le point inférieur de fonctions, de ne pas être en mesure de soutenir OO-style invocations ou même des déclarations préparées à l'avance (pour ne citer que deux exemples). Étant donné un choix de deux outils pour faire le même travail, dont l'un est clairement mieux dans le long terme et plus souple, n'est pas la bonne réponse évidente?
  • En PHP il y a un helluvalot de fonctions n'étant pas en mesure de soutenir OO-style invocations qui personne ne va déprécier. Ce qui ne va pas avec eux?
  • Ce n'était pas le point principal que j'essayais de faire. L'absence de déclaration de soutien et de transactions est le plus gros problème.
  • Il ne manque pas de transactions. Êtes-vous vraiment faire croire que toutes ces années utilisateurs de PHP ont été incapables d'utiliser les transactions? Pouvez-vous le prouver?
  • Il n'y a pas de support direct, comme mysqli::begin_transaction. Tout ce que vous pouvez faire est un mysql_query("START TRANSACTION"). Et cela rend la gestion des erreurs de plus en plus lourde, alors que le mysqli variante déclenche une exception quand quelque chose se passe mal lors de la transaction. Cela rend le code beaucoup plus clair et plus facile à lire. Sans doute, vous avez juste à émuler cette fonctionnalité à l'aide d'une classe personnalisée et mysql_* appels, mais c'est un peu exagéré, comme il serait juste manuellement la mise en œuvre de la mysqli_* ceux.
  • Croyez-vous vraiment que l'API mysqli être utilisé comme il est, dans la forme brute d'appels de l'API de droit dans le code de l'application, sans une classe personnalisée pour être encapsulé dans? La recherche en récente de la question je frissonne avec la douleur de voir cette approche. Pensez-vous vraiment mysqli être utilisé de cette façon?
  • Bien sûr que non. Toutefois, compte tenu de l'option de choisir entre la fonctionnalité obsolète et activement soutenu l'une pour, disons, rouler votre propre abstraction, pourquoi utiliser les anciennes fonctions?
  • Pourquoi utiliser est une autre question (si j'étais dépourvu de choix). Mais j'ai demandé pourquoi la vieille mysql ext est "erreurs" et "dangereux". Et vous n'avez pas à fournir une preuve, me nourrissant avec la plaine de faux (ne prend pas en charge les transactions et autres) ou inutiles (style procédural) trucs. Mais la vérité est qu'il n'y a rien de mal avec mysql ext enregistrer pour ses utilisateurs. Et ces utilisateurs ne sont pas devenus de bons en changeant juste les noms des fonctions qu'ils utilisent.
  • Oui, j'ai reconnu que, dès le début - " Ce n'est pas une superstition. Bien sûr, vous pouvez écrire du mauvais code avec mysqli_* les fonctions et le code de bonne avec mysql_* les principes. `. Et par sujettes à l'erreur, j'ai surtout s'agissant de l'absence de déclarations préparées à l'avance. Vous pouvez échapper les données avant de les concaténer à la requête, bien sûr, mais il est très facile d'oublier un champ introduisant ainsi une vulnérabilité. Avec des déclarations préparées à l'avance, c'est impossible. Encore une fois, cela est lié plus pour le programmeur que pour les outils, donc comme vous l'avez dit -, le programmeur est ce qui importe le plus à la fin.
  • Dans cette classe personnalisée qui nous avons convenu, qui doivent être utilisées de toute façon, on peut utiliser un émulé déclarations préparées à l'avance tout droit, par exemple, peut être vu à droite dans la réponse à côté de l'un est lié à l'. Donc, rien de mal avec l'API de nouveau. Dire que mysql ext est sujette aux erreurs et à l'insalubrité est une simple superstition. Ou - si vous aimez cette façon - un conte effrayant destiné à permettre à une dépréciation. Mais il n'y a rien de mal avec mysql poste lui-même et ne l'ont jamais été. La très PHP utilisateur qui est aussi impuissant que être dans l'incapacité d'utiliser quoi que ce soit mais raw appels de l'API dans le code de l'application est le seul problème.
  • Je suis maintenant convaincu par vos arguments; manifestement, vous avez plus d'expérience que moi. Mais alors pourquoi les mysql_* extensions marqué comme obsolète?
  • Pour autant que je sais, c'est juste des gens qui responsable pour le support de l'extension décidé de laisser tomber. PHP équipe n'est pas seulement les gens qui prend en charge diverses extensions. Dire, Microsoft est responsable pour le support de Windows. Et ils ont abandonné XP support que de la récente 5.5. En va de même pour mysql - il de l'Oracle des gens qui maintiennent l'extension et ils ont décidé de laisser tomber. Aussi simple que cela. Pourtant, je crois que l'intention a été en grande partie pris en charge par la communauté en raison de la très même fausse croyance, nous avons discuté ici.
  • cela devrait éclairer: wiki.php.net/rfc/mysql_deprecation
  • Je vois. Merci pour l'information. Eh bien, je suppose que les requêtes asynchrones, pourrait être une autre chose qui est important pour une haute performance de l'application web. Je n'ai pas mentionné, mais, depuis que j'ai jusqu'à présent n'ont pas utilisé personnellement.

InformationsquelleAutor N3mo | 2013-07-05