我使用PHP中的PDO将值插入到我的MariaDB中.但是,当我违反非空约束时,什么都不会发生.我希望在这种情况下抛出一个例外.

这就是我创建表格的方式:

CREATE TABLE person (
    id INT auto_increment NOT NULL,
    firstname varchar(255) NULL,
    lastname varchar(255) NULL,
    telephone varchar(255) NULL,
    alias1 varchar(255) NOT NULL,
    alias2 varchar(255) NULL,
    CONSTRAINT PRIMARY KEY (id)
)
ENGINE=InnoDB
DEFAULT CHARSET=utf8mb4
COLLATE=utf8mb4_general_ci;

以下是我用于测试的PHP脚本:

<?php

$conn = new PDO(
    'mysql:host=localhost;dbname=tibsi-data', 'root', '',
    array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8")
);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$conn->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$conn->setAttribute(PDO::ATTR_STRINGIFY_FETCHES, false);

try {
    $stm = $conn->prepare("INSERT INTO person (firstname) VALUES (:firstname)");
    $stm->bindValue(':firstname', 'Mike');

    $success = $stm->execute();
    if (!$success) {
        throw new Exception($stm->errorInfo()[2]);
    }
    $stm->closeCursor();

    $insertId = $conn->lastInsertId();

    header('HTTP/1.1 200 OK');
    header('Content-Type: application/json; charset=utf-8');
    echo json_encode(array('id' => $insertId));
    exit;
} catch (Exception $e) {
    header('HTTP/1.1 500 Internal Server Error');
    header('Content-Type: application/json; charset=utf-8');
    echo json_encode(array('error' => $e->getMessage()));
    exit;
} catch (Error $e) {
    header('HTTP/1.1 500 Internal Server Error');
    header('Content-Type: application/json; charset=utf-8');
    echo json_encode(array('error' => $e->getMessage()));
    exit;
}

如您所见,alias1没有缺省值,我在INSERT语句中省略了它.当我try 使用SQL脚本执行相同的操作时,确实会出现错误. 我预计这会在PHP中抛出一个异常,导致500响应.相反,它使用表示alias1的空字符串插入行.我从未将此设置为默认设置. 有什么属性可以设置来获得我想要的行为吗?

推荐答案

https://mariadb.com/kb/en/null-values/

如果空值是单行插入到声明为NOT NULL的列中,则将返回错误.但是,如果SQL模式不是 如果空值为多行,则为Strong(直到MariaDB 10.2.3为止的默认设置 插入到声明为NOT NULL的列中,这是 将插入该列类型(而不是 表定义).隐式缺省值是的空字符串 字符串类型,数值、日期和时间类型为零值.

从MariaDB 10.2.4开始,默认情况下这两种情况都会导致错误.

如果sql_mode设置为严格模式,则适用最后一条语句.在MariaDB 10.2.4及更高版本中,严格模式默认设置为打开,但您可能已经在实例或会话级别更改了该选项.见https://mariadb.com/kb/en/sql-mode/

在查询客户端中判断您当前的sql_mode:

SELECT @@sql_mode;

我不确定为什么文档中特别提到了多行插入.如果插入单行且未启用严格模式,则会发生相同的情况.

Php相关问答推荐

谷歌云SQL / mysql谁是对的?

无法使用PHP DomDocument找到IMG元素

PHP Perl正则表达式—URL前面没有等号和可能的单引号或双引号

输入手写CSV时在PHP中进行日期判断

如何在Woocommerce中禁用机器人添加到推车?

Laravel:测试命令时无法获取工作通知::AssertSentTo

在冲突和几何上插入的Postgres参数化查询在PHP中不起作用

将一个情态形式放在细丝v3中的形式中间

使用DOMPDF获取PDF格式的本 map 像

在WooCommerce管理中为订单项目添加自定义字段价格值

将数据推入所有子数组条目

Golang - Html 模板:如何创建导航项 - 子菜单?我找不到怎么做

simplexml_load_file 和 simplexml_load_string 返回具有不同编码的相同数据

向元素添加类时添加循环错误

WooCommerce – 在新订单邮箱通知中显示产品分类计数

在 PHP 中验证签名

一个php应用程序可以实例化多个RNG吗

使用 PHP ImageMagick 库将 pdf 文件的前 n 页转换为单个 png 图像文件

从 d-m-Y 日期格式 laravel 计算月份 = 01 的列的总和

Google Drive - 仅使用 FileID 获取文件的 FileSize