0
votes

Insert PDO n'accepte pas "VRAI" ou "FALSE", mais seulement 0 et 1

Après avoir introduit Phinx en tant qu'outil de migration de base de données, je ne suis plus en mesure d'utiliser true em> et faux em> via la déclaration d'exécution de PDO. Chaque fois que je le fais, j'obtiens l'erreur suivante:

AVERTISSEMENT PHP: PDOSTATEMENT :: Exécuter (): SQLSTATE [22007]: Format de DateTime non valide: 1366 Valeur integer incorrecte: '' Pour la colonne 'my_db'. 'My_Table'. 'My_Column' à la ligne 1 ... p> blockQuote>

Ma table a le schéma suivant (court-circuité): p> xxx pré>

J'utilise le code suivant (court-circuité): p>

->addColumn('my_column', 'boolean', [
  'null' => false,
  'after' => 'another_column',
])


2 commentaires

Assurez-vous simplement que la table $ est correctement échappée, à la manière.


Au fait, définissez la valeur par défaut lorsque vous créez une colonne


3 Réponses :


-2
votes

Votre type de champ est Tinyint (1). Il ne supporte donc que des valeurs de 0 à 9. Changez-vous à Varchar, texte, char, etc. pour accepter la chaîne true / fast. Mais je vous suggère fortement d'utiliser Bool DataType. Ensuite, utilisez 0 ou 1 comme vrai ou faux. Il n'y a pas de point dans la chaîne d'écriture (VRAI / FAUX) pour les opérations booléennes. Utiliser 0 ou 1 vous sauvera du beaucoup de problèmes à l'avenir.


2 commentaires

En ce qui concerne mes recherches, Boolean est représenté en interne comme Tinyint (1) par MySQL. Je parle de Cette question .


C'est juste faux. Tinyint prend toujours en charge [-128 127] ou [0,255] non signé. Le nombre entre parenthèses est la largeur d'affichage et est AFAIK uniquement pour ZerOfill, rien d'autre. Une colonne de Tinyint (1) affichera 1 avec ZerOfill. Tinyint (2): 01, Tinyint (3): 001 ...



-1
votes

Une solution à ce problème consiste à définir sql_mode = '' ' code> globalement.

exécutez cette requête en vous dB et vérifiez s'il corrige le problème: P>

set GLOBAL sql_mode = "";


2 commentaires

Cela a réparé pour moi! Pouvez-vous élaborer un peu plus sur ce que cela fait exactement? At-il quelque chose à voir avec la façon dont MySQL analyse des commandes?


partagé le lien vers le doc pour votre référence



1
votes

Vous pouvez utiliser PDO :: PARAM_BOOL CODE> dans PDO

$stmt->bindValue(':myColumn', false, PDO::PARAM_BOOL);


1 commentaires

Oui, probablement je devrais le faire. Cependant, ce n'est pas exactement la solution dont j'ai besoin. J'ai ce problème dans de nombreux endroits tout au long de ma demande, ce qui signifie que je devrais le changer partout aussi loin que j'ai compris. La réponse de la bouteille rouge a fixé pour moi cependant. Je ne veux pas accepter cependant que cependant, parce que je crois que cela n'a pas été évité sans raison. Je ne sais pas pourquoi ce serait une pratique cependant, si j'inclus la commande dans mon fichier de migration. Si vous pouviez adapter votre solution à travailler dans toute ma demande sans modifier partout, je pourrais accepter votre réponse.