如何从PHP变量向MySQL插入空值,避免SQL注入?

如何从PHP变量向MySQL插入空值,避免SQL注入?,php,mysql,null,Php,Mysql,Null,我有一个歌曲上传表单,在这里我不会直接在MySQL中输入NULL值,比如:MySQL_query(“插入到歌曲(专辑id)值(NULL)”。我会将NULL从PHP变量插入MySQL,并且肯定不会受到SQL注入的影响 我的SQL表是: CREATE TABLE IF NOT EXISTS `songs` ( `song_id` int(4) NOT NULL, `song_name` varchar(64) NOT NULL, `artist_id` int(4) NOT NULL,

我有一个歌曲上传表单,在这里我不会直接在MySQL中输入NULL值,比如:MySQL_query(“插入到<代码>歌曲<代码>(<代码>专辑id<代码>)值(NULL)”。我会将NULL从PHP变量插入MySQL,并且肯定不会受到SQL注入的影响

我的SQL表是:

CREATE TABLE IF NOT EXISTS `songs` (
  `song_id` int(4) NOT NULL,
  `song_name` varchar(64) NOT NULL,
  `artist_id` int(4) NOT NULL,
  `album_id` int(4) DEFAULT NULL,
  `genre_id` int(4) DEFAULT NULL
  PRIMARY KEY (`song_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
我的表单和表单处理程序代码如下(PHP、HTML):

<?php

if(isset($_REQUEST['SongForm']))
{
$song_name = trim($_POST['song_name']);
$artist_id = trim($_POST['artist_id']);
$album_id = $_POST['album_id']; if($album_id == 0) { $album_id = 'NULL'; } // I even tried using NULL instead of 'NULL'
$genre_id = $_POST['genre_id']; if($genre_id == 0) { $genre_id = 'NULL'; }

$query = mysql_query("
INSERT INTO `songs` (`song_name`, `artist_id`, `album_id`, `genre_id`) 
VALUES ('".$song_name."', '".$artist_id."', '".$album_id."', '".$genre_id."')
");
}

?>

<form method="post" action="<?php echo $_SERVER['PHP_SELF']?>" name="SongForm" id="SongForm">
<table style="width: 100%">
<tr>
<td><b>Song Name</b></td>
<td><input name="song_name" value="" type="text" required /></td>
</tr>
<tr>
<td><b>Artist Name</b></td>
<td>
<select id="artist_id" name="artist_id">
<option value ="0">No Artist</option>
<option value ="1">Jennifer Lopez</option>
</select>
</td>
</tr>
<tr>
<td><b>Album Name</b></td>
<td>
<select id="album_id" name="album_id">
<option value ="0">No Album</option>
<option value ="1">Rebirth</option>
</select>
</td>
</tr>
<tr>
<td><b>Genre Name</b></td>
<td>
<select id="genre_id" name="genre_id">
<option value ="0">No Genre</option>
<option value ="1">Epic Records</option>
</select>
</td>
</tr>
<tr>
<td><b>&nbsp;</td></b>
<td><input name="SongForm" type="submit" value="Upload Song" /></td>
</tr>
</table>
</form>

在代码中,检查变量是否为空,如果为空,请使用
NULL
代替变量。 要将
NULL
传递给
MySQL
,请尝试

INSERT INTO table (field,field2) VALUES (NULL,3)
使用
if($album\u id==0){$album\u id=NULL;}
代替
if($album\u id==0){$album\u id==NULL;}

"NULL" is a string.
删除引号并将$album_id==“NULL”中的==(检查相等)更改为=(为变量赋值)


编辑当前问题:

让我们假设
$album\u id=='NULL'
$genre\u id=='NULL'
$artist\u id==1
$song\u name=='deep'

此查询(您的查询):

将为您提供:

"INSERT INTO `songs` (`song_name`, `artist_id`, `album_id`, `genre_id`) 
 VALUES ('deeper', '1', 'NULL', 'NULL')"
"INSERT INTO `songs` (`song_name`, `artist_id`, `album_id`, `genre_id`) 
 VALUES ('deeper', 1, NULL, NULL)"
这不是您想要的。请去掉整数和空值周围的斜杠。此查询:

"INSERT INTO `songs` (`song_name`, `artist_id`, `album_id`, `genre_id`) 
 VALUES ('$song_name', $artist_id, $album_id, $genre_id)"
将为您提供:

"INSERT INTO `songs` (`song_name`, `artist_id`, `album_id`, `genre_id`) 
 VALUES ('deeper', '1', 'NULL', 'NULL')"
"INSERT INTO `songs` (`song_name`, `artist_id`, `album_id`, `genre_id`) 
 VALUES ('deeper', 1, NULL, NULL)"
这就是你想要的


要避免sql注入,请再做一点更改:

// do not use addslashes when your server uses magic_quotes (probably it does not)
$song_name = addslashes(trim($_POST['song_name']));
// if there is number, it will stay unchanged
// otherwise it is changed to 0, which is safe
$artist_id = $_POST['artist_id'] + 0;
$album_id = $_POST['album_id'] + 0; if($album_id == 0) { $album_id = 'NULL'; }
$genre_id = $_POST['genre_id'] + 0; if($genre_id == 0) { $genre_id = 'NULL'; }
如果要确保脚本在magic_引号上独立正常工作,请定义此函数:

function gpc_addslashes($str) {
    return (get_magic_quotes_gpc() ? $str : addslashes($str));
}

然后用它来代替歌曲名。

我尝试了与您相同的方法-将变量设置为NULL、NULL、'NULL'、“NULL”,甚至将NULL作为常量写入SQL字符串中-无。数据库中的字段始终设置为0。然后我尝试在插入行后更新表,结果成功

"UPDATE songs SET album_id = NULL WHERE etc."
如果指定了列,则INSERT语句将插入0。您可以修改SQL语句,使其不包含要为NULL的列,例如:

$query = mysql_query("
INSERT INTO `songs` (`song_name`,`artist_id`) VALUES ('".$song_name."','".$artist_id."')
");
这将使剩下的列为空


跳到只在指定列中插入数据

这样您就有了默认Null,您能解释一下为什么要再次插入Null吗?因为默认Null速度很慢,只有我的2个世纪,因为“默认Null”mysql\u query()在我发送空$phpVariable(“”或“”)时应该存储Null。但它没有在mysql行中存储Null。它正在存储0(零).这是主要问题。现在有人能帮我吗?对不起!这实际上不是我问题的答案。我想从PHP变量在MySQL中存储NULL(该变量将为NULL)在您的代码中,检查您的变量是否为空,如果为空,请使用NULL而不是variableActually from下拉列表,当用户选择值“0”时,我使用if-ELSE语句检查它,当它为“0”时我将$variable=NULL。然后我将$variable存储在MySQL中。在不同的情况下,艺术家/流派/专辑中的任何一个都可能是空的。因此我必须在MySQL_query()中使用$phpVariable。所以,我不能用任何PHP大小写检查它。如果这只是一个列的问题,那么我可以这样做。希望你已经理解。当我没有选择“album_id”(因此歌曲不属于任何专辑)时,它应该存储空值。但是当我添加新歌时,“album_id”被保存为“0”。抱歉!我尝试了,空值,空值,“空值”,“空值”所有内容。但MySQL中没有任何内容存储空值。它存储0。顺便说一句,它是InnoDB引擎。不是MyISAM。但我不认为这会是一个问题……我希望它对您有意义,并且您会让它工作。我已经提供了很多信息,因为您的代码中有很多奇怪的东西。:-)谢谢@Lukas Z。,你能再检查一下这篇文章吗?我已经正确地(我相信)重新提交了这个问题。事实上,我需要一个快速的解决方案。尝试了很长时间,但没有得到解决方案。请去掉查询中的撇号(但保留$album_id='NULL'),因为这样在查询中是'NULL'而不是NULL。而不是…“$artist_id.”。。。仅使用….$artist_id.“。。。您已经提供了$query2和$query1,我说要使用$query1的查询,在您编辑的帖子中,您已经在您的原始帖子中使用了带有$query2的查询。我将编辑答案以匹配您当前的版本。好的,不,您的答案非常简单,如果我没有犯任何错误,您只需复制粘贴即可。附言:有些不相关的话题实际上相当关键;-)事实上,我没有指给你看。有人说在mysql_query()中输入NULL。我是对他/她说的。对不起,如果我伤害了你。不过,我有另一个解决办法$query2=mysql\u query(“更新
songs
SET
album\u id
=NULL,
genre\u id
=NULL,
film\u id
=NULL,其中
song\u name
=“$song\u name.”。。。我在$query之后运行这个查询,然后输入NULL。