Puis-je détecter et gérer les avertissements MySQL avec PHP?
Je fais face à une table MySQL qui définit la JobName colonne UNIQUE. Si quelqu'un essaie d'enregistrer un nouvel Emploi à la base de données à l'aide d'un JobName qui est déjà dans la base de données, MySQL lance un avertissement.
Je voudrais être en mesure de détecter ce type d'avertissement, comme une erreur dans mon script PHP et de les traiter de manière appropriée. Idéalement, je voudrais savoir quel genre de warning MySQL est lancé afin que je puisse branche le code pour gérer.
Est-ce possible? Si non, est-ce parce que MySQL n'ont pas cette possibilité, PHP ne dispose pas de cette capacité, ou les deux?
source d'informationauteur Kyle Noland
Vous devez vous connecter pour publier un commentaire.
Pour les mises en garde d'être "marqué" de PHP en mode natif exigerait des changements mysql/mysqli pilote, ce qui est évidemment au-delà de la portée de cette question. Au lieu de cela, vous allez avoir de gros de vérifier chaque requête que vous faites sur la base de données pour les avertissements:
Évidemment, cela va être horriblement coûteuses à appliquer en masse, de sorte que vous pourriez avoir besoin afin de soigneusement réfléchir sur quand et comment les avertissements peuvent survenir (ce qui peut vous conduire à refactoriser pour les éliminer).
De référence, MySQL affiche les AVERTISSEMENTS
Bien sûr, vous pourriez renoncer à la requête initiale pour l'
SELECT @@warning_count
qui serait vous faire économiser une requête par l'exécution, mais je l'ai inclus pour pédant à l'exhaustivité.Tout d'abord, vous devez tour des avertissements de sorte que vos visiteurs ne voient pas votre MySQL erreurs. Deuxièmement, lorsque vous appelez
mysql_query()
vous devriez vérifier pour voir si il est retourné false. Si il l'a fait, appelmysql_errno()
pour savoir ce qui n'allait pas. Match le nombre retourné à l'codes d'erreur sur cette page.Il ressemble à ce qui est le numéro d'erreur que vous cherchez:
peut-être ce que vous cherchez.
Les erreurs PHP peuvent ensuite être traitées avec un PHP personnalisé gestionnaire d'erreur, mais vous pouvez aussi désactiver l'affichage des erreurs php, car elles sont généralement enregistrés dans un fichier journal (dépend de votre configuration de php).
en fonction de ce que (le cas échéant) framework que vous utilisez, je vous suggère de faire une requête pour vérifier la jobname vous-même et créer la bonne information de l'utilisateur avec le reste des validations pour la forme.
En fonction du nombre de jobnames, vous pouvez envoyer le nom de la vue qui contient le formulaire et l'utilisation de javascript pour raconter l'utilisation qui est pris.
Si cela ne fait pas de sens pour vous, alors pour résumer mon point de vue, c'est cela: ne pas concevoir votre programme et /ou de l'utilisateur à essayer de faire des choses illégales et rattraper les erreurs quand elles ne et de les traiter ensuite. C'est beaucoup mieux, à mon humble avis, pour la conception de votre système pour ne pas créer des erreurs. Gardez les erreurs réelles de bugs 🙂
Mis à jour pour supprimer les trucs sur errno fonctions dont je me rends compte maintenant ne s'appliquent pas à votre situation...
Une chose MySQL à se méfier de pour
UPDATE
états:mysqli_affected_rows()
sera de retour à zéro, même si laWHERE
clause de lignes sélectionnées, mais laSET
clause n'a pas fait de modifier les valeurs des données. Je mentionne cela parce que le comportement a provoqué un bug dans le système une fois, j'ai regardé--le programmeur utilisé que la valeur de retour pour vérifier les erreurs après une mise à jour, en supposant un zéro signifie qu'une erreur s'était produite. Il voulait juste dire que l'utilisateur n'a pas changer toutes les valeurs existantes avant de cliquer sur le bouton mettre à jour.Donc je suppose que l'aide
mysqli_affected_rows()
ne peut pas être invoqué pour trouver de tels avertissements soit, sauf si vous avez quelque chose comme unupdate_time
colonne de la table qui sera toujours assigner une nouvelle valeur d'horodatage lors de la mise à jour. Ce genre de solution de contournement semble un peu kludgey.Vous pouvez détecter les violations de clé Uniques à l'aide de mysqli déclaration pas d'erreur. La mysqli instruction renvoie la valeur d'erreur 1062 , c'est-à ER_DUP_ENTRY. Vous pouvez chercher l'erreur 1062 et imprimer un message d'erreur. Si vous souhaitez imprimer votre colonne (jobName) également dans le cadre de votre message d'erreur, alors vous devriez analyser la déclaration de la chaîne d'erreur.
Il est possible d'obtenir les mises en garde, et d'une façon plus efficace avec mysqli qu'avec mysql.
Voici le code proposé sur le manuel page sur php.net pour le bien mysqli->warning_count:
Note sur la suppression de mises en garde: il n'est Généralement pas une bonne idée de prévenir les mises en garde d'être affichée car il vous manque quelque chose d'important. Si vous devez absolument masquer les mises en garde pour une raison quelconque, vous pouvez le faire sur une base individuelle en plaçant un
@
signe en face de l'instruction. De cette façon, vous n'avez pas à éteindre tous les avertissements de reporting et peut la limiter à une instance spécifique.Exemple: