我有输入字段,但如果用户将其留空,我希望在数据库中插入一个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
好的,首先这个
插入
table
(val1
、val2
、val3
)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转义。但这是一个无关的问题。)