【问题标题】:MySQL insert NULL value after getting value with $_REQUESTMySQL 在使用 $_REQUEST 获取值后插入 NULL 值
【发布时间】:2012-03-23 11:14:23
【问题描述】:

我有输入字段,但如果用户将其留空,我想在我的数据库中插入一个空值。

我要求这样的值:

$val1 = htmlspecialchars($_REQUEST["val"], ENT_QUOTES);

然后将它们插入数据库:

INSERT INTO `table` ( `val1` , `val2` , `val3`) 
VALUES ('$val1', '$val2', '$val3');

我已尝试删除 ' 周围的 val1、val2、val3 - 但如果没有值,则不会将任何内容插入数据库。我也尝试过这样的事情:

if (!empty($val1)) {
$val1 = "'".$val1."'";
} else {
$val1 = NULL;}

然后在值周围没有 ' - 仍然没有插入数据库

【问题讨论】:

    标签: php mysql sql null


    【解决方案1】:

    好的,首先这个

    插入table ( val1 , val2 , val3) 值('val1'、'val2'、'val3');

    只会插入文字值“val1”、“val2”和“val3”。您没有使用任何 PHP 变量。

    其次,使用准备好的语句和参数绑定来执行查询,以保护自己免受 SQL 注入。例如,使用 PDO

    $pdo = new PDO(/* DSN, username and password, just read the docs */);
    
    $stmt = $pdo->prepare('INSERT INTO table (val1, val2, val3) VALUES (?, ?, ?)');
    
    $params = array(
        isset($_REQUEST['val1']) ? $_REQUEST['val1'] : null,
        isset($_REQUEST['val2']) ? $_REQUEST['val2'] : null,
        isset($_REQUEST['val3']) ? $_REQUEST['val3'] : null
    );
    
    $stmt->execute($params);
    

    另外,您不应该对进入数据库的值进行 HTML 编码。在 HTML 文档中显示值时执行编码。

    【讨论】:

    • 加用于 PDO。绝对要使用 DB 处理程序,因为 PDO 将涵盖大量您可能不想一遍又一遍地手动写出的内容。
    • 希望我可以 +2 使用 PDO 而不是 mysql_* 函数。太多人认为使用那些过时的功能仍然合适。
    • @Phil 我刚刚试过这个,它不会插入 NULL 值。如果在 字段中没有输入任何内容,它会插入空格。
    【解决方案2】:

    如果我理解正确,你的意思是这样的:

    $val1 = null;
    $val2 = null;
    $val3 = null;
    
    if(isset($_REQUEST['val1']))
        $val1 = "'".mysql_real_escape_string(htmlspecialchars($_REQUEST["val1"], ENT_QUOTES, 'utf-8'))."'";
    
    if(isset($_REQUEST['val2']))
        $val2 = "'".mysql_real_escape_string(htmlspecialchars($_REQUEST["val2"], ENT_QUOTES, 'utf-8'))."'";
    
    
    if(isset($_REQUEST['val3']))
        $val3 = "'".mysql_real_escape_string(htmlspecialchars($_REQUEST["val3"], ENT_QUOTES, 'utf-8'))."'";
    
    
    mysql_query("INSERT INTO `table` ( `val1`, `val2`, `val3`) 
    VALUES ($val1, $val2, $val3)");
    

    我的意思是这样的东西是应该得到更多保护的东西的简化版本。你只是在寻找如何传递一个空值,所以你可以从这里获取它。

    【讨论】:

    • 在这种情况下您应该提出更好的解决方案
    • +1 用于 SQL 注入方面。我唯一感兴趣的是初始 null 值是否需要为 $val1 = 'NULL' 以便在稍后编译 SQL 查询时将它们作为字符串(但不是字符串中的字符串)处理。我在这里测试了它,回显了 SQL,它们只是作为空字符串处理——不是 OP 想要的。
    • mysql_* 函数已经过时,不应该被推荐!
    • @webbiedave - 你在开玩笑吗?那么爬遍整个网站,对接80%的数据库相关的php问题呢?盖伊询问空值而不是数据库标准。是的,我同意 PDO 更好,但我不希望有人提出这样的问题来理解它。现在他有一个与 PDO 相关的答案,但如果他只想要一些有用的东西而不关心现代化,那么 mysql_query 仍然可以工作。还不如告诉他改用python。说真的,所有这些都在一个基本的答案上。
    • @Kai Qing:我没有看到你所指的所有 heat(哎呀,我什至没有投反对票)。使用mysql_* 的答案通常会这样做,因为提问者首先使用它们。即便如此,他们通常仍会建议在答案中的某处切换到 PDO。在这种情况下,没有使用任何 DB 函数,那么为什么要提出一种不受欢迎的过时方法呢?然而,我留下评论的主要原因是希望其他读者能看到它并避免使用这些功能。我看不出有什么问题。
    【解决方案3】:

    在数据库插入/查询中使用用户提交的值时务必小心 - 请参阅 http://bobby-tables.com/

    <?php
    
    $val1 = 'NULL';
    $val2 = 'NULL';
    $val3 = 'NULL';
    
    if( isset( $_REQUEST['val1'] ) && !empty( $_REQUEST['val1'] ) )
        $val1 = "'".mysql_real_escape_string( $_REQUEST['val1'] )."'";
    
    if( isset( $_REQUEST['val2'] ) && !empty( $_REQUEST['val2'] ) )
        $val1 = "'".mysql_real_escape_string( $_REQUEST['val2'] )."'";
    
    if( isset( $_REQUEST['val3'] ) && !empty( $_REQUEST['val3'] ) )
        $val1 = "'".mysql_real_escape_string( $_REQUEST['val3'] )."'";
    
    
    mysql_query("INSERT INTO `table` ( `val1`, `val2`, `val3`) 
    VALUES ($val1, $val2, $val3)");
    

    (我承认 PDO 的说法,但是,如果这个用户和大多数 PHP 社区的人一样,目前正在使用 mysql_* 函数,那么我有什么资格要求他们不这样做呢?)

    【讨论】:

    • OP 没有说明他正在使用什么。那么,为什么要提出一种过时的、不受欢迎的方法呢?你接下来会推荐魔术语录吗? ;)
    • @Lucanos 查看编辑历史,没有提到任何数据库扩展 &lt;/pedantic_rant&gt;
    【解决方案4】:

    您的基本问题是要将null 插入MySQL,您必须使用SQL 常量NULL。引用它是行不通的。这意味着您必须在 SQL 语句中将 '$val1' 替换为 NULL

    这个小问题是准备好的语句为您处理的东西,任何体面的 ORM 层也一样。

    (您通常也不需要在将值放入数据库之前对值进行 HTML 转义。但这是一个不相关的问题。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-28
      • 2019-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多