繁体   English   中英

如何使用 PHP/MySQLi 将 NULL 放入 MySQL 整数列?

[英]How do I get NULL into a MySQL integer column with PHP/MySQLi?

我通过 URL 将值传递到 PHP 页面,并在 MySQLi 查询中使用它们。 问题是对于整数列,空字符串被转换为零,而实际上它需要为 NULL。

如何使用 PHP/MySQLi 从 URL 中传递的参数将 NULL 放入整数列中?

更新:这是我如何使用传入参数和准备好的语句进行插入的示例。 我需要在数据库上为 NULL 的是 $specialtyType。

function InsertItem($itemID, $ownerID, $specialtyType)
{
    $this->insertItemStmt->bind_param("ssi", $itemID, $ownerID, $specialtyType);
    $this->insertItemStmt->execute();

如果我在 bind_param 之前添加 Jason 的建议行(设置一个中间变量并在 bind_param 中使用它而不是 $specialty_type),它会在 execute() 之后包含 0。

$int_value = empty($_GET['int_value']) ? NULL : (int)$_GET['int_value'];

$int_value用于INSERT的列。

问题不是如何通过 mysqli 向 MySQL 发送 NULL,而是如何从 GET 参数中获取 NULL 值。

我会建议两种方法。 要么使用filter_input()这是一个非常方便的函数,要么在 URL 查询中没有传递任何值时提供 null 作为默认值。

$id = filter_input(INPUT_GET, 'id', FILTER_VALIDATE_INT, FILTER_NULL_ON_FAILURE);
// or
$id = empty($_GET['id']) ? null : (int) $_GET['id'];

// If no value was presented in GET then $id will be passed as NULL
$stmt->bind_param('s', $id);

在我看来filter_input()提供了更正确的结果。 看这个比较:

| $_GET['id']   | filter_input | Cast to int |
|---------------|--------------|-------------|
| Inexistent    | false        | NULL        |
|               | NULL         | NULL        |
| <white space> | NULL         | 0           |
| 0             | 0            | NULL        |
| 42            | 42           | 42          |
| 42.333        | NULL         | 42          |

我遇到了这个问题,只是将相关的数据库列从 INT 更改为 VARCHAR。 空值现在存储为 NULL,0 是 0。即使在 PHP MyAdmin 中删除 0 也会看到“0”弹出,所以我猜 INT 将空等同于零而 VARCHAR 则不然。

通常,您可以从PHP向mySQL添加常规值,如下所示:

function addValues($val1, $val2) {
    db_open(); // just some code ot open the DB 
    $query = "INSERT INTO uradmonitor (db_value1, db_value2) VALUES ('$val1', '$val2')";
    $result = mysql_query($query);
    db_close(); // just some code to close the DB
}

当您的值为空/ null($ val1 ==“”或$ val1 == NULL),并且您希望将NULL添加到SQL而不是0或空字符串时,请执行以下操作:

function addValues($val1, $val2) {
    db_open(); // just some code ot open the DB 
    $query = "INSERT INTO uradmonitor (db_value1, db_value2) VALUES (".
        (($val1=='')?"NULL":("'".$val1."'")) . ", ".
        (($val2=='')?"NULL":("'".$val2."'")) . 
        ")";
    $result = mysql_query($query);
    db_close(); // just some code to close the DB
}

请注意,null必须添加为“NULL”而不是“'NULL'”。 必须将非空值添加为“'”。$ val1。“'”等。

希望这有帮助,我只需要将它用于一些硬件数据记录器,其中一些收集温度和辐射,另一些只收集辐射。 对于没有温度传感器的人,我需要NULL而不是0,原因很明显(0也是可接受的温度值)。 然后使用这些数据绘制一些图表,可在此处获得

您可能想要查看您的数据库架构以查看相关列是否甚至允许空值。 如果该列不允许空值,那么当您尝试输入空值时,它将使用该字段的默认值……对于整数字段通常为零。

对于 MySQLi,您不能将像 NULL 或 0 甚至“NULL”这样的常量作为 bind_param() 参数传递。

传递的所有内容都必须是引用类型。 这是一个愚蠢的限制,我知道。

但解决它很容易。 只需创建一个一次性变量即可。 在我一直从事的一个项目中,我需要向 BLOB 字段插入一些数据。 不幸的是,MySQLi 不允许您绑定超过一定长度的二进制数据。 您必须绑定NULL,然后通过send_long_data()发送二进制信息。

但是,同样,你不能绑定像 NULL 这样的常量,所以在这个例子中,看看我在哪里使用了变量$Dummy

$InfoToInsert = array
(
    'a number' => 9000,
    'a double' => 9000.0,
    'a string' => 'Hello World',
    'a blob' => gzdeflate('Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed')
);
$Stmnt =
(
    'INSERT INTO _mytable '.
        '(_myintcol, _mydoublecol _mystringcol, _myblobcol) '.
    'VALUES '.
        '(?, ?, ?, ?)'
);
if(!$PreparedStmnt = $Conn->prepare($Stmnt))
{
    $OutputError = 'Failure preparing statement: '.my_SanitizeHtml($Conn->error).'<br /><br />Full query:<br />'.$Stmnt;
    $Conn->rollback();
    $Conn->close();
    return(false);
}
$Dummy = null;
$PreparedStmnt->bind_param
(
    'idsb',                         // Possible types:
                                    //     i for Integer
                                    //     d for Double
                                    //     s for String
                                    //     b for BLOB

    $InfoToInsert['a number'],      // _myintcol
    $InfoToInsert['a double'],      // _mydoublecol
    $InfoToInsert['a string'],      // _mystringcol
    $Dummy                          // _myblobcol
);
$PreparedStmnt->send_long_data(3, $InfoToInsert['a blob']); // 3 because it's the 4th parameter (-1 for zero-based)
if(!$PreparedStmnt->execute())
{
    $OutputError = 'Failure inserting report: '.my_SanitizeHtml($Conn->error);
    $PreparedStmnt->close();
    $Conn->rollback();
    $Conn->close();
    return(false);
}
$PreparedStmnt->close();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM