Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php SQL验证!_Php_Mysql_Sql - Fatal编程技术网

Php SQL验证!

Php SQL验证!,php,mysql,sql,Php,Mysql,Sql,我是SQL新手,所以这可能是一个愚蠢的问题 我有一个PHP表单,它填充SQL表中的几个字段。我有以下代码: $sql="INSERT INTO $tbl_name (app_name, app_path, short_desc, full_desc) VALUES ('$_POST[app_name]', '$_POST[app_path]', '$_POST[short_desc]', '$_POST[full_desc]')"; 但是,即使app_name和app_path不是空列,如果表

我是SQL新手,所以这可能是一个愚蠢的问题

我有一个PHP表单,它填充SQL表中的几个字段。我有以下代码:

$sql="INSERT INTO $tbl_name
(app_name, app_path, short_desc, full_desc)
VALUES ('$_POST[app_name]', '$_POST[app_path]',
'$_POST[short_desc]', '$_POST[full_desc]')";
但是,即使app_name和app_path不是空列,如果表单中这些字段中没有文本,也可以执行查询

所以,我的问题是:

如果NOT NULL字段中没有文本,如何停止查询的执行?

if ($app_name != "" && $app_path != "")
    $sql="INSERT INTO $tbl_name (app_name, app_path, short_desc, full_desc) VALUES ('$_POST[app_name]', '$_POST[app_path]', '$_POST[short_desc]', '$_POST[full_desc]')";
else { /* do something */ }
用于在运行插入查询之前清理输入


用于在运行插入查询之前清理输入。

您可以在尝试执行查询之前测试值:

if (empty($_POST['app_path']))
{
    // Error.
}
还要注意,您的代码可能容易受到SQL注入攻击。您可以使用
mysql\u real\u escape\u string
来保护自己免受此攻击:

$sql= sprintf("INSERT INTO $tbl_name
               (app_name, app_path, short_desc, full_desc)
               VALUES ('%s', '%s', '%s', '%s')",
               mysql_real_escape_string($_POST['app_name']),
               mysql_real_escape_string($_POST['app_path']),
               mysql_real_escape_string($_POST['short_desc']),
               mysql_real_escape_string($_POST['app_full_desc']));

您可以在尝试执行查询之前测试这些值:

if (empty($_POST['app_path']))
{
    // Error.
}
还要注意,您的代码可能容易受到SQL注入攻击。您可以使用
mysql\u real\u escape\u string
来保护自己免受此攻击:

$sql= sprintf("INSERT INTO $tbl_name
               (app_name, app_path, short_desc, full_desc)
               VALUES ('%s', '%s', '%s', '%s')",
               mysql_real_escape_string($_POST['app_name']),
               mysql_real_escape_string($_POST['app_path']),
               mysql_real_escape_string($_POST['short_desc']),
               mysql_real_escape_string($_POST['app_full_desc']));

顺便说一句,空字符串和NULL不是一回事


并在执行查询之前验证变量。

顺便说一句,空字符串和NULL不是一回事


并在执行查询之前验证变量。

请不要这样做,您正在使用编写代码。你也在让编程精灵死去


调查。在此之后,请按照此处其他答案中的建议,首先检查值。

请不要这样做,您正在使用编写代码。你也在让编程精灵死去


调查。之后,请参考此处其他答案中的建议,首先检查值。

它们可能是空白/空字符串,空字符串与NULL不同


但是这里有更大的问题,您的代码容易受到SQL注入的攻击,它们可能是空白/空字符串,空字符串与NULL不同


但是这里有更大的问题,您的代码容易受到SQL注入的影响,空字符串不是空的,所以即使插入了空字符串,也不会发生什么不好的事情。然而,如果你真的想放弃,那么和@Jan的解决方案一样,但是我不能放弃,因为他没有纠正你关于和的一个非常重要的问题


更新现在他做到了:)不管怎样,看到了吗?问一个问题,让大家回答另一个更有价值的问题!:)

空字符串不是
null
,因此即使插入了该字符串,也不会发生任何不好的情况。然而,如果你真的想放弃,那么和@Jan的解决方案一样,但是我不能放弃,因为他没有纠正你关于和的一个非常重要的问题



更新现在他做到了:)不管怎样,看到了吗?问一个问题,让大家回答另一个更有价值的问题!:)

哦,看看SQL注入。您不应该在查询中直接使用$\u POST变量,因为这会使您面临SQL注入攻击。你可能想在谷歌上搜索“预先准备好的语句”和“参数化查询”。我建议你去看看拉威尔哦,看看SQL注入。您不应该在查询中直接使用$\u POST变量,因为这会使您面临SQL注入攻击。你可能想在谷歌上搜索“预先准备好的语句”和“参数化查询”。我建议你去看看拉威尔这参数化查询是目前的现状,手工构造查询字符串是过去的事了。别担心。此表格仅供管理员使用。但是登录表单是安全的。无论如何,谢谢。@Filip:考虑到如果你在描述字段中键入一个撇号,它将被破坏,我想说这至少对管理员来说也是一个麻烦。此外,这也不是让事情不安全的借口。最好始终坚持正确的做事方式,这样在真正需要的时候你就不会忘记。”此表格仅供管理员使用“=>我不记得在哪里读过,所以随你的便,但似乎以这种方式删除的真实公司数据中约有80%是有效的、已登录的,可能是不满的员工。不要信任登录的用户。也许连你自己都不行:P+1@Wrikken。我讨厌人们说“它只供内部用户使用”之类的话。我也厌倦了处理与这些问题完全相同的供应商软件。有时候,我觉得应该有法律规定销售软件时忽略了安全方面的最佳实践。参数化查询是目前的现状,手工构造查询字符串是过去的事了。别担心。此表格仅供管理员使用。但是登录表单是安全的。无论如何,谢谢。@Filip:考虑到如果你在描述字段中键入一个撇号,它将被破坏,我想说这至少对管理员来说也是一个麻烦。此外,这也不是让事情不安全的借口。最好始终坚持正确的做事方式,这样在真正需要的时候你就不会忘记。”此表格仅供管理员使用“=>我不记得在哪里读过,所以随你的便,但似乎以这种方式删除的真实公司数据中约有80%是有效的、已登录的,可能是不满的员工。不要信任登录的用户。也许连你自己都不行:P+1@Wrikken。我讨厌人们说“它只供内部用户使用”之类的话。我也厌倦了处理与这些问题完全相同的供应商软件。有时我觉得应该有法律规定销售软件时忽略了安全方面的最佳实践。$\u POST[app\u path]会至少发出一个E\u通知,因为您忘记引用app\u path,如果没有定义值,可能还会发出另一个E\u通知。你应该做的是
空($\u POST[“app\u path”])
@Matti Virkkunen:太好了!我很惊讶这里还没有其他人建议这样做。看看访问_POST/_GET等的方法,但一定要指定一个过滤器-默认值不会过滤