【问题标题】:PDO Insert not accepting "true" or "false", but only 0 and 1PDO 插入不接受“真”或“假”,但只接受 0 和 1
【发布时间】:2019-06-11 08:26:29
【问题描述】:

引入phinx作为数据库迁移工具后,我再也无法通过PDO的execute语句使用truefalse了。每当我这样做时,我都会收到以下错误:

PHP 警告:PDOStatement::execute(): SQLSTATE[22007]:无效的日期时间格式:1366 不正确的整数值:'' for column 'my_db'.'my_table'.'my_column' at row 1...

我的表具有以下架构(已缩短):

| Field                         | Type         | Null | Key | Default | Extra          |
+-------------------------------+--------------+------+-----+---------+----------------+
| my_column                     | tinyint(1)   | NO   |     | NULL    |                |
+-------------------------------+--------------+------+-----+---------+----------------+

我正在使用以下代码(短):

$stmt = $this->pdo->prepare("INSERT INTO `$table` (`my_column`) VALUES (:mycolumn)");
$stmt->execute([
   'my_column' => false
]);

该列是由迁移脚本创建的:

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

奇怪的是,我通过 phpMyAdmin 在手动 sql 语句中使用 truefalse 没有问题。

【问题讨论】:

  • 顺便说一句,只要确保$table 被正确转义即可。
  • 顺便说一下,在创建列时定义默认值

标签: php mysql pdo phinx


【解决方案1】:

你可以在PDO中使用PDO::PARAM_BOOL

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

【讨论】:

  • 是的,我很可能应该这样做。但是,这并不完全是我需要的修复。我在整个应用程序中的许多地方都遇到了这个问题,这意味着据我所知,我必须在任何地方进行更改。然而,Red Bottle 的回答为我解决了这个问题。但是,我也不想接受这一点,因为我相信它不会无缘无故地被否决。不过,如果我在迁移文件中包含该命令,我不知道为什么会这样做。如果您可以调整您的解决方案以在我的整个应用程序中工作而无需在任何地方进行更改,我可以接受您的回答。
【解决方案2】:

这发生在我使用 ma​​cOS 时,

我正在从 Windows 10 构建我的网站,并且工作正常。 使用 ma​​cOS 后,我不得不将变量更改为 10

希望你修复它。

【讨论】:

    【解决方案3】:

    解决该问题的方法是全局设置sql_mode = ''

    在您的数据库中运行此查询并检查它是否解决了问题:

    set GLOBAL sql_mode = "";
    

    你可以在这里阅读Server SQL Modes

    附:每次重新启动 mysql 服务器时都必须运行该查询。为了克服这个问题,您必须在 mysql 配置中进行设置,如果需要,您可以查看它。

    【讨论】:

    • 为我解决了这个问题!你能详细说明一下它到底做了什么吗?是不是跟MySQL如何解析命令有关?
    • 分享了该文档的链接供您参考
    【解决方案4】:

    您的字段类型是 tinyint(1)。所以它只支持 0-9 的值。更改为 varchar、text、char 等以接受真/假字符串。 但我强烈建议您使用 bool 数据类型。然后使用 0 或 1 作为真或假。为布尔运算编写字符串(真/假)值是没有意义的。使用 0 或 1 可以让你免于以后的很多麻烦。

    【讨论】:

    • 就我的研究而言,布尔值在 MySQL 内部表示为 tinyint(1)。我指的是this question
    • 这是错误的。 tinyint 始终支持 [-128,127] 或 [0,255] 无符号。括号中的数字是显示宽度,仅适用于 ZEROFILL,仅此而已。 tinyint(1) 的列将显示 1 和 ZEROFILL。 tinyint(2): 01, tinyint(3): 001 ...
    猜你喜欢
    • 2011-01-02
    • 1970-01-01
    • 1970-01-01
    • 2017-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-19
    • 1970-01-01
    相关资源
    最近更新 更多