MySQL在使用$_REQUEST获取值后插入NULL值


MySQL insert NULL value after getting value with $_REQUEST

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

我请求这样的值:

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

然后将它们插入DB:

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

我已经尝试删除'around val1,val2,val3,但如果没有值,就不会在DB中插入任何内容。我也尝试过这样的东西:

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

然后没有"绕过值"-仍然没有插入到DB

好的,首先这个

插入tableval1val2val3)VALUES("val1"、"val2"、"val3");

将只插入文字值"val1"、"val2"answers"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文档中显示值时执行编码。

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

$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)");

我真正的意思是,这是一个应该得到更多保护的简化版本。你只是在寻找如何传递一个null值,所以你可以从这里开始。

在数据库插入/查询中使用用户提交的值时要始终小心-请参阅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_*函数,那么我是谁?)

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

这个小gotcha是准备好的语句为您处理的,任何像样的ORM层也是如此。

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