Php MySQL-如何插入可能为空的值

Php MySQL-如何插入可能为空的值,php,mysql,insert,null,Php,Mysql,Insert,Null,我在PHP脚本中有一些值,必须插入MySQL表中。这里是例如3个日期d1、d2和d3 我使用默认语句将值插入数据库: insert into mytable set a=1, b=2, d1='$val', d2='$val2', d3='$val3' 如果$val1、$val2和$val3中的一个或多个为nil,是否有一种非常简单的方法可以将SQL语句插入d1、d2和d3空值而不是日期?不必处理新的PHP变量?可能有更好的方法可以做到这一点,但如果所有其他方法都失败,您可以使用每个值来实现这

我在PHP脚本中有一些值,必须插入MySQL表中。这里是例如3个日期d1、d2和d3

我使用默认语句将值插入数据库:

insert into mytable set a=1, b=2, d1='$val', d2='$val2', d3='$val3'

如果$val1、$val2和$val3中的一个或多个为nil,是否有一种非常简单的方法可以将SQL语句插入d1、d2和d3空值而不是日期?不必处理新的PHP变量?

可能有更好的方法可以做到这一点,但如果所有其他方法都失败,您可以使用每个值来实现这一点:

$val = isset($val) ? "'$val'" : "NULL";
然后将PHP查询字符串更改为:

insert into mytable set a=1, b=2, d1=$val, d2=$val2, d3=$val3

你应该考虑使用,而不是建立这样的查询字符串,特别是如果变量中包含了用户输入。

可能有更好的方法来做这件事,但是如果所有其他的都失败了,你可以用你的每一个值来做:

$val = isset($val) ? "'$val'" : "NULL";
然后将PHP查询字符串更改为:

insert into mytable set a=1, b=2, d1=$val, d2=$val2, d3=$val3

你应该考虑使用,而不是建立这样的查询字符串,特别是如果变量中包含了用户输入。

最简单的事情是定义

function esc_null($src) {
    return $src === null ? 'NULL' : ("'" + mysql_real_string_escape($src) + "'");
}

"insert into mytable set a=1, b=2, d1=" . esc_null($val) . ", d2=" . esc_null($val2) . ", d3=" . esc_null($val3)

这也确保了查询的完整性。

最简单的方法是定义

function esc_null($src) {
    return $src === null ? 'NULL' : ("'" + mysql_real_string_escape($src) + "'");
}

"insert into mytable set a=1, b=2, d1=" . esc_null($val) . ", d2=" . esc_null($val2) . ", d3=" . esc_null($val3)

这也确保了查询的完整性。

假设所有查询都在$data数组中:

如果数组中的值不存在或等于NULL,则字符串将包含例如d2=NULL而不是d2='xyz'

您还必须确保要粘贴到查询中的字符串已正确清理,例如使用。我的答案将变量视为已经准备好并经过清理的变量,因为您只想知道如何插入空值,而不是您已有的变量


因为问题只是基于变量的值在查询中输入空值,所以我不认为在这里详细讨论清理是个好主意。您可以在这里找到更多关于SQL注入以及如何在PHP中防止SQL注入的详细信息:。祝你好运

假设您拥有$data数组中的所有内容:

如果数组中的值不存在或等于NULL,则字符串将包含例如d2=NULL而不是d2='xyz'

您还必须确保要粘贴到查询中的字符串已正确清理,例如使用。我的答案将变量视为已经准备好并经过清理的变量,因为您只想知道如何插入空值,而不是您已有的变量


因为问题只是基于变量的值在查询中输入空值,所以我不认为在这里详细讨论清理是个好主意。您可以在这里找到更多关于SQL注入以及如何在PHP中防止SQL注入的详细信息:。祝你好运

我发现这是做我想做的事情最简单的方法:

INSERT INTO mytable SET a=1, b=2, d1=IF('$val' = '', NULL, '$val');

我发现这是做我想做的事情最简单的方式:

INSERT INTO mytable SET a=1, b=2, d1=IF('$val' = '', NULL, '$val');

奥利弗在尝试编程之前,请阅读手册。谢谢。我会考虑的。。。有一天。事实上,我不是php新手,但我没有时间在每次发布新版本的php时阅读完整的文档。我用PHP3.0开发了一个网站,它可以运行,我只是想维护它,而不是从头重写它来实现一个非常酷的额外功能,我现在不需要它。在尝试编程之前,请阅读手册。谢谢。我会考虑的。。。有一天。事实上,我不是php新手,但我没有时间在每次发布新版本的php时阅读完整的文档。我用PHP3.0开发了一个网站,它可以运行,我只是想维护它,而不是从头重写它来实现一个非常酷的额外功能,我现在不需要这个功能。您的解决方案确保如果$val等于nil,那么将在查询中插入以下字符串:d1='NULL'。如果您没有发现差异:这是一个4个字母的字符串NULL,而不是实际的NULL值。-1表示参数注入问题。也为零。PHP使用null。@Kenaniah:好的,但经过一些编辑,这可能是一个很好的答案。@Oliver:当然可以,但当$val等等于null.Oops时,它应该插入null而不是'null'。我现在改了,希望是正确的。我已经想到了这件事。但是,@Kenaniah、AFAICT nil和“NULL”而不是NULL是唯一的问题。哪里有/曾经有参数注入问题?我对所有变量都进行了mysql\u real\u逃逸,这就是我的观点。哪里可以注入内容?您的解决方案确保如果$val等于nil,那么将在查询中插入以下字符串:d1='NULL'。如果您没有发现差异:这是一个4个字母的字符串NULL,而不是实际的NULL值。-1表示参数注入问题。也为零。PHP使用null。@Kenaniah:好的,但经过一些编辑,这可能是一个很好的答案。@Oliver:当然可以,但当$val等等于null.Oops时,它应该插入null而不是'null'。我现在改了,希望是正确的
T我已经想到了这件事。但是,@Kenaniah、AFAICT nil和“NULL”而不是NULL是唯一的问题。哪里有/曾经有参数注入问题?我对所有变量都进行了mysql\u real\u逃逸,这就是我的观点。哪里可以注入一些东西?@Kenaniah:你在说什么参数注入?向未来的读者解释你自己。如果您谈论的是SQL注入,那么我相信您的否决票是基于数据未转义的假设。我没有做出这样的假设——我回答了OP的问题。$data[$x]没有正确转义以处理引用问题。例如,如果$data['val1']包含一个,您的查询将不再正常运行,然后将受到恶意注入攻击。@Kenaniah:正如我所说,您否决了我的答案,因为我没有逃逸数据,即使您没有理由相信数据未经清理!如果OP示例中的$val1、$val2和$val3都是整数或NULL呢?你要杀了我。我回答了这个问题,并没有假设它是用户提供的数据。@Kenaniah:有没有看到过不必要的双重转义数据?这个问题很精确,但我会在答案中加入适当的信息。但正如OP所说,这个应用程序已经存在,无论他做了什么来清理数据都是他关心的问题。由于你的假设,你否决了正确答案。最糟糕的是,这不是因为答案不正确,而是因为它没有执行你认为应该做的事情;干杯@Kenaniah:我没有说要用@Kenaniah打开脚本,你在说什么参数注入?向未来的读者解释你自己。如果您谈论的是SQL注入,那么我相信您的否决票是基于数据未转义的假设。我没有做出这样的假设——我回答了OP的问题。$data[$x]没有正确转义以处理引用问题。例如,如果$data['val1']包含一个,您的查询将不再正常运行,然后将受到恶意注入攻击。@Kenaniah:正如我所说,您否决了我的答案,因为我没有逃逸数据,即使您没有理由相信数据未经清理!如果OP示例中的$val1、$val2和$val3都是整数或NULL呢?你要杀了我。我回答了这个问题,并没有假设它是用户提供的数据。@Kenaniah:有没有看到过不必要的双重转义数据?这个问题很精确,但我会在答案中加入适当的信息。但正如OP所说,这个应用程序已经存在,无论他做了什么来清理数据都是他关心的问题。由于你的假设,你否决了正确答案。最糟糕的是,这不是因为答案不正确,而是因为它没有执行你认为应该做的事情;干杯@基南尼亚:我没有说任何关于打开脚本的事