【问题标题】:Insert empty value using Bindparam without error Incorrect Integer value使用 Bindparam 插入空值而不出错 Incorrect Integer value
【发布时间】:2017-03-05 09:47:58
【问题描述】:

我想使用 PDO 向 MySql 表中插入一些数据。如果它不为空,它将具有整数数据类型,因此我使用 PDO::PARAM_INT,但问题是此数据不是必需的,因此有时它是空的。

这让我有一个错误:

PDOException:SQLSTATE[HY000]:一般错误:1366 整数值不正确。

那么,当它有空值时,我是否可以将这个空值变量传递到我的数据库中而不会出错?这是我的代码 sn-p:

$stmt = $db->prepare("INSERT INTO table (column) VALUES (:column)");
$stmt->bindParam(':column',$_POST['value'], PDO::PARAM_INT);
$stmt->execute();

【问题讨论】:

    标签: php mysql pdo bindparam


    【解决方案1】:

    一个空的string 是不正确的integer 值都一样。虽然过去是允许的,但现在 MySQL 对类型的要求更加严格,默认强制执行 STRICT MODE,因此不再接受整数字段的空字符串。

    此外,PDO::PARAM_INT 不会转换您的值。

    因此,您必须手动投射它们

    如果您想保留可能的 NULL 值,请像这样转换您的输入

    $value = is_null($_POST['value']) ? null : (int)$_POST['value'];
    

    如果你只想无条件地转换成整数,那就做吧

    $value = (int)$_POST['value'];
    

    两个 sn-ps 都会将一个空字符串转换为 0,这将被 MySQL 欣然接受

    【讨论】:

    • 所以在这种情况下不能使用 Bindparam 吗?
    • 很好,但我可以知道为什么 bindparam 是丑陋和无用的吗?消毒比使用 bindparam 更方便吗?还是有比这更省钱的方法?
    • NULL 和 null 之间没有区别,所以我不知道如何解决它
    • 也将 null 转换为 int ,将 0 存储在 db 中,不会将字段设置为 NULL
    【解决方案2】:

    在我的情况下,我是这样使用的:

    if(empty($_POST['value'])){ $value = NULL; } else { $value = $_POST['value']; }
    $stmt->bindParam(':column', $value);
    

    它最适合我,从你身边尝试:-)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-27
      • 1970-01-01
      • 2018-12-13
      • 1970-01-01
      • 1970-01-01
      • 2011-06-10
      • 1970-01-01
      • 2021-02-09
      相关资源
      最近更新 更多